#opengl #graphics #glsl
#opengl #графика #glsl
Вопрос:
У меня есть следующий вершинный шейдер GLSL:
attribute vec3 a_vTangent;
attribute vec3 a_vBinormal;
attribute vec2 a_vCustomParams;
varying vec3 i_vTangent;
varying vec3 i_vBinormal;
varying vec4 i_vColor;
varying vec2 i_vCustomParams;
void main()
{
i_vTangent = a_vTangent;
i_vBinormal = a_vBinormal;
i_vColor = gl_Color;
//i_vCustomParams = a_vCustomParams;
gl_Position = gl_Vertex;
}
Если я раскомментирую строку i_vCustomParams = a_vCustomParams;
, ничего из того, что было отрисовано с помощью этого шейдера, больше не отрисовывается, никаких ошибок GL, ошибок компиляции шейдера или ссылок. Это меня удивляет, поскольку геометрический шейдер еще даже не использует i_vCustomParams, и, более того, два других атрибута вершины ( a_vTangent
и a_vBinormal
) работают отлично.
Я знаю, что это правильно, но в любом случае это моя настройка vertex
layout = new VertexLayout(new VertexElement[]
{
new VertexPosition(VertexPointerType.Short, 3),
new VertexAttribute(VertexAttribPointerType.UnsignedByte, 2, 3), //2 elements, location 3
new VertexColor(ColorPointerType.UnsignedByte, 4),
new VertexAttribute(VertexAttribPointerType.Byte, 4, 1), //4 elements location 1
new VertexAttribute(VertexAttribPointerType.Byte, 4, 2), //4 elements, location 2
});
для этой структуры vertex:
struct CubeVertex : IVertex
{
public ushort3 Position;
public byte2 Custom;
public byte4 Color;
public sbyte4 Tangent;
public sbyte4 Binormal;
}
Есть идеи, почему это происходит?
Комментарии:
1. На какую версию GLSL вы ориентируетесь? Платформа и поставщик реализации GL?
Ответ №1:
Когда вы раскомментируете строку, ваш вершинный шейдер начинает думать, что пользовательский атрибут необходим (потому что его вывод зависит от этого атрибута), и, следовательно, программа-шейдер рассматривает этот атрибут как используемый. Это, как следствие, может изменить присвоение входных атрибутов индексам (если вы не заставляете это делать, вызывая glBindAttribLocation). В итоге вы передаете свои данные в неправильные ячейки атрибутов, что приводит к дрянному (или пустому) выводу.
Решение: либо принудительно укажите местоположения атрибутов перед привязкой программы, либо запросите GL для автоматически назначенных местоположений перед передачей ваших данных.
Комментарии:
1. В этом и была проблема, я заставлял их, но я не понимал, что мне нужно было делать это перед компоновкой.