0

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

4

2 回答 2

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)

于 2012-09-01T22:48:52.343 回答
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 参数(一个在拼贴处,例如 0、-10、0)。您也可以尝试glDrawBuffer(GL_FRONT_AND_BACK);在初始化例程中放置某个位置,但这可能是默认设置。

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

于 2012-09-02T00:14:36.987 回答