Как получить доступ к другой вершине в программе вершинного шейдера в OpenGLES 2? - PullRequest
5 голосов
/ 31 января 2012

Я приложение для Android, я хочу вычислить нормаль поверхности, отклоняющейся от другой вершины этой поверхности. Я не хочу делать это в «основной» программе, потому что это занимает много времени. На самом деле для каждой вершины я передаю 4 массива с плавающей точкой для каждой вексекс:

attribute vec3 a_bottom;
attribute vec3 a_left;
attribute vec3 a_right;
attribute vec3 a_top;

vec3 calculNormal( ) {
    return normalize( cross( (a_left - a_right) , ( a_bottom - a_top ) ) );
}

я знаю, что это очень и очень грязный код, поэтому вместо передачи 4 массивов я хочу сделать это:

vec3 calculNormal( ) {
    vec3 a_left = CURRENT_FLOATBUFFER[ CURRENT_FLOAT_BUFFER_POSITION - 1 ];
    vec3 a_bottom = CURRENT_FLOATBUFFER[ CURRENT_FLOAT_BUFFER_POSITION - X ];
    ...
    return normalize( cross( (a_left - a_right) , ( a_bottom - a_top ) ) );
}

Так возможно ли в программе вершинного шейдера получить доступ к текущему плавающему буферу? Есть ли специальные ключевые слова, такие как currentFloat? Или есть другая возможность, по которой я скучаю?

Ответы [ 2 ]

8 голосов
/ 31 января 2012

Это действительно невозможно.Вершинный шейдер имеет доступ только к текущей обработанной вершине и ее атрибутам.А поскольку OpenGL ES не имеет расширения texture_buffer_object, вы не можете получить доступ к данным VBO внутри шейдера.Таким образом, единственный способ получить доступ к соседям вершины - это явно указать их как атрибуты вершины, как в первом примере.

Но так как ваша геометрия выглядит как прямоугольный шаблон, вы также можете сохранить его втекстура (или скопируйте ее в одну, расширение pixel_buffer_object может помочь с этим, если поддерживается в ES).В этом случае вы можете просто использовать классический фрагментный шейдер GPGPU, который вычисляет нормали для каждого «пикселя» (в данном случае вершины) выходного изображения (в данном случае нормальных данных прямоугольной геометрии) на основе значенийего соседей (доступ к которым осуществляется с помощью простого доступа к текстуре).

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

4 голосов
/ 31 января 2012

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

Неправильный подход. Вычислить нормали и сохранить их вместе с вершинами.

Я не хочу делать это в "основной" программе, потому что это занимает много времени.

Вы не должны пересчитывать нормали для каждого прохода рендеринга. Просто посчитайте их и сохраните. Расчеты в вершинном шейдере не бесплатны. А вычисление нормалей в VS - просто трата вычислительной мощности.

Подсчитайте их, сохраните.

...