前言
纹理: GL_TEXTURE_2D 内部还有16单元 GL_TEXTURE0 ~ GL_TEXTURE16
源代码地址
一 代码
1. 产生材质
1.1 QOpenGLTexture(QImage()) 这种方法产生材质
1.2 设置 textureWall->bind(0) 绑定到材质槽上
1.3 通知shader变量是对应哪个材质 shaderPorgram.setUniformValue(“ourTexture1”,0);
textureWall = new QOpenGLTexture(QImage(":/image/wall.png").mirrored());
textureLe = new QOpenGLTexture(QImage(":/image/le.ico").mirrored());
shaderProgram.bind();
shaderPorgram.setUniformValue("textureWall",0);
shaderPorgram.setUniformValue("textureLe",1);
//glUniform1i(glGetUniformLocation(shaderProgram.ID,"textureWall"),0);
//glUniform1i(glGetUniformLocation(shaderProgram.ID,"textureLe"),1);
textureWall->bind(0);
textureLe->bind(1);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D,textureWall);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D,textureLe);
shaderProgram.bind();
glDrawWlements(GL_TRIANGELS,6,GL_UNSINGED_INT,0);
2.解析材质"槽"
- 材质GL_TEXTURE_2D实际上有16个槽
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D,texture1);
这两句就是为了将材质切换+绑定到特定槽上
2.如果不切换,当前就是0
3.fragment shader 设置使用材质(用哪个槽)
#version 330 core
out vec4 FragColor;
in vec4 ourcolor;
in vec2 texcoord;
uniform sampler2D textureWall;
uniform sampler2D textureLe;
void main()
{
FragColor = mix( texture2D (textureWall,texcoord),texture2D (textureLe,texcoord),0.5);
}
- sample2D是采样器,默认构造参数会把变量都初始化为0
- CPU端,可以将textureWall 和 textureLe改值
shaderPorgram.setUniformValue(“textureWall”,0);
shaderPorgram.setUniformValue(“textureLe”,1);
否则:
sampler2D textureWall; // textureWall=0
sampler2D textureLe; //textureLe=0