我正在为ios开发一个opengl es应用程序。 我正在尝试在我的着色器中混合两个纹理,但我总是只获得一个活动纹理单元。 我已生成两个纹理,并使用片段着色器中的两个“sampler2D”链接它们。 我使用glUniform1f();
将它们设置为0和1单元我使用循环
绑定纹理for (int i = 0; i < 2; i++)
{
glActiveTexture(GL_TEXTURE0 + i);
glBindTexture(GL_TEXTURE_2D, textures[i]);
}
但是当我绘制opengl框架时,只有一个单元处于活动状态。如下图所示
那么,我做错了什么?
答案 0 :(得分:0)
我读取该工具的输出的方式(我还没有使用过),左侧窗格显示当前活动的纹理单元。始终只有一个活动纹理单元,对应于您最后一次调用glActiveTexture()
。这意味着在您致电后:
glActiveTexture(GL_TEXTURE0 + i);
左侧圆圈字段中的值将是i
的值。
右侧窗格显示绑定到每个纹理单元的纹理。由于您使用问题中显示的循环将纹理绑定到单元0和1,它会显示绑定到纹理单元0的纹理(ID为201),以及绑定到纹理单元1的纹理(ID为202)。
据我所知,屏幕截图中显示的状态正好代表您根据描述和代码片段设置的内容。
根据您问题中的措辞,您可能会认为glActiveTexture()
启用了纹理单元。事实并非如此。 glActiveTexture()
仅指定后续glBindTexture()
次调用操作的纹理单元。
然后使用您为着色器程序的采样器制服设置的值以及绑定到相应纹理单元的纹理来确定使用哪些纹理。当前活动纹理单元的值对绘制调用没有影响,仅对纹理绑定有影响。