我一直在寻找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编写着色器的首选方法是什么?有最佳实践指南吗?有人可以提供顶点和顶点的示例吗?片段着色器,它是'做什么'的一个光辉榜样?
感谢。
答案 0 :(得分: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删除的东西,比如内置的输入和输出。因此,您将看到 lot 的桌面GLSL着色器,这些着色器将无法在GLSL-ES上运行。事实上,如果你发现了一些这样做,那只会是纯粹的意外。
我对GLSL-ES的指南知之甚少,但最容易找到和使用的是最终来源:The OpenGL ES Shading Language Specification (PDF)。扩展可以堆积功能,但PDF定义了核心语言。您的下一个赌注是任何明确标记为OpenGL ES 2.0特定的材料。
基本上,虽然您可以理解桌面GLSL着色器正在做什么,但如果您正在编写OpenGL ES 2.0应用程序,最好先查看算法而不是语法。
答案 1 :(得分:22)
最后,最好的选择是按照Nicol Bolas的建议阅读OpenGL ES 2.0 Specification。规则第一,最佳实践 - 稍后。祝你好运!
答案 2 :(得分:2)
在Android Developer OpenGL ES 2.0教程中以及sdk示例代码中都有OpenGL ES 2.0的示例代码。但是你仍然需要人们不断提及的相同参考文件:OpenGL ES着色语言规范“以理解示例代码,因为Google不经常解释他们正在做什么。当他们这样做时,他们并不总是坚持标准的OpenGL术语。
也就是说,在阅读代码时,您可能会更容易在http://www.khronos.org/opengles/sdk/docs/man/参考OpenGL ES 2.0参考页面。