GLSL, добавление одной строки ничего не рисует

#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. В этом и была проблема, я заставлял их, но я не понимал, что мне нужно было делать это перед компоновкой.