Посмотрите на графический конвейер:
Основная задача вершинного шейдера - преобразование / преобразование положения каждой вершины из Пространство камеры (реального мира) в специальном пространстве, называемом Нормализованное пространство устройства .Выходная позиция сохраняется во встроенной переменной int gl_Position
.Каждая вершина выполняется экземпляром вершинного шейдера.Таким образом, если у вас есть 100 вершин, у вас будет 100 выполненных экземпляров вершинного шейдера.
Ваш опубликованный код вершинного шейдера на самом деле не выполняет какого-либо значительного преобразования: gl_position = vPosition
, но это хорошо, поскольку автор предполагал, чтовходные позиции уже находятся в нормализованном пространстве устройства .
Затем в нормализованном пространстве устройства эти позиции собираются в примитивы (например, треугольники).Затем, на этапе Растеризация , эти примитивы разбиваются на фрагменты (для простоты их можно рассматривать как пиксели).Затем каждый фрагмент переходит в фрагментный шейдер, чтобы вычислить цвет этого фрагмента.Каждый фрагмент выполняется экземпляром фрагментного шейдера.
Одновременно в конвейере используется одна и только одна пара вершинных шейдеров и фрагментных шейдеров.Это задается командой OpenGL ES glUseProgram(program)
, в которой программа представляет собой всего лишь пару вершинных и фрагментных шейдеров.
Отправленная вами строка является исходным кодом вершинного шейдера.исходный код соответствующего фрагмента шейдера.Мы используем команды OpenGL ES для создания шейдеров, установки их исходного кода (сегмента строки, который вы видели), компиляции, присоединения их к программе, связывания программы и использования программы.
Для того, чтобы по-настоящему понятьвсе эти вещи, я предлагаю вам прочитать эту книгу .Картинка выше взята из этой книги.