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的应用程序.
kva*_*ark 22
最后,最好的选择是阅读Nicol Bolas建议的OpenGL ES 2.0规范.规则第一,最佳实践 - 稍后.祝好运!