2015-08-14 75 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和纹理之间的连接。 –