【问题标题】:Multiple textures with SOIL带有 SOIL 的多种纹理
【发布时间】:2015-08-14 23:13:19
【问题描述】:

我想同时将 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);
}

我正在使用 SOIL 库来执行此操作:

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 附加到第一个,反之亦然。我该如何解决这个问题?

【问题讨论】:

    标签: c++ opengl


    【解决方案1】:

    由于mix 操作,这几乎无法解释。如果您想正确调试它,请将其删除并尝试使用FragColor = texture (tex1, TexCoord);FragColor = texture (tex2, TexCoord);。这两种变体中的哪一种产生纯色,这就是没有任何绑定的纹理单元。

    我的猜测是 uniform tex1(默认为 0)具有您加载的第二个纹理。

    SOIL 会将纹理绑定到当前活动的纹理单元,因此请考虑以下内容:

    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 将绑定到0tex2 将绑定到1。还要考虑为纹理和采样器使用不同的名称,这整个事情令人困惑,因为永远不清楚您是在 C 代码中谈论 tex1 还是在 GLSL 代码中谈论 tex1 ;)

    【讨论】:

    • 谢谢!我按照你的方法,第二个采样器加载了第一个纹理。是否需要任何其他绑定?
    • Nvm,我需要使用glUniform1i和glGetUniformLocation来设置sampler2D和textures的连接。
    猜你喜欢
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    相关资源
    最近更新 更多