Opengl 照明不良(固定管道)

Opengl 照明不良(固定管道),opengl,lighting,normals,Opengl,Lighting,Normals,我正在尝试用OpenGL 1.1来渲染一个对象(比如立方体)(我知道这在现在是没有意义的,但我必须使用它)。在我尝试照明之前,一切正常 问题是: 全局变量集为: static GLfloat light_position[] = {1.0, 1.0, 2*cZ.x , 0.0}; // cZ.x is the minimum z of the mesh. I know // this is at infinity, but don't work also with w=1.0 在主

我正在尝试用OpenGL 1.1来渲染一个对象(比如立方体)(我知道这在现在是没有意义的,但我必须使用它)。在我尝试照明之前,一切正常

问题是:

全局变量集为:

static GLfloat light_position[] = {1.0, 1.0, 2*cZ.x , 0.0};   
// cZ.x is the minimum z of the mesh.  I know 
// this is at infinity, but don't work also with w=1.0
在主要功能中:

...
    glMatrixMode(GL_MODELVIEW);     // Select The Modelview Matrix
    glLoadIdentity();               // Reset The Modelview Matrix
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHTING);
    glShadeModel(GL_SMOOTH);        // Enable Smooth Shading

....
 glEnable(GL_DEPTH_TEST);
绘制网格k

//在绘制网格k时

        GLfloat light_ambient[] = {COLOUR[k][0], COLOUR[k][1], COLOUR[k][2], 1.0}; 
        GLfloat light_diffuse[] = {COLOUR[k][0], COLOUR[k][1], COLOUR[k][2], 1.0};  
        glLightfv(GL_LIGHT0, GL_POSITION, light_position);
                glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
        glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);


....
        //This is a mesh, so will be drawn using triangles
        glBegin(GL_TRIANGLES);
        //Triangles will be defined by vertex indices in faces
        for (unsigned int i = 0; i<mesh->faces.size(); i++){

            int index1 = mesh->faces.at(i).x;
            int index2 = mesh->faces.at(i).y;
            int index3 = mesh->faces.at(i).z;
            glNormal3f(mesh->normals.at(i).x,mesh->normals.at(i).y,mesh->normals.at(i).z);
            glVertex3f(mesh->vertices.at(index1).x, mesh->vertices.at(index1).y, mesh->vertices.at(index1).z);
            glVertex3f(mesh->vertices.at(index2).x, mesh->vertices.at(index2).y, mesh->vertices.at(index2).z);
            glVertex3f(mesh->vertices.at(index3).x, mesh->vertices.at(index3).y, mesh->vertices.at(index3).z);
        }
        glEnd();

....
我真的很难理解出了什么问题,你能给我指出正确的方向吗

编辑:这与斯坦福德兔子的情况类似(取自斯坦福德回购协议,所以它的格式很好)


看着你的法线图片,你的一些物体表面看起来是透明的,而不仅仅是没有着色

我曾经在学习OpenGL时遇到过类似的问题,在我的例子中,我忘了启用深度测试。只需将此行添加到GL init函数中即可:

...
    glMatrixMode(GL_MODELVIEW);     // Select The Modelview Matrix
    glLoadIdentity();               // Reset The Modelview Matrix
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHTING);
    glShadeModel(GL_SMOOTH);        // Enable Smooth Shading

....
 glEnable(GL_DEPTH_TEST);

试一试

很可能你的正常计算是wrong@AbhishekBansal我已经包括了我的正常计算。他们错了吗?还有,他们看起来是对的,我不能通读整个代码,但似乎有两种可能性。三角形本身是错误的,或者法线是错误的。只有所有三角形保持相同的顶点顺序(在您的情况下为逆时针),您的法线计算代码才是正确的。如果所有三角形的顶点顺序都不相同,则将得到翻转法线(指向反向的法线)。如果没有实际的网格数据,就不可能回答。你的网格很简单,只需分别获得不同的边,然后检查法线是否相同。哦!实际上是这样!谢谢