Лучшие практики OpenGL ES 2.0 Shader - PullRequest
       15

Лучшие практики OpenGL ES 2.0 Shader

14 голосов
/ 24 сентября 2011

Я искал примеры шейдеров в 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 предпочитать писать шейдеры? Есть ли руководство по передовому опыту? Может ли кто-нибудь привести пример вершинного и фрагментного шейдера, который является ярким примером «что делать» ??

Спасибо.

Ответы [ 3 ]

22 голосов
/ 26 сентября 2011
  1. В "ES 2.0" отсутствует gl_Vertex.Все предоставленные вами атрибуты являются пользовательскими.
  2. gl_Position - это не опция в ES 2, а требование.Узнайте о конвейере OpenGL, чтобы понять, почему.Подсказка: это может быть необязательным, только если растеризатор отключен (например, Transform Feedback), но это не поддерживается в ES.
  3. В ES 2.0 атрибуты вершин должны иметь значение атрибута, а изменения должны быть объявленыкак «меняющийся».Использование «in» и «out» вместо этого является привычкой, разработанной в OpenGL 3+ и не может применяться к ES.

Наконец, лучшим вариантом для вас будет чтение OpenGL ES2.0 Спецификация как предложено Николом Боласом.Сначала правила, лучшие практики - позже.Удачи!

22 голосов
/ 24 сентября 2011

Ваша самая большая проблема в том, что вы смотрите на настольные шейдеры GLSL и пытаетесь выяснить, что это значит для GLSL-ES.

Так же, как OpenGL ES - это не то же самое, что OpenGL, GLSL-ESэто не то же самое, что GLSL.GLSL продвинулся довольно далеко за многие годы, прошедшие после разделения GLSL-ES.Таким образом, вы не можете использовать настольные шейдеры GLSL как нечто большее, чем грубое руководство по реализации шейдеров GLSL-ES.Более, чем вы могли бы использовать тексты C ++ в качестве руководства для 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.

2 голосов
/ 02 октября 2011

Пример кода для OpenGL ES 2.0 есть в учебниках по Android для разработчиков OpenGL ES 2.0, а также в примере кода sdk. Но вам все равно понадобятся те же справочные файлы, о которых люди продолжают упоминать: «Спецификация языка шейдинга OpenGL ES», чтобы понять этот пример кода, поскольку Google не часто объясняет, что они делают. А когда они это делают, они не всегда придерживаются к стандартной терминологии OpenGL.

Тем не менее, вам может быть проще обратиться к справочным страницам OpenGL ES 2.0 по адресу http://www.khronos.org/opengles/sdk/docs/man/ во время чтения кода.

...