【发布时间】:2015-11-15 16:42:56
【问题描述】:
我正在尝试制作一个可以关闭纹理和/或着色的 glsl 着色器(我希望能够为纹理着色)。我可以通过glDisableVertexAttribArray(x) 禁用属性,但我想知道着色器中的值会是什么样子。他们会是0吗?
另外,有没有办法检查着色器代码中是否启用了某个属性?我想到了一个制服(可能是int)来存储标志并在着色器中测试它们,但这需要if 语句,我想我听说不推荐这样做。
这是我的着色器,如果你想参考它们,我目前正在处理我所说的 int 标志。
顶点着色器:
#version 450
layout(location=0) uniform mat4 projection_matrix;
layout(location=1) uniform mat4 view_matrix;
layout(location=2) uniform mat4 model_matrix;
// 0b0000 0000 0000 0 unused
// 0 textures
// 0 colors
// 0 2d/3d
layout(location=3) uniform uint mode;
layout(location=0) in vec4 vert_tex_coord;
layout(location=1) in vec4 vert_color;
layout(location=2) in vec3 vert_2_position;
layout(location=3) in vec3 vert_3_position;
out vec4 vert_frag_color;
out vec2 vert_frag_tex_coord;
vec4 transform(vec4 v)
{
return projection_matrix * view_matrix * model_matrix * v;
}
void main()
{
if ((mode & 1) > 0)
{
gl_Position = transform(vec4(vert_3_position, 1.0));
}
else
{
gl_Position = transform(vec4(vert_2_position, 0.0, 1.0));
}
if ((mode & 2) > 0)
{
vert_frag_color = vert_color;
}
if ((mode) & 4) > 0)
{
vert_frag_tex_coord = vert_tex_coord;
}
}
片段着色器:
#version 450
layout(location=3) uniform uint mode;
uniform sampler2D texture_0;
in vec4 vert_frag_color;
out vec2 vert_frag_tex_coord;
out vec4 frag_color;
void main()
{
if ((mode & 2) > 1)
{
frag_color = vert_frag_color;
}
if ((mode) & 4) > 1)
{
frag_color = texture(texture_0, vert_frag_tex_coord);
}
}
【问题讨论】:
标签: opengl glsl fragment-shader vertex-shader opengl-4