我想在OpenGL中做一个场景来模拟来自太空的地球。我现在有两个球体,一个用于地球,另一个用于云层。地球和云球对象有自己的着色器程序来保持简单。地球着色器程序需要4个纹理(日,夜,specmap和normalmap),云着色器程序需要2个纹理(云图和法线贴图)。我有具有呈现功能的对象类,并在该功能的我使用这个逻辑:从GL_TEXTURE0开始带有多个着色器程序的OpenGL多纹理
//bind the current object's texture
for (GLuint i = 0; i < texIDs.size(); i++){
glActiveTexture(GL_TEXTURE0 + i);
if (cubemap)
glBindTexture(GL_TEXTURE_CUBE_MAP, texIDs[i]);
else
glBindTexture(GL_TEXTURE_2D, texIDs[i]);
}
if (samplers.size()){
for (GLuint i = 0; i < samplers.size(); i++){
glUniform1i(glGetUniformLocation(program, samplers[i]), i);
}
}
它从第0纹理单元开始,并结合纹理的N个以N个纹理单元。然后在着色器程序中将采样器从0开始绑定到N.采样器是由我公司提供,同时加载纹理:
void Object::loadTexture(const char* filename, const GLchar* sampler){
int texID;
texID = SOIL_load_OGL_texture(filename, SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_MIPMAPS | SOIL_FLAG_TEXTURE_REPEATS);
if(texID == 0){
cerr << "SOIL error: " << SOIL_last_result();
}
cout << filename << " Tex ID: " << texID << endl;
texIDs.push_back(texID);
samplers.push_back(sampler);
//glBindTexture(GL_TEXTURE_2D, texID);
}
当我做到这一点,在第一球(地球)所有的纹理被加载成功,但在秒球我没有得到任何纹理和我刚刚得到一个黑色的球体。我的查询是,如果我为每个对象使用不同的着色器程序,我应该如何管理多个纹理和采样器?
的例子可以告诉你你怎么绑定纹理着色器上使用glActiveTexture和glBindTexture调用C++的一面呢? – pslayer89
@ pslayer89增加了一个例子 – Spektre
谢谢,我今天晚些时候会尝试一下结果。 – pslayer89