Opengl 法线反转是因为GluPersitve?

Opengl 法线反转是因为GluPersitve?,opengl,glut,normals,glulookat,Opengl,Glut,Normals,Glulookat,只是在玩opengl和glut。我试图让多维数据集充满visibe,所以我决定用glupperspective()实现它 这是代码 #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_BU

只是在玩
opengl
glut
。我试图让多维数据集充满visibe,所以我决定用
glupperspective()实现它
这是代码

#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;
}
#包括
#包括
#包括
使用名称空间std;
浮动角度=0.1f;
void render(){
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glMatrixMode(GLU模型视图);
glLoadIdentity();
gluPerspective(90.0,1,0.1100.0);
gluLookAt(1,1,1,0.0,0.0,0.0,0.0,0.0,1.0);
glPushMatrix();
glRotatef(_角,0.0f,0.0f,1.0f);
GL3F(1.0f,0.0f,0.0f);
立体立方体(1.0);
glPopMatrix();
_角度+=0.03f;
//检查OpenGL错误
肩胛盂;
而((err=glGetError())!=GL\u无错误){

cerr我不一定说,当你弄乱投影矩阵时,法线是反转的,就像缠绕方向是反转的一样

OpenGL确定多边形缠绕,用于在投影后剔除前/后向多边形。当投影矩阵和modelview矩阵在Z应朝向哪个方向上不一致(换句话说,用手)时,您将遇到这些奇怪的问题

传统上,在OpenGL中,投影矩阵被设置为与modelview矩阵相乘时反转Z。固定函数管道一直以这种方式工作,这就是生成OpenGL右手坐标系的原因。如果翻转Z坐标,则会更改顶点在投影后缠绕的方向

话虽如此,我认为这实际上不是你的问题。你在这里使用逐顶点照明,并且你已经将modelview矩阵与投影矩阵相结合。当需要进行逐顶点照明计算时,它们是在错误的坐标空间中进行的。我建议你将modelview与projec分开激动

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);

调用
glupspective(…)时,纵横比设置不正确
,它应该是
640.0f/480.0f
而不是
1

谢谢,但它没有正常工作。但是底部现在更亮了hehe@DanilGholtsman:我添加了一个与深度缓冲区相关的额外细节。如果启用
GL\U深度测试
并像我最初解释的那样设置投影矩阵,照明应该可以正常工作直截了当地。