OpenGL进阶之着色器语言

着色器语言

  • 在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);
    }
    

你可能感兴趣的:(OpenGL进阶之着色器语言)