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);
    }
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容