【问题标题】:Why is my floor polygon not affected by specular and diffuse light?为什么我的地板多边形不受镜面光和漫射光的影响?
【发布时间】:2015-08-17 20:34:40
【问题描述】:

我正在尝试用一些简单的物体照亮一个场景。我有两盏灯,一个聚光灯和一个点灯,灯光似乎在场景中的对象上工作正常,但是当涉及到带纹理的地板时,它只受环境影响,我不知道为什么。我认为它与法线有关,因为我将它定义为我认为应该是的,指向上方。如果我删除纹理,我会得到相同的结果。 我做错了什么?

这是我的代码:

void drawFloor()
{
    setMaterial(mat_specularFloor, mat_specularFloor, mat_specularFloor, mat_specularFloor);
    //glColor3f(1.0, 1.0, 1.0);
    glEnable(GL_TEXTURE_2D);
    //glEnable(GL_NORMALIZE);
    glBindTexture(GL_TEXTURE_2D, g_Texture[0]);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    //glColor3f(.5, 0.5, 0.7);
    glBegin(GL_TRIANGLE_FAN);
    glNormal3f(0.0f, 1.0f, 0.0f);
    glTexCoord2f(0.0f, 0.0f);

    glVertex3f(-50, 0, -50);
    glTexCoord2f(10.0f, 0.0f);
    glVertex3f( 50, 0, -50);
    glTexCoord2f(10.0f, 10.0f);
    glVertex3f( 50, 0,  50);
    glTexCoord2f(0.0f, 10.0f);
    glVertex3f(-50, 0,  50);
    glEnd();
    glDisable(GL_TEXTURE_2D);
}

【问题讨论】:

  • 当你说它不受影响时:光是静止的吗?
  • 绘制地板时是否启用了GL_LIGHTING
  • 是的,两个灯都是静止的,你可以用键盘移动聚光灯。 GL_LIGHTING 在绘制地板之前启用。事实上,桌子和茶壶是在地板后面画的,它们的灯都很好。
  • 在固定管线中,光照是按顶点计算的,然后进行插值。因此,如果您将地板绘制为一个非常大的四边形,则仅在角落执行照明计算,结果将线性插值在整个地板上。
  • 桌子的四边形看起来比地板小得多。

标签: opengl rendering lighting


【解决方案1】:

我不熟悉固定功能管道,这可以通过使用更新版本的 opengl 和使用每个像素照明的着色器来解决。 解决此问题的一种可能方法是细分地板,使其由许多较小的部分组成。 由于opengl正在为每个顶点运行计算,因此您的灯光被平均化了,如果您要细分每个部分,灯光将对

产生更大的影响

【讨论】:

    【解决方案2】:

    好的,所以我的光照的主要问题是它只是一个巨大的多边形,而且因为它太大了,我在顶点没有得到任何光照,所以没有什么可以插值的。

    现在我得到了聚光灯的漫反射光照,但我似乎没有得到镜面高光。 甚至有可能在飞机上获得镜面高光吗? 如果是这样,我还需要做什么来解决这个问题?我需要让地板看起来有光泽。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-18
      相关资源
      最近更新 更多