OpenGL ES 2.0 Shader最佳实践

Mar*_*rkP 14 shader opengl-es glsl

我一直在寻找OpenGL着色器的例子,我看到了一些不同的风格.一些着色器专门使用内置类型(即gl_Vertex)与应用程序代码和着色器之间传输数据.

一些着色器使用变化类型将数据从顶点传输到片段着色器而不是gl_Position和gl_FragColor.

一些着色器使用前缀'in'和'out'来指定数据传输:

in vec3 vertex;

void main() {
    gl_Position = projection_matrix * modelview_matrix * vec4(vertex, 1.0);
}
Run Code Online (Sandbox Code Playgroud)

...而其他人使用属性:

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;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,GLES 2.0中编写着色器的首选方法是什么?有最佳实践指南吗?有人可以提供一个顶点和片段着色器的例子,它是"怎样做"的光辉榜样?

谢谢.

Nic*_*las 22

您最大的问题是您正在查看桌面GLSL着色器并试图弄清楚这对GLSL-ES意味着什么.

正如OpenGL ES与OpenGL不同,GLSL-ES与GLSL不同.自GLSL-ES分拆以来,GLSL在很多年里取得了相当大的进展.因此,您不能将桌面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的应用程序.

  • 我通常也喜欢示例而不是完整的规格,但阅读特定的PDF对我来说非常有启发性,我也绝对推荐它. (3认同)
  • 我不在我正在研究算法的阶段.我只是想了解GLSL_ES着色器的一般语法.一个例子,如果有人有一个,将是理想的,因为它实际上比通过PDF中的页面更容易学习.有人有吗? (2认同)

kva*_*ark 22

  1. "ES 2.0"中没有gl_Vertex.您提供的所有属性都是自定义的.
  2. gl_Position不是ES 2中的一个选项,而是一个要求.了解OpenGL管道以了解原因.提示:仅当光栅化器被禁用时(例如,变换反馈),它可以是可选的,但ES中不支持此功能.
  3. 在ES 2.0中,顶点属性必须具有"属性"值,并且必须将变化声明为"变化".使用"in"和"out"是习惯在OpenGL 3+下开发的习惯,不能应用于ES.

最后,最好的选择是阅读Nicol Bolas建议的OpenGL ES 2.0规范.规则第一,最佳实践 - 稍后.祝好运!