需要帮助理解为什么在 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;

此处aabbccdd用于将世界坐标映射到屏幕坐标。我把它们打印出来以确保它工作正常并且坐标计算正确。在这种情况下 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();
}

这里我计算ABCD将世界映射到视图并将它们传递给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] 作为两个维度的边界。在您的计算中,超出此范围的任何内容都将被剪掉并且不可见。让我们看看是不是这样。

你传递的aabbccdd是常量;它们始终保持:6448320240。更正上述问题后得到的值将始终在 [-1, 1] 范围内,因为这是 cossin 函数的陪域。这将乘以 radius * aa 并添加到 cc。所以最坏的情况是 (1 * 0.5 * 64) + 320 = 352,这显然超出了您通过 gluOrtho2D.

设置的 -5 边界

同样的观察结果也适用于 y。先在纸上做数学,然后再编写代码。确保所有边界条件都在限制范围内。

建议您传递 GLUT_DOUBLE 以避免闪烁,并且正如另一个答案提到的那样,您需要在显示功能末尾交换缓冲区才能使双缓冲工作。阅读 的答案了解详情。此外,您不需要在每次渲染调用时都调用 glViewport,而是将其放在 init 函数中。