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

时间:2012-09-01 22:29:55

标签: c++ linux function opengl window-resize

我一直在关注一个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:如果我取出重塑功能,三角形就会出现(工作正常)。

2 个答案:

答案 0 :(得分:4)

您使用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)

答案 1 :(得分:1)

在我看来,你要么在场景中渲染黑色三角形,要么在视野之外(例如在摄像机后面),或者两者都是。要诊断它,首先尝试使用与光照无关的方法来渲染三角形;在第一次glColor3f(1.0,1.0,1.0);调用之前的某处添加语句glVertex()。如果你看到一个白色三角形,问题就解决了。如果它仍然是黑色,请将其放在上述代码之前/之后:

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参数(一个在tile中,例如0,-10,0)。您也可以尝试将glDrawBuffer(GL_FRONT_AND_BACK);放在初始化例程中的某处,但这可能是默认值。

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