Лучшие методы OpenGL ES 2.0 Shader
Я искал примеры шейдеров в OpenGL, и я видел несколько разных стилей. Некоторые шейдеры специально используют встроенные типы (например, gl_Vertex) для передачи данных в код приложения и из шейдера и из него.
Некоторые шейдеры используют разные типы для передачи данных из вершины в шейдер фрагмента вместо gl_Position и gl_FragColor.
Некоторые шейдеры используют префиксы "in" и "out" для указания передачи данных:
in vec3 vertex;
void main() {
gl_Position = projection_matrix * modelview_matrix * vec4(vertex, 1.0);
}
... а другие используют атрибуты:
attribute vec4 vertex_attrib;
attribute vec4 tex_coord_attrib;
attribute vec4 color_attrib;
uniform mat4 mvp_matrix;
uniform mat4 texture_matrix;
varying vec4 frag_color;
varying vec2 tex_coord;
void main(void)
{
gl_Position = mvp_matrix * vertex_attrib;
vec4 transformed_tex_coord = texture_matrix * tex_coord_attrib;
tex_coord = transformed_tex_coord.st / transformed_tex_coord.q;
frag_color = color_attrib;
}
Мой вопрос: какой предпочтительный способ в GLES 2.0 написать шейдеры? Есть ли руководство по лучшей практике? Может ли кто-нибудь представить пример вершинного и фрагментарного шейдера, который является ярким примером "что делать"?
Спасибо.
Ответы
Ответ 1
- В "ES 2.0" нет gl_Vertex. Все предоставленные вами атрибуты являются обычными.
- gl_Position - это не вариант в ES 2, а требование. Узнайте о конвейере OpenGL, чтобы понять, почему. Подсказка: он может быть необязательным только тогда, когда растеризатор отключен (например, преобразование обратной связи), но это не поддерживается в ES.
- В атрибутах вершин ES 2.0 должно быть значение "атрибут", и изменения должны быть объявлены как "переменные". Использование "in" и "out" вместо этого является привычкой, разработанной в OpenGL 3+ и не может применяться к ES.
Наконец, лучшим вариантом для вас было бы читать OpenGL ES 2.0 Specification, как предложил Никол Болас. Сначала правила, лучшие практики - позже. Удачи!
Ответ 2
Самая большая проблема заключается в том, что вы смотрите на настольные GLSL-шейдеры и пытаетесь выяснить, что это значит для GLSL-ES.
Так же, как OpenGL ES - это не то же самое, что OpenGL, GLSL-ES - это не то же самое, что GLSL. GLSL развивается довольно далеко за многие годы, прошедшие с тех пор, как GLSL-ES отделилась. Поэтому вы не можете использовать настольные GLSL-шейдеры как нечто большее, чем приблизительное руководство по реализации шейдеров GLSL-ES. Вы можете использовать тексты С++ в качестве руководства для C.
Языки очень похожи, но на рабочем столе GLSL пришлось отказаться от множества ключевых слов, которые GLSL-ES еще не удалил. Аналогичным образом, в старой школе GLSL (1.20) реализовано много вещей, которые GLSL-ES и более поздние версии GLSL удалены, например, встроенные входы и выходы. Таким образом, вы увидите множество настольных GLSL-шейдеров, которые не будут работать на GLSL-ES. В самом деле, если вы найдете что-то такое, это произойдет только по чистой случайности.
Я мало знаю о руководствах к GLSL-ES, но самый простой способ поиска и использования - это конечный источник: Спецификация языка затенения OpenGL ES (PDF). Расширения могут накапливаться по функциональности, но в этом PDF-формате определяется основной язык. Следующей ставкой будет любой материал, явно обозначенный как OpenGL ES 2.0.
В принципе, хотя вы можете понять, что делает настольный GLSL-шейдер, лучше всего смотреть на алгоритм, а не на синтаксис, если вы пишете приложение OpenGL ES 2.0.
Ответ 3
В обучающих программах OpenGL ES 2.0 для разработчиков OpenGL есть пример кода для OpenGL ES 2.0, а также в примере кода sdk. Но вам все равно понадобится тот же самый ссылочный файл, о котором люди продолжают упоминать: "Спецификация языка затенения OpenGL ES", чтобы понять этот образец кода, поскольку Google не часто объясняет, что они делают. И когда они это делают, они не всегда придерживаются к стандартной терминологии OpenGL.
Тем не менее, вам легче найти ссылки на страницы OpenGL ES 2.0 на странице http://www.khronos.org/opengles/sdk/docs/man/ при чтении кода.