OpenGL纹理采样器的纹理单元取值是否必须从0开始?异常原因是什么
问题1:纹理单元的取值必须从0开始吗?
不需要。OpenGL只要求纹理单元编号不超过当前设备支持的最大纹理单元数量即可,所有符合规范的OpenGL实现至少支持16个2D纹理单元,编号从GL_TEXTURE0到GL_TEXTURE15,用其中任意编号都是合法的,没有强制要求必须从0开始使用。
问题2:为什么修改为3、4后渲染结果全黑?
你只修改了着色器采样器关联的纹理单元编号,没有同步修改纹理对象绑定的纹理单元,两者不匹配导致采样失败。
渲染纹理的完整流程要求两步的编号完全对应:
- 第一步:将加载好的纹理对象绑定到指定纹理单元,你之前的代码应该为:
// 纹理1绑定到0号单元 glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, texture1); // 纹理2绑定到1号单元 glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, texture2);
- 第二步:告诉着色器采样器对应的纹理单元编号,也就是你修改的代码部分。
你现在把第二步的编号改成了3、4,但是第一步的纹理还是绑在0、1单元,3、4单元没有绑定任何有效纹理,OpenGL采样空纹理单元时默认返回黑色,就出现了你看到的全黑渲染结果。
修复方案
二选一即可:
- 保持采样器的编号修改,同步把纹理绑定的目标改成
GL_TEXTURE3和GL_TEXTURE4 - 回退采样器的编号修改,保持为0、1和原绑定逻辑对齐
内容的提问来源于stack exchange,提问作者Sodino
相关产品推荐
相关产品推荐

