多种纹理与土壤

Multiple textures with SOIL

本文关键字:纹理      更新时间:2023-10-16

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

由于mix操作,这几乎是不可能解释的。如果您想正确调试,请删除该内容并尝试使用FragColor = texture (tex1, TexCoord);FragColor = texture (tex2, TexCoord);。这两种变化中的任何一种产生纯色,都是没有任何东西绑定的纹理单元。

我的猜测是统一 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。还考虑使用不同的名称为纹理和采样器,这整个事情是令人困惑的,因为它永远不清楚你是否在谈论tex1在C代码或tex1在GLSL代码;)