2015-08-14 57 views
0

多重紋理我想在同一時間加載2質地到我的片段着色器:與土壤

in vec2 TexCoord; 
layout (location = 0) out vec4 FragColor; 

uniform sampler2D tex1; 
uniform sampler2D tex2; 

void main() { 
    FragColor = mix(texture(tex1, TexCoord),texture(tex2, TexCoord), 0.3); 
} 

我使用土壤庫做到這一點:

GLuint tex1 = SOIL_load_OGL_texture("rock.bmp", SOIL_LOAD_AUTO, 
           SOIL_CREATE_NEW_ID, SOIL_FLAG_INVERT_Y); 
GLuint tex2 = SOIL_load_OGL_texture("lena512.bmp", SOIL_LOAD_AUTO, 
           SOIL_CREATE_NEW_ID, SOIL_FLAG_INVERT_Y); 

但是隻有第二紋理顯示出來,而不是第一個。我意識到我需要執行glUniform1i將sampler2D tex1附加到第一個,反之亦然。我如何解決這個問題?

回答

1

由於mix操作,這幾乎不可能解釋。如果你想正確調試這個,請刪除它並嘗試使用FragColor = texture (tex1, TexCoord);FragColor = texture (tex2, TexCoord);。無論那兩種變化產生一種純色,那就是沒有任何約束的紋理單元。

我的猜測是,均勻tex1(默認情況下)具有您所加載的第二個紋理。

土壤將綁定紋理到當前的活動紋理單元,因此考慮這樣的事情,而不是:

glActiveTexture (GL_TEXTURE0); 
GLuint tex1 = SOIL_load_OGL_texture("rock.bmp", SOIL_LOAD_AUTO, 
            SOIL_CREATE_NEW_ID, SOIL_FLAG_INVERT_Y); 

glActiveTexture (GL_TEXTURE1); 
GLuint tex2 = SOIL_load_OGL_texture("lena512.bmp", SOIL_LOAD_AUTO, 
            SOIL_CREATE_NEW_ID, SOIL_FLAG_INVERT_Y); 

現在tex1將被綁定到和tex2將被綁定到。也考慮使用紋理和採樣器的不同名稱,這整個事情是令人困惑的,因爲它不清楚你是在談論在C代碼tex1或在GLSL代碼tex1;)

+0

謝謝!我遵循你的方法,第二個採樣器加載第一個紋理。還有其他必要的綁定嗎? –

+0

Nvm,我需要使用glUniform1i和glGetUniformLocation來設置sampler2D和紋理之間的連接。 –