gpt4 book ai didi

c++ - 带有 SOIL 的多重纹理

转载 作者:行者123 更新时间:2023-11-28 06:07:50 26 4
gpt4 key购买 nike

我想同时加载 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);。无论这两种变体中的哪一种产生纯色,都是没有任何绑定(bind)的纹理单元。

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

SOIL 会将纹理绑定(bind)到当前事件的纹理单元,因此考虑这样的事情:

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

关于c++ - 带有 SOIL 的多重纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32019883/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com