我正在设计一个 Sprite 类,如果没有加载纹理,我想仅显示一种颜色。
这是我的顶点着色器
#version 330 core
layout (location = 0) in vec4 vertex; // <vec2 pos, vec2 tex>
out vec2 vs_tex_coords;
uniform mat4 model;
uniform mat4 projection;
void main()
{
vs_tex_coords = vertex.zw;
gl_Position = projection * model * vec4(vertex.xy, 0.0, 1.0);
}
以及片段着色器:
#version 330 core
in vec2 vs_tex_coords;
out vec4 fs_color;
uniform sampler2D image;
uniform vec3 sprite_color;
void main()
{
fs_color = vec4(sprite_color, 1.0) * texture(image, vs_tex_coords);
}
我的问题是,如果我不绑定(bind)纹理,它只会显示一个黑色 Sprite 。我认为问题在于我的片段着色器中的纹理函数返回 0,并搞砸了所有公式。
有没有办法知道sampler2D是否未初始化或为空,并只返回sprite_color?
最佳答案
采样器不能为“空”。有效的纹理必须绑定(bind)到每个采样器引用的纹理单元,以便渲染具有明确定义的行为。
但这并不意味着您必须从绑定(bind)在那里的纹理读取。使用 uniform
值来告诉着色器是否从纹理读取是完全有效的。
但是您仍然必须在那里绑定(bind)一个简单的 1x1 纹理。事实上,您可以在采样器上使用textureSize
;如果它是 1x1 纹理,则不必费心读取它。请注意,这可能比使用uniform
慢。
关于opengl - 检查sampler2D是否为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42238177/