【问题标题】:Bad lighting behaviour (fixed pipeline)不良照明行为(固定管道)
【发布时间】:2014-03-27 15:25:11
【问题描述】:

我正在尝试使用 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

....

绘制网格 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();

....

而法线计算为:

    glm::vec3 currFace = m->faces.at(faceIndex);
    glm::vec3 vert1 = m->vertices.at(currFace.x);
    glm::vec3 vert2 = m->vertices.at(currFace.y);
    glm::vec3 vert3 = m->vertices.at(currFace.z);

    glm::vec3 side1 = (vert2 - vert1);
    glm::vec3 side2 = (vert3 - vert1);

    glm::vec3 normal = glm::cross(side1, side2);

    normal = glm::normalize(normal);

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

编辑:这与standford bunny 类似(取自standford repo,因此格式正确)

http://imgur.com/Z6225QG

【问题讨论】:

  • 很可能你的正常计算是错误的
  • @AbhishekBansal 我已经包含了我的正常计算。他们错了吗?
  • 另外,绘制它们看起来还不错
  • 我无法浏览整个代码,但似乎有两种可能性。三角形本身是错误的,或者法线是错误的。
  • 只要所有三角形保持相同的顶点顺序(逆时针,在您的情况下),您的正常计算代码才是正确的。如果所有三角形的顶点顺序不同 - 您将正常翻转(法线指向向后方向)。没有实际的网格数据是不可能回答的。您的网格很简单,只需分别获取不同的面并检查法线是否相同。

标签: opengl lighting normals


【解决方案1】:

看看你的法线图片,看起来不仅仅是没有被着色,你的一些对象面是透明的。

我在学习 OpenGL 时曾经遇到过类似的问题,在我的情况下,我忘记启用 DEPTH_TEST。您可以简单地将这一行添加到您的 GL 初始化函数函数中:

 glEnable(GL_DEPTH_TEST);

试试看

【讨论】:

  • 哦!原来是这个!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
  • 2021-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多