【发布时间】:2023-12-23 12:50:01
【问题描述】:
我正在尝试在 OpenGL 中制作一个场景来模拟来自太空的地球。我现在有两个球体,一个用于地球,另一个用于云。地球和云球对象有自己的着色器程序来保持简单。地球着色器程序需要 4 个纹理(白天、夜晚、光谱贴图和法线贴图),而云着色器程序需要 2 个纹理(云图和法线贴图)。我有一个具有渲染函数的对象类,在该函数中我使用以下逻辑:
//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个纹理绑定到从GL_TEXTURE0开始的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);
}
当我这样做时,第一个球体(地球)中的所有纹理都成功加载,但在第二个球体中我没有纹理,我只得到一个黑色球体。我的问题是,如果我为每个对象使用不同的着色器程序,我应该如何管理多个纹理和采样器?
【问题讨论】:
标签: c++ opengl opengl-es glsl shader