【问题标题】:OpenGL: How to resolve the lighting problem of Cube?OpenGL:如何解决 Cube 的光照问题?
【发布时间】:2020-04-02 02:58:34
【问题描述】:

// Vertices information
GLfloat vertices[] = { 1, 1, 1,  -1, 1, 1,  -1,-1, 1,   1,-1, 1, // (front)
                    1, 1, 1,   1,-1, 1,   1,-1,-1,   1, 1,-1,   // (right)
                    1, 1, 1,   1, 1,-1,  -1, 1,-1,  -1, 1, 1,   // (top)
                   -1, 1, 1,  -1, 1,-1,  -1,-1,-1,  -1,-1, 1,   // (left)
                   -1,-1,-1,   1,-1,-1,   1,-1, 1,  -1,-1, 1,   // (bottom)
                    1,-1,-1,  -1,-1,-1,  -1, 1,-1,   1, 1,-1 }; // (back)

// Normal information
GLfloat normals[72] = { 0, 0, 1,   0, 0, 1,   0, 0, 1,   0, 0, 1,   // (front)
                    1, 0, 0,   1, 0, 0,   1, 0, 0,   1, 0, 0,   // (right)
                    0, 1, 0,   0, 1, 0,   0, 1, 0,   0, 1, 0,   // (top)
                   -1, 0, 0,  -1, 0, 0,  -1, 0, 0,  -1, 0, 0,   // (left)
                    0,-1, 0,   0,-1, 0,   0,-1, 0,   0,-1, 0,   // (bottom)
                    0, 0,-1,   0, 0,-1,   0, 0,-1,   0, 0,-1 }; // (back)

// drawing cube
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glNormalPointer(GL_FLOAT, 0, normals);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_BYTE, indices);
glPopMatrix();
glDisableClientState(GL_VERTEX_ARRAY); 
glDisableClientState(GL_NORMAL_ARRAY);

我要确保两侧没有色差。

有解决办法吗?

【问题讨论】:

  • “无色差”是什么意思?这是一个立方体;如果您正确使用照明,那么您看到边缘的颜色差异。这种颜色差异是我们的眼睛如何知道那里有边缘的方式。

标签: c++ opengl line lighting opengl-compat


【解决方案1】:

问题出在原因,因为您已激活平面着色模式(请参阅Detecting legacy OpenGLglShadeModel)。 因此,光照是针对triangle primitive 的顶点计算的,但三角形的颜色由Provoking vertex 确定。

切换到平滑 (GL_SMOOTH) 着色模型并确保光线是漫反射的(GL_DIFFUSE 参数 - 请参阅 glLight):

glShadeModel(GL_SMOOTH);

查看着色模式GL_FLAT(左)和GL_SMOOTH(右)的区别:


另一种选择是渲染GL_QUADS 原语而不是GL_TRIANGLES 原语:

glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, indices)

glDrawArrays(GL_QUADS, 0, 24);

同样,GL_FLAT(左)和GL_SMOOTH(右):

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 2015-01-31
    • 2012-01-31
    相关资源
    最近更新 更多