我想在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