Как работают шейдеры в Android OpenGL? - PullRequest
0 голосов
/ 21 мая 2019

Как при разработке Andoird OpenGL работают созданные вершинные и фрагментные шейдеры?

Я в основном следую примеру руководства для разработчиков Android на OpenGL ES.Однако при создании шейдеров сначала создается строка, включающая сегмент кода.Я пытался понять, как этот строковый сегмент связан с оставшимся процессом, но не смог.

 private final String vertexShaderCode =
            "attribute vec4 vPosition;"+
            "void main(){"+
            "   gl_position = vPosition;"+
            "}";

1 Ответ

0 голосов
/ 21 мая 2019

Посмотрите на графический конвейер:

enter image description here

Основная задача вершинного шейдера - преобразование / преобразование положения каждой вершины из Пространство камеры (реального мира) в специальном пространстве, называемом Нормализованное пространство устройства .Выходная позиция сохраняется во встроенной переменной int gl_Position.Каждая вершина выполняется экземпляром вершинного шейдера.Таким образом, если у вас есть 100 вершин, у вас будет 100 выполненных экземпляров вершинного шейдера.

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

Затем в нормализованном пространстве устройства эти позиции собираются в примитивы (например, треугольники).Затем, на этапе Растеризация , эти примитивы разбиваются на фрагменты (для простоты их можно рассматривать как пиксели).Затем каждый фрагмент переходит в фрагментный шейдер, чтобы вычислить цвет этого фрагмента.Каждый фрагмент выполняется экземпляром фрагментного шейдера.

Одновременно в конвейере используется одна и только одна пара вершинных шейдеров и фрагментных шейдеров.Это задается командой OpenGL ES glUseProgram(program), в которой программа представляет собой всего лишь пару вершинных и фрагментных шейдеров.

Отправленная вами строка является исходным кодом вершинного шейдера.исходный код соответствующего фрагмента шейдера.Мы используем команды OpenGL ES для создания шейдеров, установки их исходного кода (сегмента строки, который вы видели), компиляции, присоединения их к программе, связывания программы и использования программы.

Для того, чтобы по-настоящему понятьвсе эти вещи, я предлагаю вам прочитать эту книгу .Картинка выше взята из этой книги.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...