GLSL, добавление одной строки ничего не рисует - PullRequest
0 голосов
/ 26 апреля 2011

У меня есть следующий вершинный шейдер 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) работают отлично.

Я знаю, что это правильно, но при условииВо всяком случае, моя установка вершины

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
});

для этой структуры вершины:

struct CubeVertex : IVertex
{
    public ushort3 Position;
    public byte2 Custom;
    public byte4 Color;
    public sbyte4 Tangent;
    public sbyte4 Binormal;
}

Есть идеи, почему это происходит?

1 Ответ

4 голосов
/ 26 апреля 2011

Когда вы раскомментируете строку, ваш вершинный шейдер начинает думать, что пользовательский атрибут необходим (поскольку его вывод зависит от этого атрибута), и, следовательно, программа шейдера считает этот атрибут использованным.Это, как следствие, может изменить назначения входных атрибутов на индексы (если вы не форсируете это, вызывая glBindAttribLocation).Таким образом, вы заканчиваете передачей своих данных в неправильные слоты атрибутов, что приводит к мусорному (или пустому) выводу.

Решение: Либо форсируйте расположения атрибутов перед связываниемпрограмма или запрос GL для автоматически назначенных местоположений перед передачей ваших данных.

...