繁体   English   中英

需要帮助以了解为什么在OpenGL中没有任何东西可以绘制到屏幕上

[英]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;

在这里, 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;
}

我所得到的只是一个带有背景色的空白窗口。 我期望视图的中间有一个六边形(尚未调整大小以保持适当的宽高比)。

在调用gluOrtho2D您将[ gluOrtho2D ]作为两个维度的边界。 在您的计算中,超出此范围的所有内容都将被裁剪掉,将不可见。 让我们看看是否是这种情况。

您通过的aabbccdd是常量; 它们始终保持: 6448320240 纠正上述问题后,您获得的值将始终在[-1,1]之内,因为这是cossin函数的共域。 这乘以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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM