我正在尝试将纹理单元绑定到uniform sampler2D
着色器变量。这适用于所有纹理单位,包括GL_TEXTURE8
。我按如下方式设置采样器位置(使用Qt):
shader->setUniformValue("texture", 8);
如果我将8更改为9,则着色器无法从正确的纹理单元中读取。相反,它使用绑定到单元10的纹理,单元10是要加载的最后一个纹理。
纹理都以相同的方式加载:
loadTexture(GL_TEXTURE5, tex5, "facture_rock_0.jpg", "JPG");
loadTexture(GL_TEXTURE6, tex6, "facture_rock_1.jpg", "JPG");
loadTexture(GL_TEXTURE7, tex7, "facture_sand.jpg", "JPG");
loadTexture(GL_TEXTURE8, tex8, "facture_stone.jpg", "JPG");
loadTexture(GL_TEXTURE9, tex9, "grass1.png", "PNG");
loadTexture(GL_TEXTURE10, tex10, "joshuaTree.png", "PNG");
GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS
是32,所以这似乎不是问题。除此之外,我还没有找到任何支持不超过8个纹理单元的报告或类似的东西。
为了能够使用8个以上的纹理单元,我还有什么需要做的吗?我想我可以将纹理绑定到较低的纹理单元并使用它,但我想尽可能避免使用它。
修改 我在Radeon HD 6770M卡上运行它。我正在使用的OpenGL版本是“4.1.11013兼容性配置文件上下文”。 GLSL版本是4.10。
我实际上有2个渲染阶段。纹理5-8由不同的着色器使用,但是在相同的渲染周期中。我绑定使用纹理5-8的着色器,然后切换到应该使用9和10的另一个着色器。我尝试在绘制任何东西之前绑定采样器,并在绑定着色器之后立即绑定。
由于在将均匀值更改为8而不是9时绑定了正确的纹理,我认为问题不在着色器设置或纹理设置中。
以下是第一个渲染阶段的代码:
shader1->bind();
shader1->setUniformValue("terrainTexture", 4);
shader1->setUniformValue("rockFactureTexture", 5);
shader1->setUniformValue("rockFactureTexture2", 6);
shader1->setUniformValue("sandFactureTexture", 7);
shader1->setUniformValue("stoneFactureTexture", 8);
shader1->release();
shader2->bind();
//shader2->setUniformValue("plantTexture", 8); // Correct! Texture 8 is bound
shader2->setUniformValue("plantTexture", 9); // Wrong! Texture 10 is bound
shader2->release();
phongShader->bind();
glEnable(GL_LIGHTING);
glViewport(0, 0, width, height);
drawScene();
phongShader->release();
drawScene()
方法中绑定了相应的着色器。我之所以离开,因为我使用访问者来遍历场景图,我必须包含太多代码。 shader1和shader2都有顶点和片段着色器。纹理仅在片段着色器中读取。即顶点着色器中没有uniform sampler2D tex;
。
loadTexture()
调用在初始化阶段发生,在渲染第一帧之前。
EDIT2:
我终于找到了错误。当我复制代码以创建我已经拥有的纹理时,我忘了使用glGenTextures
生成纹理...我想绑定未生成的纹理对应于将随机数绑定到纹理unit(声明但未定义的变量)。我不确定的是,为什么OpenGL总是使用tex10。即使我移动了tex10的loadTexture行,也会发生这种情况。