opengl - 检查sampler2D是否为空

标签 opengl glsl

我正在设计一个 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/

相关文章:

c++ - 好的 Linux/Ubuntu OpenGL 教程?

c++ - 变量改变它的值

opengl - GL_CURRENT_VERTEX_ATTRIB - 文档说明

java - LWJGL 不能在 NetBeans 之外工作

c - glGetUniform 为事件制服返回 -1

c - 查找 OpenGL 垂直回扫时序

c++ - glsl - 获取像素颜色 [像素着色器]

android - 使用不匹配的驱动程序版本启用 glsl 扩展时崩溃

performance - "Intrinsics"可能在 OpenGL 上的 GPU 上吗?

c++ - OpenGL 灰度纹理作为浮点格式错误