Refrence
- https://blog.csdn.net/mumuzi_1/article/details/62047112
- http://www.dovov.com/gluniform1i.html
- GLES2.0中文API-glUniform
- https://docs.gl/es2/glUniform
同时有两个纹理时,为了使用第二个纹理(以及第一个),我们必须改变一点渲染流程。
先绑定两个纹理对象到对应的纹理单元,然后定义哪个uniform采样器对应哪个纹理单元:
注意,我们使用glform1i设置uniform采样器的位置值,或者说纹理单元。
通过glUniform1i的设置,我们保证每个uniform采样器对应着正确的纹理单元。
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture1);
glUniform1i(glGetUniformLocation(ourShader.Program, "ourTexture1"), 0);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, texture2);
glUniform1i(glGetUniformLocation(ourShader.Program, "ourTexture2"), 1);
glBindVertexArray(VAO);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
//获取shader里面uniform变量的地址
int tex1_location=glGetUniformLocation(m_uProgram, "tex1");
int tex2_location=glGetUniformLocation(m_uProgram, "tex2");
int tex3_location=glGetUniformLocation(m_uProgram, "tex3");
//对这几个纹理采样器变量进行设置
glUniform1i( (GLint)tex1_location, 0);//对应纹理第一层
glUniform1i( (GLint)tex2_location, 1);//对应纹理第二层
glUniform1i( (GLint)tex3_location, 2);//对应纹理第三层
//后面渲染的时候,设置三成纹理
glActiveTexture(GL_TEXTURE0 + 0);
glBindTexture(GL_TEXTURE_2D, texture1Id);
glActiveTexture(GL_TEXTURE0 + 1);
glBindTexture(GL_TEXTURE_2D, texture2Id);
glActiveTexture(GL_TEXTURE0 + 2);
glBindTexture(GL_TEXTURE_2D, texture3Id);
//所以glActiveTexture第几层,并不表示是shader里面第几个采样器,
//中间有glUniform1i进行纹理层和采样器地址进行绑定
Q:
根据上述代码,是否意味着,如果我在glUniform1i
使用数字i,那么我必须使用glActiveTexture(GL_TEXTURE i ) ?
A:
是的。 采样器的统一值是指纹理单元,而不是纹理对象(纹理ID)。
在实际测试中有个不寻常的地方:GL_TEXTURE0对应0 ~ 31,GL_TEXTURE1 ~ GL_TEXTURE31对应1 ~ 31
。