GLSL Geometry shader и общие атрибуты вершин - PullRequest
6 голосов
/ 30 июня 2011

Итак, я уже некоторое время пытаюсь передать массив атрибутов вершин в геометрический шейдер.Это массив с плавающей точкой (где атрибут каждой вершины - просто значение с плавающей точкой)

Теперь, когда я помещаю это в геометрический шейдер:

attribute float nodesizes;

Компилятор шейдера жалуется:

OpenGL requires geometry inputs to be arrays

Как мне точно передать это?

Кроме того, вот мой код для установки атрибута вершины:

glBindAttribLocation(programid, 1, "nodesizes");
glVertexAttribPointer(1, 1, GL_FLOAT, GL_FALSE, 0, array);
glEnableVertexAttribArray(1);

Я что-то не так делаю?

Ответы [ 2 ]

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

Геометрический шейдер не получает атрибутов.Вершинный шейдер получает attribute с и выдает varying с (говоря в старом синтаксисе).Затем их можно прочитать в геометрическом шейдере, но в виде массива, поскольку один вызов геометрического шейдера следует за несколькими вызовами вершинного шейдера.Примерно так:

вершинный шейдер:

attribute float nodesize;
varying float vNodesize;

void main() {
    ...
    vNodesize = nodesize;
    ...
}

геометрический шейдер:

varying float vNodesize[];

void main() {
    ...vNodesize[i]...
}

Имена произвольны, но, конечно, имена вариаций должны совпадатьв обоих шейдерах.Надеюсь, вы не просто испортили термины вершинный и геометрический шейдеры.

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

Какую версию open gl вы используете?

Из спецификации языка Open GL (4.10.6)

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

Это означает, что вам нужно указать примитив типа witch (точка, линия, треугольник, четверка) геометрия предполагает.

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

В результате код шейдера geom должен начинаться так:

varying float vNodesize[];

void main() {
    ...vNodesize[i]...
}

Где i = 0 для точек= 1 для строк и т. Д.

...