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