Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 具有多重纹理的光照贴图,是否禁用其中一种纹理的照明?_Opengl_Multitexturing_Light - Fatal编程技术网

Opengl 具有多重纹理的光照贴图,是否禁用其中一种纹理的照明?

Opengl 具有多重纹理的光照贴图,是否禁用其中一种纹理的照明?,opengl,multitexturing,light,Opengl,Multitexturing,Light,如何在这个多纹理方案中仅禁用一个纹理的照明?我尝试使用glDisable(GL_照明)和glEnable(GL_照明),但渲染四边形时它不记得设置 以下是代码片段: glDisable(GL_LIGHTING); glEnable(GL_BLEND); glDisable(GL_TEXTURE_RECTANGLE_ARB); glDisable(GL_TEXTURE_2D); //------------------------ glActiveTextureARB(GL_TEXTURE0)

如何在这个多纹理方案中仅禁用一个纹理的照明?我尝试使用glDisable(GL_照明)和glEnable(GL_照明),但渲染四边形时它不记得设置

以下是代码片段:

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);
奇怪的是,当我在代码的第一行启用照明时,我根本看不到multitexture四边形中渲染的灯光贴图纹理。另外,灯光似乎根本不会影响这个四边形,它可以作用于我的应用程序中的其他四边形(不是多纹理的)


感谢您的帮助。

您的第一句话毫无意义。GL照明发生在顶点级别。纹理,无论是单纹理还是多纹理。发生在很久以后。详情如下:

逐顶点计算的照明将插值到每个片段,该值将输入到纹理管道阶段0

所以。。。根据阶段0的纹理环境,亮起的颜色L进入并与纹理阶段0(此处为灯光贴图)上的纹理组合。您没有显示如何为纹理阶段0设置纹理环境,因此我无法告诉您它将如何传递

然后,阶段0的输出(根据照明和纹理0计算)被发送到纹理阶段1输入(在那里绑定“正常”纹理。这称为漫反射纹理)。在这里,您使用的环境是“合并并添加RGB和ALPHA”,这不是典型的光照贴图:您正在将照明+光照贴图添加到漫反射颜色。通常,您希望将它们相乘(GL_纹理_环境_模式=GL_调制而不是GL_组合)

另外,您没有设置SOURCE0_ALPHA和SOURCE1_ALPHA,因此我不确定您到底添加了什么来生成阶段1 ALPHA输出

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

编辑:根据您的注释,如果未指定阶段0 TexEnv,则将获得默认值:

GL_纹理_环境_模式默认为GL_调制和GL_纹理_环境_颜色 默认为(0,0,0,0)

因此,来自照明的颜色将通过光照贴图进行调制(这可能有意义,取决于您试图实现的目标)。这会添加到漫反射中(正如我所说,它可能会被调制)


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

所以用这种多纹理方案制作光照贴图是可能的,只需要对glTexEnvi()函数设置正确的值?但当我启用照明时,它没有效果。。。用我加载纹理的代码更新了我的第一篇文章,不确定你问的“纹理环境”forgletXenv==纹理环境。每个阶段都有一个纹理环境,它定义了阶段如何与前一种颜色组合。除了我已经粘贴到那里的代码之外,我不使用其他glTexEnv()代码“但你没有说你想要达到什么结果”,我只想在某个建筑窗口纹理中打开/关闭灯光。我想调制是正确的关键字?那么,您是否尝试过用调制而不是组合替换阶段1的纹理环境?