Opengl es OpenGL ES 2.0着色器最佳实践

Opengl es OpenGL ES 2.0着色器最佳实践,opengl-es,glsl,shader,Opengl Es,Glsl,Shader,我一直在寻找OpenGL中着色器的示例,我看到了一些不同的样式。某些着色器专门使用内置类型(即gl_顶点)在应用程序代码和着色器之间传输数据 某些着色器使用不同的类型将数据从顶点传输到片段着色器,而不是gl_位置和gl_FragColor 某些着色器使用前缀“in”和“out”指定数据传输: in vec3 vertex; void main() { gl_Position = projection_matrix * modelview_matrix * vec4(vertex, 1.

我一直在寻找OpenGL中着色器的示例,我看到了一些不同的样式。某些着色器专门使用内置类型(即gl_顶点)在应用程序代码和着色器之间传输数据

某些着色器使用不同的类型将数据从顶点传输到片段着色器,而不是gl_位置和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;
}
我的问题是,在GLE2.0中,编写着色器的首选方式是什么?是否有最佳实践指南?有人能提供一个顶点和片段着色器的示例,它是“做什么”的一个光辉示例吗


谢谢。

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

正如OpenGL ES与OpenGL不一样,GLSL-ES与GLSL也不一样。自GLSL-ES分离以来的多年中,GLSL取得了长足的进步。因此,使用桌面GLSL着色器只能作为实现GLSL-ES着色器的粗略指南。比C++文本更能作为C.P/P的指南 两种语言非常相似,但桌面GLSL不得不放弃许多GLSL-ES尚未抛弃的关键词。类似地,旧式GLSL(1.20)实现了许多GLSL-ES和GLSL的更高版本删除的东西,如内置输入和输出。因此,您将看到许多桌面GLSL着色器无法在GLSL-ES上工作。事实上,如果你发现有人这样做,那完全是偶然的

我不太了解GLSL-ES指南,但最容易找到和使用的是最终来源:。扩展可以堆积在功能上,但PDF定义了核心语言。您的下一个赌注是明确标记为OpenGL ES 2.0特定的任何材质

基本上,虽然您可以理解桌面GLSL着色器在做什么,但如果您正在编写OpenGL ES 2.0应用程序,最好查看算法而不是语法

  • “ES 2.0”中没有gl_顶点。您提供的所有属性都是自定义的
  • gl_位置不是ES 2中的选项,而是一项要求。了解OpenGL管道以了解原因。提示:仅当禁用光栅化器(例如变换反馈)时,此选项才是可选的,但ES不支持此选项
  • 在ES 2.0中,顶点属性必须具有“属性”值,并且变量必须声明为“可变”。使用“in”和“out”是OpenGL3+下养成的习惯,不能应用于ES

  • 最后,你最好的选择是按照Nicol Bolas的建议阅读。首先是规则,然后是最佳实践。祝你好运

    Android开发者OpenGL ES 2.0教程和sdk示例代码中都有OpenGL ES 2.0的示例代码。但是你仍然需要人们不断提到的同一个参考文件:OpenGL ES着色语言规范“来理解这个示例代码,因为谷歌并不经常解释他们在做什么。当他们这样做时,他们并不总是坚持标准的OpenGL术语


    这就是说,在阅读代码时,您可能会发现更容易在中引用OpenGL ES 2.0参考页。

    我并不是在研究算法。我只是试图理解GLSL_ES着色器的一般语法。如果有人有一个示例,这将是一个理想的示例,因为它实际上比通过PD中的页面更容易学习F.有人有吗?我通常更喜欢示例,而不是完整的规范,但通读那个特定的PDF对我来说非常有启发性,我也绝对推荐它。
    in
    out
    可以在宏的帮助下应用。