我一直在关注一个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:如果我取出重塑功能,三角形就会出现(工作正常)。
答案 0 :(得分:4)
您使用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)
答案 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'的对象,它现在处于修改位置。