Я пытаюсь сделать glsl-шейдер, который может отключить текстурирование и/или раскраску (я хочу, чтобы можно было оттенять текстуру). Я могу отключить атрибут, выполнив glDisableVertexAttribArray(x)
, но мне интересно, как будут выглядеть значения в шейдере. будут ли они 0
?Значение для отключенных атрибутов в glsl-шейдере
Кроме того, есть ли способ проверить, включен ли атрибут внутри шейдерного кода? Я думал о форме (возможно, int
) для хранения флагов и проверки их в шейдере, но для этого потребовались бы if
заявлениях, и я думаю, что слышал, что это не рекомендуется.
Вот мои шейдеры, если вы хотите сослаться на них, я сейчас работаю над флагом int
, о котором я говорил.
Vertex шейдеров:
#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);
}
}
Итак, если я правильно понимаю, я могу установить значение по умолчанию для моих атрибутов, когда они отключены с помощью 'glVertexAttrib2 (,,)' (для vec2) и использовать это в моем шейдере? Это немного упростит мои шейдеры. Что бы сказать, если бы у меня были 'vec2 pos2' и' vec3 pos3', добавьте их вместе, чтобы получить окончательную выемку вершин? Я бы установил тот, который не используется для '0', и это не повлияет на другое. –
Я не понимаю, почему вам нужно 'pos2' и' pos3' вообще. В вашем шейдере вы никогда не нуждаетесь в них одновременно, поэтому нет необходимости когда-либо иметь два атрибута позиции. – derhass
Я хочу сделать шейдер, который может обрабатывать 2d и 3d модели! Смогу ли я использовать атрибут vec3 для моей модели vec2? –