Геометрия GLSL Geometry Shader: итерация по всей сетке

StackOverflow https://stackoverflow.com/questions/7302293

  •  22-10-2019
  •  | 
  •  

Вопрос

Моя цель состояла в том, чтобы раскрасить вершины в соответствии с их заказом

РЕДАКТИРОВАТЬ: Долгое время.

Я использовал следующий код

#version 120
#extension GL_EXT_geometry_shader4 : enable
void main( void ) {
    for( int i = 0 ; i < gl_VerticesIn ; i++ ) {
        gl_FrontColor = vec4(float(i)/float(gl_VerticesIn),0.0,0.0,1.0);
        gl_Position = gl_PositionIn[i];
        EmitVertex();
    }
}

Но все вершины нарисованы черными, кажется, что я Всегда оценивается как 0, я что -то упускаю или делаю это неправильно?

РЕДАКТИРОВАТЬ: Представьте, что мета-прозрачная вырубка: как подарить все геометрию модели ME в одно геометрический вызов шейдера, чтобы MainLoop итерация по сравнению с всеми вершинами, а не для каждого треугольника.

Это было полезно?

Решение

Вы не позволяете ни одному геометрическому шейдеру итерации по всем вашим вершинам, это требуется для каждого оригинального примитива (точка, линия, треугольник, ...).

Решение намного проще: в вершинном шейдере (который фактически требуется для каждой вершины) вы можете прочитать специальную переменную gl_VertexID, который содержит индекс вершины. Этот индекс либо просто счетчик, увеличенный для каждой вершины (при использовании glDrawArrays) и сбросить каждым вызовом рисования или индексом из массива индексов (если используют использование glDrawElements).

РЕДАКТИРОВАТЬ: Относительно долгой цели. Не напрямую, но вы можете использовать буфер текстуры для этого. Это в основном позволяет вам получить прямой линейный массив к буферному объекту (в вашем случае вертексный буфер), который вы можете просто индекс с этим индексом вершины. Но также могут быть и другие способы этого, что может быть достаточно для другого вопроса.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top