2

只是玩弄opengland glut。我试图让立方体完全可见,所以我决定我可以用gluPerspective(); 所以这里是代码

#include <iostream>
#include <GL/glut.h>
#include <GL/gl.h>

using namespace std; 

float _angle = 0.1f;

void render(){
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();      

    gluPerspective(90.0, 1, 0.1, 100.0); 
    gluLookAt(1, 1, 1, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0);

    glPushMatrix();  
      glRotatef(_angle, 0.0f,0.0f,1.0f);
      glColor3f(1.0f,0.0f,0.0f);
      glutSolidCube (1.0);
    glPopMatrix();
    _angle +=0.03f; 

    // check OpenGL error
    GLenum err;
    while ((err = glGetError()) != GL_NO_ERROR) {
        cerr << "OpenGL error: " << err << endl;
    }

   glutSwapBuffers();
   glutPostRedisplay();


}

void init(){
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);

    glutInitWindowPosition(100,100);
    glutInitWindowSize(640, 480);
    glutCreateWindow("test");
    glClearColor(0.2,0.2,0.2,0.0);

    glEnable(GL_COLOR_MATERIAL);

    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);

    glutDisplayFunc(render);

    glutMainLoop();
}


int main(int argc, char * argv[]) {

    glutInit(&argc, argv);
    init();
    return 0;
}

这就是结果:

在此处输入图像描述

立方体的一部分看起来没有gluPerspective()在此处输入图像描述

我怎样才能让它看起来正常?

4

1 回答 1

3

我不一定会说,当您弄乱投影矩阵时,法线会反转,就像缠绕方向反转一样。

OpenGL 确定多边形缠绕,用于在投影后剔除正面/背面的多边形。当您的投影矩阵和模型视图矩阵在 Z 应面向的方向(换句话说,惯用手)上不一致时,您将遇到这些奇怪的问题。

传统上,投影矩阵设置为在 OpenGL 中乘以模型视图矩阵时反转 Z。固定功能管道一直是这样工作的,这就是产生 OpenGL 右手坐标系的原因。如果你翻转 Z 坐标,你会改变方向顶点在投影后缠绕。

说了这么多,我不认为这实际上是你的问题。您在此处使用逐顶点照明,并且已将模型视图矩阵与投影矩阵相结合。当需要进行逐顶点光照计算时,它们是在错误的坐标空间中完成的。我建议您将模型视图与投影分开...

glMatrixMode   (GL_PROJECTION);
glLoadIdentity ();

gluPerspective (90.0, 1, 0.1, 100.0);

glMatrixMode   (GL_MODELVIEW);
glLoadIdentity ();      

gluLookAt      (1, 1, 1, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0);

现在您已经正确分离了变换矩阵,固定功能照明应该可以按预期工作。

更新:

除了我上面描述的,还有一件事你忘了做。深度测试在 OpenGL 中默认是禁用的(因为不能保证你甚至有一个深度缓冲区);你需要启用它。

glEnable (GL_DEPTH_TEST);

并且当您调用时,您的纵横比设置不正确gluPerspective (...),应该640.0f/480.0f1.

于 2013-09-28T21:07:02.470 回答