着色器语言
-
在Android上Opengl是通过Vertex Shader 和 Fragment Shader 这两种定点着色器程序来实现图片的加载和渲染的。中文称为顶点着色器和片段着色器。在Android平台上Shader程序一般以字符串的形式出现,或者在res/raw/目录下以*.glsl的格式出现。
VERTEX_SHADER
-
顶点着色器
为每一个顶点生成坐标,因此每个顶点都要运行一遍顶点着色器程序,一旦顶点坐标计算出来之后,OpenGL就能够使用这些顶点来组成点,线,和三角形。所有任意的图形都是由这三种基本元素来描述的。
-
定义类型变量
-
atrribute
只能在vertex shader中使用的变量,用attribute变量来表示一些顶点的数据,包含了顶点坐标,法线,纹理坐标,顶点颜色等。应用中一般用函数glBindAttribLocation()来绑定每个attribute变量的位置,然后用函数glVertexAttribPointer()为每个attribute变量赋值。
-
varying
被称为易变量,用于从Vertex Shader 向 Fragment Shader传递数据,上面例子中在VertexShader中定义了attribute 类型的二维向量a_texcoord,并将该值赋值给varying类型的二维向量 v_texcoord。
-
-
在main() 中必须将顶点坐标赋值给系统变量gl_Position
-
顶点着色器示例
attribute vec4 a_position; attribute vec2 a_texcoord; varying vec2 v_texcoord; void main() { gl_Position = a_position v_texcoord = a_texcoord; }
FRAGMENT_SHADER
-
片段着色器
为点、线或者三角形的每一个顶点的片段(Fragment)生成渲染后的最终颜色。片段就是一个小的单色矩形区域,可以简单的认为是屏幕上的一个像素点。
-
定义类型变量
-
uniform
是APP序传递给(vertex和fragment)shader的变量。通过函数glUniform**()函数赋值的。shader程序只能用不能修改。如果uniform变量在vertex和fragment两者之间声明方式完全一样,则它可以在vertex和fragment共享使用。uniform变量一般用来表示:变换矩阵,材质,光照参数和颜色等信息。 -
varying
-
precision mediump float
用于定义数据精度,Opengl中可以设置三种类型的精度(lowp,medium 和 highp),对于Vertex Shader来说,Opengl使用的是默认最高精度级别(highp),因此没有定义
-
-
在main() 中必须对gl_FragColor赋值
-
片段着色器示例
precision mediump float; uniform sampler2D tex_sampler; varying vec2 v_texcoord; void main() { gl_FragColor = texture2D(tex_sampler, v_texcoord); }
网友评论