[英]Need help understanding why nothing is drawing to screen in OpenGL, glut
任何人都可以解释发生了什么或没有发生什么,以便我可以纠正它。 到目前为止,这是.cpp文件中的代码。 在Visual Studio Community 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;
}
我所得到的只是一个带有背景色的空白窗口。 我期望视图的中间有一个六边形(尚未调整大小以保持适当的宽高比)。
在调用gluOrtho2D
您将[ gluOrtho2D
]作为两个维度的边界。 在您的计算中,超出此范围的所有内容都将被裁剪掉,将不可见。 让我们看看是否是这种情况。
您通过的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
以避免闪烁,如其他答案所述,在显示功能的末尾需要交换缓冲区以使双缓冲起作用。 阅读有关单缓冲(GLUT_SINGLE)与双缓冲图形(GLUT_DOUBLE)之间差异的答案,以获取详细信息。 另外,您无需在每次渲染调用时都调用glViewport
,而只需将其放入init
函数中即可。
我不熟悉glut,但是尝试添加glutSwapBuffers(); 到绘图功能的末尾。 在OpenGL中,总是向用户显示一帧,而正在渲染一帧。 交换缓冲区交换这两个帧:它将已渲染的帧发送给用户,并拉回前一个帧以进行进一步渲染。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.