GLSL Geometry Shaders и проекционные матрицы - PullRequest
3 голосов
/ 30 июня 2011

Итак, поиграв с этим, я понял, что геометрические шейдеры GLSL работают после того, как входные вершины преобразованы матрицами проекции / просмотра модели. Другими словами, геометрические шейдеры обрабатывают вещи по координатам клипа.

Что если бы я использовал геометрический шейдер для преобразования GL_POINTS, скажем, в кубы, сделанные из GL_TRIANGLES? При расчете вещей по координатам клипа полученная фигура всегда кажется обращенной к вам / игнорирует вращение / масштабирование и т. Д.

Также кажется, что GL_TRIANGLES не поддерживается как один из возможных типов вывода геометрии. Но я все равно попробовал, и это похоже на работу. Я полагаю, это зависит от видеокарты? Можно ли сделать кубики, если GL_TRIANGLES не поддерживается? Сделать треугольные полосы нулевой ширины между пробелами, может быть ??

1 Ответ

4 голосов
/ 30 июня 2011

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

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

Также, похоже, что GL_TRIANGLES не поддерживается как один из возможных типов вывода геометрии.

Вы должны использовать ARB_geometry_shader4, а не функциональность шейдера геометрии ядра. Вам, вероятно, следует избегать этого расширения, если вы можете. Любое оборудование, имеющее геометрические шейдеры, может запускать OpenGL 3.2.

В любом случае, основная функция не поддерживает треугольники в качестве вывода. Он поддерживает точки, линейные и треугольные полосы.

Можно ли создавать кубы, если GL_TRIANGLES не поддерживается?

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

Кроме того, вам следует учесть, что это, вероятно, будет медленно. Геометрические шейдеры не известны высокой скоростью рендеринга.

...