Переменные выходные примитивы подсчитывают в геометрическом шейдере GLSL - PullRequest
1 голос
/ 30 октября 2011

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

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 (это самая стабильная версия из всех, что я пробовал ...)

1 Ответ

4 голосов
/ 30 октября 2011

Компоновка шейдера определяется во время компиляции, и ее нельзя параметрировать таким образом. Для каждого различия в макете вам нужен собственный шейдер. Так что вы можете изменить исходный код шейдера перед загрузкой. Примерно так:

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

uniform int maxOutputVert;

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

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

...