OpenGL,C++,为什么glutReshapeFunc函数给出了一个黑色的OpenGL屏幕



我一直在学习opengl教程,但由于某种原因,当我添加整形函数(用于调整窗口大小以固定比例)时。opengl窗口根本不显示对象(形状),只是一个黑屏。我不知道是不是拼错了什么的。

整形函数把事情搞砸了吗?

#include <GL/gl.h>
#include <GL/glut.h>
void renderScene(void);
void changeSize(int w, int h);
int main(int argc, char **argv){
// init GLUT and create window
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(320,320);
glutCreateWindow("Testing");
// register callbacks
glutDisplayFunc(renderScene);
// animation in reshaping
glutReshapeFunc(changeSize);
// enter GLUT event processing cycle
glutMainLoop();
return 1;
}
void renderScene(void){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBegin(GL_TRIANGLES);
    glVertex3f(-0.5,-0.5,0.0);
    glVertex3f(0.5,0.0,0.0);
    glVertex3f(0.0,0.5,0.0);
glEnd();
glutSwapBuffers();
}
void changeSize(int w, int h){
if (h==0)
    h = 1;
float ratio = 1.0*w/h;
// use the projection matrix
glMatrixMode(GL_PROJECTION);
//reset matrix
glLoadIdentity();
// set the viewpoint to be the entire window
glViewport(0,0,w,h);
// set the correct perspective
gluPerspective(45, ratio, 1, 1000);
// get back to the modelview
glMatrixMode(GL_MODELVIEW);
}

谢谢你的帮助!这是来自Lighthouse3d教程。

PS:如果我去掉整形函数,三角形就会出现(效果很好)。

您的三角形在使用gluPerspective定义的投影矩阵中是不可见的。

该矩阵定义了一个指向-z方向的视锥,其中近平面为z=-1,远平面为z=-1000。

三角形位于z=0平面上,因此不可见。

您可以:

  1. 在z方向上进一步向后移动三角形(glTranslate(0,0,-2),或手动移动顶点)。

  2. 使用将相机从(0,0,0)移开的视图矩阵,例如使用gluLookAt

  3. 使用包括z=0平面的正交投影矩阵,例如glOrtho(-1, 1, -1, 1, -1, 1)

在我看来,您要么将一个黑色三角形渲染到场景中,要么将其渲染到视图之外(例如在摄影机后面),要么两者都渲染。要诊断它,首先尝试一种与照明无关的方法来渲染三角形;在第一个CCD_ 5调用之前的某个位置添加语句CCD_。若你们看到一个白色三角形,问题就解决了。如果它仍然是黑色的,把这个放在上面的代码之前/之后:

glPushMatrix(); //save the modelview
glTranslatef(0.0,0.0,-10); //move the rendering coords
glBegin(GL_TRIANGLES);
  glColor3f(1.0,1.0,1.0);
  glVertex3f(-0.5,-0.5,0.0);
  glVertex3f(0.5,0.0,0.0);
  glVertex3f(0.0,0.5,0.0);
glEnd();
glPopMatrix();//restore the view matrix to the original

如果glTranslatef不起作用,请尝试将不同的值代入xyz参数(一个瓦片上有一个值,例如0,-10,0)。您也可以尝试将glDrawBuffer(GL_FRONT_AND_BACK);放在初始化例程中的某个位置,但这可能是默认的。

编辑我刚刚注意到三角形位于x-z平面的原点(0,0,0)上,这是相机默认的位置(因此它在近剪裁平面后面1个单位)。您肯定需要将三角形转换为视图,或者修改modelview矩阵以模拟相同的视图(例如,通过lookAt;两种方法本质上是相同的)。也有可能你看到的是三角形的边,它会使它不可见。在这种情况下,插入glRotatef(90,1,0,0);指令上面的glTranslate之后,将三角形"旋转"到正确的角度。请注意,平移、缩放和旋转是对空间本身进行操作的,而不是对其中的对象进行操作,因此所有操作都是向后进行的。通常,你会先缩放一个对象,然后旋转它,然后将它平移到任何位置。在OpenGL中,可以平移坐标,旋转坐标,然后缩放坐标。GL然后在它认为"0,0,0"所在的位置绘制对象,该对象现在位于修改后的位置。

最新更新