在编写的Shader中的变量与GPU插槽相对应,而在纹理设置时,有额外的一组插槽,叫做纹理单元。
在绑定纹理时,设置一个map容器, 表示某个名字的纹理在加载过后对应的纹理数据是什么
void Shader::SetTexture(const char*name, const char *imagePath) {
auto iter = mUniformTextures.find(name);
if (iter==mUniformTextures.end() ){
GLint location = glGetUniformLocation(mProgram, name);
if (location != -1) {
UniformTexture* t = new UniformTexture;
t->mLocation = location;
t->mTexture = CreateTexture2DFromBMP(imagePath);
mUniformTextures[name]=t;
}
}
else {
glDeleteTextures(1, &iter->second->mTexture);
iter->second->mTexture= CreateTexture2DFromBMP(imagePath);
}
}
在画图之前 ,指定纹理数据的初始化操作如下::
纹理对象是指图片, 可以i通过
glActiveTexture(GL_TEXTURE0 + iIndex);
来激活纹理一个纹理单元(从0开始);
之后通过glBind将某个纹理对象设置为当前纹理对象,并指派个这个纹理单元
glBindTexture(GL_TEXTURE_2D, iter->second->mTexture);
之后通过glUnifrom1i表示 某个插槽需要从第几个纹理单元中采集纹理。
又因为插槽关联了Shader中的Sample2D,因此Sample2D知道去哪里采集纹理
代码如下:
https://github.com/ycb577114589/Shader_openGL/tree/master/Multi_Texture