Как получить несколько вершин в шейдере геометрии в GLSL

Мне нужно получить 4 вершины после обработки вершинным шейдером. Примитивный (квадратный) рисунок с целью: GL_TRIANGLE_STRIP.

Мой код:

layout(lines_adjacency) in;
layout(triangle_strip, max_vertices = 4) out;

in vs_output
{
   vec4 color;
} gs_in[];

out gs_output
{
   vec2 st   ;
   vec4 color;
} gs_out;

void main()
{
   gl_Position  = gl_in[0].gl_Position;
   gs_out.st    = vec2(0.0f, 0.0f);
   gs_out.color = gs_in[0].color;
   EmitVertex();

   gl_Position  = gl_in[1].gl_Position;
   gs_out.st    = vec2(0.0f, 1.0f);
   gs_out.color = gs_in[1].color;
   EmitVertex();

   gl_Position  = gl_in[2].gl_Position;
   gs_out.st    = vec2(1.0f, 0.0f);
   gs_out.color = gs_in[2].color;
   EmitVertex();

   gl_Position  = gl_in[3].gl_Position;
   gs_out.st    = vec2(1.0f, 1.0f);
   gs_out.color = gs_in[3].color;
   EmitVertex();

   EndPrimitive();
}

ошибка выдачи компилятора: "индекс массива выходит за пределы"

как я могу получить 4 вершины в шейдере геометрии?


person toodef    schedule 03.04.2013    source источник
comment
Ваш код не должен компилироваться, так как вы не объявили квалификатор макета ввода.   -  person Nicol Bolas    schedule 04.04.2013
comment
Никол, но я могу получить 4 вершины, если использую lines_adjacency. Но это не удовлетворяет GL_TRIANGLE_STRIP. Я понял, что что-то не так?   -  person toodef    schedule 04.04.2013
comment
Измените свой геометрический шейдер на код, который компилируется. Я не могу дать вам совет по явно сломанному коду.   -  person Nicol Bolas    schedule 04.04.2013
comment
Я сделал это. Второй вариант, когда позиция транслируется из vs в структуру и на gs выполняется gl_Position = gs_in[n].pos; Спасибо!   -  person toodef    schedule 04.04.2013


Ответы (1)


Примитивный (квадратный) рисунок с целью: GL_TRIANGLE_STRIP.

Тип примитива должен соответствовать типу вашего входного примитива. Просто нарисуйте с помощью GL_LINES_ADJACENCY, чтобы каждые 4 вершины были независимыми четырехугольниками.

Более того, перестаньте убивать свою производительность геометрическим шейдером. Вам лучше просто передать координату текстуры в качестве входных данных. Или, в противном случае, сделать это в вершинном шейдере:

out vec2 st;
const vec2 texCoords[4] = vec2[4](
  vec2(0.0f, 0.0f),
  vec2(0.0f, 1.0f),
  vec2(1.0f, 0.0f),
  vec2(1.0f, 1.0f)
);

void main()
{
  ...

  st = texCoords[gl_VertexID % 4];

  ...
}

Предполагая, что вы визуализировали это с помощью glDrawArrays, а не glDrawElements.

person Nicol Bolas    schedule 04.04.2013
comment
@toodef: В общем, если вы когда-нибудь думали, что добавление шейдера геометрии улучшит производительность, вы, вероятно, ошибаетесь. Не все время, но обычно. - person Nicol Bolas; 04.04.2013
comment
Я добавляю геометрический шейдер для генерации рекламных щитов. Но геометрический шейдер не вызывается по умолчанию в конвейере? - person toodef; 04.04.2013
comment
@toodef: Нет , это не так. - person Nicol Bolas; 04.04.2013