需要帮助理解为什么在 OpenGL 中没有任何东西被绘制到屏幕上,过剩
Need help understanding why nothing is drawing to screen in OpenGL, glut
任何人都可以解释发生了什么或没有发生什么,以便我可以更正它。到目前为止,这是来自 .cpp 文件的代码。 运行 在 Visual Studio 社区 2015 年。
#include <windows.h>
#include <gl/GL.h>
#include <gl/glu.h>
#include <gl/glut.h>
#include <math.h>
#define M_PI 3.14159265358979323846
const int screenWidth = 640;
const int screenHeight = 480;
此处aa
、bb
、cc
、dd
用于将世界坐标映射到屏幕坐标。我把它们打印出来以确保它工作正常并且坐标计算正确。在这种情况下 0 < 半径 <= 5.
void drawHex(GLdouble radius, GLdouble aa, GLdouble bb, GLdouble cc, GLdouble dd) {
glBegin(GL_POLYGON);
for (int i = 0; i < 6; i++) {
glVertex2d(((cos(i / 6.0 * 2 * M_PI) * radius) * aa) + cc,
((sin(i / 6.0 * 2 * M_PI) * radius) * bb) + dd);
}
glEnd();
glFlush();
}
这里我计算A
、B
、C
和D
将世界映射到视图并将它们传递给drawHex
函数.
void myDisplay(void) {
glClear(GL_COLOR_BUFFER_BIT);
GLdouble winWidth = glutGet(GLUT_WINDOW_WIDTH);
GLdouble winHeight = glutGet(GLUT_WINDOW_HEIGHT);
GLdouble A, B, C, D;
glViewport((GLint)0, (GLint)0, (GLint)winWidth, (GLint)winHeight);
A = winWidth / 10.0;
B = winHeight / 10.0;
C = 0 - (A * -5.0);
D = 0 - (B * -5.0);
drawHex(0.5, A, B, C, D);
}
程序初始化和主循环。
void myInit() {
glClearColor(0.93, 0.93, 0.93, 0.0);
glColor3f(1.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-5.0, 5.0, -5.0, 5.0);
glClear(GL_COLOR_BUFFER_BIT);
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(screenWidth, screenHeight);
glutInitWindowPosition(100, 150);
glutCreateWindow("Window");
myInit();
glutDisplayFunc(myDisplay);
glutMainLoop();
return 0;
}
我得到的只是一个带有背景颜色的空白 window。我希望视图中间有一个六边形(尚未调整大小以保持适当的纵横比)。
我不熟悉过剩但尝试添加 glutSwapBuffers();到绘图功能的末尾。在 OpenGL 中,总是有一帧显示给用户,一帧正在渲染。 Swapbuffers 交换这两个帧:它将渲染的帧发送给用户并拉回前一帧以进行进一步渲染。
在调用 gluOrtho2D
时,您将 [-5, 5] 作为两个维度的边界。在您的计算中,超出此范围的任何内容都将被剪掉并且不可见。让我们看看是不是这样。
你传递的aa
、bb
、cc
、dd
是常量;它们始终保持:64
、48
、320
和 240
。更正上述问题后得到的值将始终在 [-1, 1] 范围内,因为这是 cos
和 sin
函数的陪域。这将乘以 radius * aa
并添加到 cc
。所以最坏的情况是 (1 * 0.5 * 64) + 320 = 352
,这显然超出了您通过 gluOrtho2D
.
设置的 -5
边界
同样的观察结果也适用于 y
。先在纸上做数学,然后再编写代码。确保所有边界条件都在限制范围内。
建议您传递 GLUT_DOUBLE
以避免闪烁,并且正如另一个答案提到的那样,您需要在显示功能末尾交换缓冲区才能使双缓冲工作。阅读 的答案了解详情。此外,您不需要在每次渲染调用时都调用 glViewport
,而是将其放在 init
函数中。
任何人都可以解释发生了什么或没有发生什么,以便我可以更正它。到目前为止,这是来自 .cpp 文件的代码。 运行 在 Visual Studio 社区 2015 年。
#include <windows.h>
#include <gl/GL.h>
#include <gl/glu.h>
#include <gl/glut.h>
#include <math.h>
#define M_PI 3.14159265358979323846
const int screenWidth = 640;
const int screenHeight = 480;
此处aa
、bb
、cc
、dd
用于将世界坐标映射到屏幕坐标。我把它们打印出来以确保它工作正常并且坐标计算正确。在这种情况下 0 < 半径 <= 5.
void drawHex(GLdouble radius, GLdouble aa, GLdouble bb, GLdouble cc, GLdouble dd) {
glBegin(GL_POLYGON);
for (int i = 0; i < 6; i++) {
glVertex2d(((cos(i / 6.0 * 2 * M_PI) * radius) * aa) + cc,
((sin(i / 6.0 * 2 * M_PI) * radius) * bb) + dd);
}
glEnd();
glFlush();
}
这里我计算A
、B
、C
和D
将世界映射到视图并将它们传递给drawHex
函数.
void myDisplay(void) {
glClear(GL_COLOR_BUFFER_BIT);
GLdouble winWidth = glutGet(GLUT_WINDOW_WIDTH);
GLdouble winHeight = glutGet(GLUT_WINDOW_HEIGHT);
GLdouble A, B, C, D;
glViewport((GLint)0, (GLint)0, (GLint)winWidth, (GLint)winHeight);
A = winWidth / 10.0;
B = winHeight / 10.0;
C = 0 - (A * -5.0);
D = 0 - (B * -5.0);
drawHex(0.5, A, B, C, D);
}
程序初始化和主循环。
void myInit() {
glClearColor(0.93, 0.93, 0.93, 0.0);
glColor3f(1.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-5.0, 5.0, -5.0, 5.0);
glClear(GL_COLOR_BUFFER_BIT);
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(screenWidth, screenHeight);
glutInitWindowPosition(100, 150);
glutCreateWindow("Window");
myInit();
glutDisplayFunc(myDisplay);
glutMainLoop();
return 0;
}
我得到的只是一个带有背景颜色的空白 window。我希望视图中间有一个六边形(尚未调整大小以保持适当的纵横比)。
我不熟悉过剩但尝试添加 glutSwapBuffers();到绘图功能的末尾。在 OpenGL 中,总是有一帧显示给用户,一帧正在渲染。 Swapbuffers 交换这两个帧:它将渲染的帧发送给用户并拉回前一帧以进行进一步渲染。
在调用 gluOrtho2D
时,您将 [-5, 5] 作为两个维度的边界。在您的计算中,超出此范围的任何内容都将被剪掉并且不可见。让我们看看是不是这样。
你传递的aa
、bb
、cc
、dd
是常量;它们始终保持:64
、48
、320
和 240
。更正上述问题后得到的值将始终在 [-1, 1] 范围内,因为这是 cos
和 sin
函数的陪域。这将乘以 radius * aa
并添加到 cc
。所以最坏的情况是 (1 * 0.5 * 64) + 320 = 352
,这显然超出了您通过 gluOrtho2D
.
-5
边界
同样的观察结果也适用于 y
。先在纸上做数学,然后再编写代码。确保所有边界条件都在限制范围内。
建议您传递 GLUT_DOUBLE
以避免闪烁,并且正如另一个答案提到的那样,您需要在显示功能末尾交换缓冲区才能使双缓冲工作。阅读 glViewport
,而是将其放在 init
函数中。