2011-09-24 161 views
14

我一直在寻找OpenGL中着色器的示例,并且我已经看到了一些不同的样式。一些着色器专门使用内置类型(即,gl_Vertex)来传递应用程序代码和着色器之间的数据。OpenGL ES 2.0着色器最佳实践

一些着色器使用不同的类型将数据从顶点传输到片段着色器,而不是使用gl_Position和gl_FragColor。

某些着色器使用前缀“中”和“出”来指定数据传输:

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中的首选方法是编写着色器?是否有最佳实践指南?有人可以提供一个顶点&片段着色器的例子,这是一个'做什么'的光辉榜样?

谢谢。

回答

21
  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 Specification。规则优先,最佳实践 - 稍后。祝你好运!

+0

'in'和'out'可以从宏中得到一些帮助。 – user1095108

22

您最大的问题是您正在查看桌面GLSL着色器并试图弄清楚GLSL-ES的含义。就像OpenGL ES与OpenGL不一样,GLSL-ES与GLSL不是一回事。自GLSL-ES分拆以来,GLSL在很多年中取得了长足的进步。因此,不能使用作为实现GLSL-ES着色器的粗略指南,而不是使用桌面GLSL着色器。除了你可以使用C++文本作为C的指南外。

这些语言非常相似,但桌面GLSL不得不放弃很多GLSL-ES尚未放弃的关键字。同样,老式GLSL(1.20)实现了许多GLSL-ES和更高版本的GLSL,例如内置输入和输出。因此,您将看到桌面GLSL着色器的批次,这些着色器将在GLSL-ES上不起作用。事实上,如果你发现有这样做,那只会是纯粹的意外。

我对GLSL-ES的指南并不了解,但最容易找到和使用的是最终资源:The OpenGL ES Shading Language Specification (PDF)。扩展可以强化功能,但PDF定义了核心语言。您的下一个赌注是任何明确标记为OpenGL ES 2.0特定的材料。

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

+2

我不是在阶段,我在看算法。我只是想了解一个GLSL_ES着色器的一般语法,例如,如果任何人有一个,将是理想的,因为它比PDF中的页面更容易学习,有没有人拥有一个? – MarkP

+3

我通常喜欢示例超过完整的规格,但通过阅读呃那个特别的PDF对我来说是非常有启发性的,我也绝对推荐它。 –

2

在Android开发人员OpenGL ES 2.0教程中以及在sdk示例代码中都有OpenGL ES 2.0的示例代码。但是,您仍然需要使用人们不断提及的非常相同的参考文件:“OpenGL ES着色语言规范”来理解示例代码,因为Google不会经常解释他们在做什么,而且当他们这样做时,他们并不总是坚持以标准的OpenGL术语。

这就是说,你可能会发现更容易指OpenGL ES 2.0的参考页在http://www.khronos.org/opengles/sdk/docs/man/,而读码。