为了使用第二个纹理(以及第一个),我们必须改变一点渲染流程, 先绑定两个纹理到对应的纹理单元,然后定义哪个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进行纹理层和采样器地址进行绑定
OpenGL——glUniform1i 用法
最新推荐文章于 2024-06-24 17:56:43 发布