在OpenGL中启用照明时,为什么颜色会消失? 我在C++中用OpenGL API和GLUT.开发了一个图形应用程序。

在OpenGL中启用照明时,为什么颜色会消失? 我在C++中用OpenGL API和GLUT.开发了一个图形应用程序。,c++,opengl,glut,C++,Opengl,Glut,为了添加照明,我在modelview矩阵中做了以下更改: glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); // Create light components. GLfloat ambientLight[] = { 0.2f, 0.2f, 0.2f, 1.0f }; GLfloat diffuseLight[] = { 0.8f, 0.8f, 0.8, 1.0f }; GLfloat specularLight[] = { 0.5f, 0.5f, 0.5

为了添加照明,我在modelview矩阵中做了以下更改:

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);

// Create light components.
GLfloat ambientLight[] = { 0.2f, 0.2f, 0.2f, 1.0f };
GLfloat diffuseLight[] = { 0.8f, 0.8f, 0.8, 1.0f };
GLfloat specularLight[] = { 0.5f, 0.5f, 0.5f, 1.0f };
GLfloat position[] = { 0.0f, 0.0f, 0.0f, 1.0f };

// Assign created components to GL_LIGHT0.
glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);
glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight);
glLightfv(GL_LIGHT0, GL_POSITION, position);
我相信灯光在很大程度上起作用,但是我的物体的颜色都消失了。我所看到的只是我整个身材的黑白轮廓

我想知道为什么会这样?

试试
glEnable(GL颜色材料)

见:

  • 小心启用彩色材料
  • OpenGL的彩色材质功能提供了一种成本较低的 更改材质参数。启用颜色材质后,材质 颜色跟踪当前颜色。这意味着不使用 相对昂贵的
    glmaterialsv
    例程,您可以使用
    glColor3f
    例行程序

    下面是一个使用颜色材质功能更改颜色的示例 三角形每个顶点的漫反射颜色:

    glColorMaterial(GL_FRONT, GL_DIFFUSE);
    glEnable(GL_COLOR_MATERIAL);
    glBegin(GL_TRIANGLES);
        glColor3f(0.2, 0.5, 0.8);
        glVertex3f(1.0, 0.0, 0.0);
        glColor3f(0.3, 0.5, 0.6);
        glVertex3f(0.0, 0.0, 0.0);
        glColor3f(0.4, 0.2, 0.2);
        glVertex3f(1.0, 1.0, 0.0);
    glEnd();
    
    如果使用了
    glMaterialfv
    ,请考虑所需的更昂贵的代码序列 明确使用:

    GLfloat d1[] = { 0.2, 0.5, 0.8, 1.0 };
    GLfloat d2[] = { 0.3, 0.5, 0.6, 1.0 };
    GLfloat d3[] = { 0.4, 0.2, 0.2, 1.0 };
    
    glBegin(GL_TRIANGLES);
        glMaterialfv(GL_FRONT,GL_DIFFUSE,d1);
        glVertex3f(1.0, 0.0, 0.0);
        glMaterialfv(GL_FRONT,GL_DIFFUSE,d2);
        glVertex3f(0.0, 0.0, 0.0);
        glMaterialfv(GL_FRONT,GL_DIFFUSE,d3);
        glVertex3f(1.0, 1.0, 0.0);
    glEnd();
    
    如果要渲染需要频繁使用简单材质的对象 更改后,请尝试使用颜色材质模式。然而,有一个问题 启用颜色材质模式时遇到的常见陷阱。什么时候 启用颜色材质后,OpenGL会立即更改材质 颜色由颜色材质状态控制。考虑以下事项 初始化新创建的OpenGL渲染上下文的一段代码:

    GLfloat a[] = { 0.1, 0.1, 0.1, 1.0 };
    glColor4f(1.0, 1.0, 1.0, 1.0);
    
    glMaterialfv(GL_FRONT, GL_AMBIENT, a);
    glEnable(GL_COLOR_MATERIAL); /* WARNING: Ambient and diffuse material latch immediately to the current color. */
    glColorMaterial(GL_FRONT, GL_DIFFUSE);
    glColor3f(0.3, 0.5, 0.6);
    
    前环境光和漫反射材质颜色将处于什么状态 执行上述代码片段?而程序员可能有 预期环境材料状态为
    (0.1,0.1,0.1,1.0)
    和 漫反射材质状态为
    (0.3,0.5,0.6,1.0)
    ,这不是 发生了什么

    由此产生的漫反射材质状态是程序员想要的, 但产生的环境材质状态出乎意料地
    (1.0,
    1.0、1.0、1.0)
    。那是怎么发生的?好的,请记住,颜色材质模式在以下情况下立即开始跟踪当前颜色: 启用。颜色材质设置的初始值为
    GL\u前和后
    GL\u环境和扩散
    (可能不是什么 你预料到了!)

    因为启用颜色材质模式会立即开始跟踪 当前颜色,环境光和漫反射材质状态均为 更新为
    (1.0、1.0、1.0、1.0)
    。请注意 初始
    glmaterialsv
    丢失。接下来,将显示颜色材质状态 更新为仅更改前漫反射材质。最后一点是
    glColor3f
    调用将漫反射材质更改为
    (0.3,0.5,,
    0.6,1.0)
    。环境材质状态最终为
    (1.0、1.0、1.0、1.0)

    上面代码片段中的问题是颜色材质模式 在调用
    glColorMaterial
    之前启用。颜色材质模式 对于高效简单的材质更改非常有效,但要避免 对于上述陷阱,请务必小心设置
    glColorMaterial
    您可以启用
    GL\u颜色\u材质


    启用照明时,顶点颜色不是由
    glColor
    glColorPointer
    设置的颜色确定的,而是由当前设置的材质颜色与使用照明计算的灯光颜色组合确定的

    因此,为了更改对象的颜色,需要在渲染之前使用函数更改材质设置(默认情况下为漫反射灰色材质)。对于每种不同的灯光颜色(
    GL_DIFFUSE
    ,…),基本上都有相应的材质颜色,以及一些近似发光材质的附加属性(
    GL_EMISSION
    )和控制材质粗糙度(
    GL_shiness
    )。阅读一些有关OpenGL照明功能的介绍性材料,了解它们的工作原理

    要快速地将代码从普通着色调整到照明(或启用逐顶点材质属性),可以使用颜色材质。通过调用
    glEnable(GL\u COLOR\u MATERIAL)
    并使用设置适当的映射,您可以在更改当前顶点颜色时(使用
    glColor
    glColorPointer
    )将OpenGL配置为更改特定的材质颜色。

    良好的相关链接