我一直在学习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平面上,因此不可见。
您可以:
-
在z方向上进一步向后移动三角形(
glTranslate(0,0,-2)
,或手动移动顶点)。 -
使用将相机从(0,0,0)移开的视图矩阵,例如使用
gluLookAt
-
使用包括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"所在的位置绘制对象,该对象现在位于修改后的位置。