Число переменных выходных примитивов в геометрическом шейдере GLSL

Я хочу сделать что-то подобное в своем шейдере геометрии:

uniform int maxOutputVert;

layout(points) in;
layout(points, max_vertices=maxOutputVert) out;

Однако при компиляции получаю ошибку:

Error: error(#132) Syntax error: 'maxOutputVert' parse error

и шейдер не компилируется.

Я мог бы понять, что для управления памятью может быть слишком сложно, если бы эта переменная менялась при каждом запуске шейдера, но здесь это был бы постоянный тщательный единичный вызов отрисовки, потому что юниформы постоянны. Это также не работает, если я определяю некоторую целочисленную константу прямо в шейдере и использую ее как счетчик max_vertices:

const int a = 5;
layout(points, max_vertices=a) out;

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

glGetIntegerv(GL_MAX_GEOMETRY_OUTPUT_VERTICES, &maxoutput);

Редактировать: извините, я забыл упомянуть, что я использую ATI/AMD, а версия Catalyst 2010.1105.19.41785 (это самая стабильная, которую я пробовал...)


person Raven    schedule 30.10.2011    source источник
comment
Вы понимаете, что это просто максимальное число, которое вы передаете в макете. Геометрический шейдер по-прежнему может условно создавать переменное количество выходных примитивов, если они находятся в пределах указанного диапазона.   -  person kvark    schedule 30.10.2011
comment
Это правда, но как на самом деле это работает? Если я определю max_vertices равным 1000 и создам только 20 примитивов, будет ли он потреблять память для 1000 или 20 вершин и их вариантов?   -  person Raven    schedule 30.10.2011
comment
Я почти уверен, что за такое завышение есть штраф, но я точно не знаю.   -  person kvark    schedule 31.10.2011


Ответы (1)


Макет шейдера определяется во время компиляции и не может быть параметризован таким образом. Для каждой разницы в макете нужен свой шейдер. Итак, что вы можете сделать, так это изменить исходный код шейдера перед загрузкой. Что-то вроде этого:

Начните с исходного кода шейдера шаблона:

uniform int maxOutputVert;

layout(points) in;
layout(points, max_vertices=$MAXOUTPUTVERTICES$) out;

И перед отправкой этого в glShaderSource замените строку $MAXOUTPUTVERTICES$ числом.

person datenwolf    schedule 30.10.2011