Лучшие методы 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/ при чтении кода.