多种纹理与土壤
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
将绑定到0, tex2
将绑定到1。还考虑使用不同的名称为纹理和采样器,这整个事情是令人困惑的,因为它永远不清楚你是否在谈论tex1
在C代码或tex1
在GLSL代码;)
相关文章:
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- SFML纹理像播放器
- OpenGL大的3D纹理(>2GB)非常慢
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 着色器纹理值与创建纹理时写入的值不同
- OpenGL将纹理四边形渲染为(0,0)
- 宽度为奇数的16位纹理为片状
- 使用 CUDA 和纹理进行图像减法
- 在不使用统一的情况下将纹理传递给 GLSL 着色器?
- 将使用太多的纹理插值器 - 带旋转的着色器
- dx11 渲染到纹理仅显示透明颜色
- OpenGL 4.3 错误地将第 4 个纹理坐标映射到与第 3 个纹理坐标相同的位置
- 如何使用 DXGI 格式DXGI_FORMAT_R1_UNORM创建 2D 纹理?
- 纹理单位重叠?渲染了错误的纹理
- SFML 纹理变换(放大)
- SDL2 二维纹理分配/池化
- Qt OpenGL 渲染到纹理性能问题
- 为什么我会得到黑色纹理?
- glBindTexture 是否覆盖活动纹理单元的内容
- 无法将图像加载到纹理矢量 (SFML)