0

在这个多重纹理方案中,我如何才能只为其中一个纹理禁用照明?我尝试使用 glDisable(GL_LIGHTING) 和 glEnable(GL_LIGHTING) 但渲染四边形时它不记得设置。

这是代码片段:

glDisable(GL_LIGHTING);
glEnable(GL_BLEND);

glDisable(GL_TEXTURE_RECTANGLE_ARB);
glDisable(GL_TEXTURE_2D);

//------------------------
glActiveTextureARB(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, LIGHT_MAP); // texture with black/white

//------------------------
glActiveTextureARB(GL_TEXTURE1);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, MY_TEXTURE); // normal texture
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_ADD);

glColor4f(1, 1, 1, 1);

glBegin(GL_QUADS);
    glNormal3f(0,0,1);

    glMultiTexCoord2fARB(GL_TEXTURE0, 0.0f, 0.0f);
    glMultiTexCoord2fARB(GL_TEXTURE1, 0.0f, 0.0f);
    glVertex3f(-1.0f, -1.0f, 0.0f);

    glMultiTexCoord2fARB(GL_TEXTURE0, 0.0f, 1.0f);
    glMultiTexCoord2fARB(GL_TEXTURE1, 0.0f, 1.0f);
    glVertex3f(-1.0f, 1.0f, 0.0f);

    glMultiTexCoord2fARB(GL_TEXTURE0, 1.0f, 1.0f);
    glMultiTexCoord2fARB(GL_TEXTURE1, 1.0f, 1.0f);
    glVertex3f(1.0f,  1.0f, 0.0f);

    glMultiTexCoord2fARB(GL_TEXTURE0, 1.0f, 0.0f);
    glMultiTexCoord2fARB(GL_TEXTURE1, 1.0f, 0.0f);
    glVertex3f(1.0f, -1.0f, 0.0f);
glEnd();

glActiveTextureARB(GL_TEXTURE0);
glDisable(GL_TEXTURE_2D);

glActiveTextureARB(GL_TEXTURE1);
glDisable(GL_TEXTURE_2D);

编辑:纹理加载:

glGenTextures(1, &LIGHT_MAP);
glBindTexture(GL_TEXTURE_2D, LIGHT_MAP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);

奇怪的是,当我在第一行代码启用光照时,我根本看不到多纹理四边形中渲染的 light_map 纹理。此外,照明似乎根本不会影响该四边形,它适用于我的应用程序中的其他四边形(不是多纹理的)。

任何帮助表示赞赏。

4

1 回答 1

2

你的第一句话没有意义。GL 光照发生在顶点级别。纹理,无论是单纹理还是多纹理。发生在之后。详细信息:

每个顶点计算的光照被插入到每个片段中,并且该值被输入到纹理管道阶段 0。

所以......根据阶段0的纹理环境,光照颜色L进来并与纹理阶段0(您的光照贴图)上的纹理相结合。您没有展示如何设置纹理环境纹理阶段 0,所以我不能告诉你它将如何传递。

然后你从阶段 0 的输出(从光照和纹理 0 计算)被发送到纹理阶段 1 输入(你的“正常”纹理被绑定的地方。这称为漫反射纹理)。您在此处在 RGB 和 ALPHA 上使用 COMBINE with ADD 环境,这不是典型的光照贴图:您光照+光照贴图添加到漫反射颜色。通常你想将它们相乘(GL_TEXTURE_ENV_MODE=GL_MODULATE 而不是 GL_COMBINE)。

此外,您没有设置 SOURCE0_ALPHA 和 SOURCE1_ALPHA,所以我不确定您究竟添加了什么来生成阶段 1 ALPHA 输出。

总而言之,我建议首先准确地写下您想要的结果(作为数学),然后尝试将其映射到 GL 多纹理管道。

编辑:根据您的评论,如果您没有指定阶段 0 TexEnv,那么您将获得默认值:

GL_TEXTURE_ENV_MODE 默认为 GL_MODULATE 并且 GL_TEXTURE_ENV_COLOR 默认为 (0, 0, 0, 0)。

因此,您来自照明的颜色会使用您的光照贴图进行调制(这可能取决于您想要实现的目标)。这会添加到您的漫反射中(正如我所说,它可能应该被调制)。

这些都没有改变我之前所说的:准确地写下你想要的数学结果。从中我们可以帮助找到您可能需要的纹理环境。但是你没有说你想要达到什么结果。

于 2010-01-10T13:09:49.357 回答