美文网首页
OpenGL进阶之着色器语言

OpenGL进阶之着色器语言

作者: 溫順尚早 | 来源:发表于2019-03-07 20:51 被阅读0次

    着色器语言

    • 在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进阶之着色器语言

          本文链接:https://www.haomeiwen.com/subject/lmzhpqtx.html