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