OpenGL ES初步了解

作者: jakeXu | 来源:发表于2019-06-18 11:39 被阅读0次

    前面学习了OpenGL相关知识,下面过渡到OpenGL ES的学习中,本章主要是对OpenGL ES的初步了解。

    OpenGL ES (OpenGL for Embedded Systems) 是以手持和嵌入式为目标的高级3D图形应用程序编程接口(API)。OpenGL ES 是目前智能手机中占据统治地位的图形API,⽀持的平台: iOS, Andriod , BlackBerry ,bada ,Linux ,Windows。
    OpenGL ES是OpenGL的简化版本,它消除了冗余功能,提供了一个既易于学习又更易于在移动图形硬件中实现的库,有允许应用程序利用底层图形处理器的强⼤功能。iOS设备上的GPU可以执行复杂的2D和3D绘图,以及最终图像中每个像素的复杂着色计算。

    下面我们来初步了解OpenGL ES中的可编程部分:顶点着色器和片元着色器。

    • 顶点着色器

      1)顶点着色器输入:

      1、着色器程序-描述顶点上执⾏操作的顶点着⾊器程序源代码/可执⾏文件(GLSL编写的代码)
      2、顶点着⾊器输⼊(属性) -⽤顶点数组提供每个顶点的数据(顶点、纹理、法线坐标数据)
      3、统⼀变量(uniform)-顶点/⽚元着⾊器使⽤的不变数据(矩阵变换)
      4、采样器-代表顶点着⾊器使⽤纹理的特殊统⼀变量类型(采样纹理)
      

      2)顶点着色器业务

      1、通过矩阵变换位置
      2、计算光照公式⽣成逐顶点颜色
      3、生成/变换纹理坐标
      总结:可编程性就是可以用于执⾏自定义计算,实施新的变换,光照或者传统的固定功能所不允许的基于顶点的效果.
      

      3)顶点着色器代码案例
      基本格式:通道修饰符 精度 变量类型 变量名

      attribute vec4 position;
      attribute vec2 textCoordinate;
      uniform mat4 rotateMatrix;
      varying lowp vec2 varyTextCoord;
      void main()
      {
      // 把textCoordinate交给varyTextCoord,就可以把纹理坐标传递到片元着色器里面去。
          varyTextCoord = textCoordinate;
      
          vec4 vPos = position;
          vPos = vPos * rotateMatrix;// 让每一个顶点都和旋转矩阵相乘
      
          gl_Position = vPos;// gl_Position是一个内建变量,是vec4类型的,必须给它赋值。
      }
      
    • 片元着色器

      1)片元着色器输入:

      1、着色器程序-描述片元上执⾏操作的片元着⾊器程序源代码/可执⾏文件(GLSL编写的代码)
      2、输⼊变量-光栅化单元⽤插值为每个片段⽣成的顶点着⾊器输出
      3、统⼀变量(uniform)-顶点/⽚元着⾊器使⽤的不变数据(矩阵变换)
      4、采样器-代表片元着⾊器使⽤纹理的特殊统⼀变量类型(采样纹理)
      

      2)片元着色器业务

      1、计算颜色
      2、获取纹理值
      3、往像素点中填充颜⾊值(纹理值/颜色值)
      总结:可编程性就是可以用于图片/视频/图形中每个像素的颜色填充(⽐如给视频添加滤镜,实际上就是将视频中每个图片的像素点颜色填充进行修改)。
      

      3)片元着色器代码案例
      基本格式:通道修饰符 精度 变量类型 变量名

      varying lowp vec2 varyTextCoord;
      uniform sampler2D colorMap;
      void main()
      {
          // texture2D(纹理采样器, 纹理坐标); 为了取得纹素(纹理对应坐标上的颜 色值),比如取到了一个rgba四维变量
        gl_FragColor = texture2D(colorMap, varyTextCoord);
      }
      

    注意事项:

    1、顶点着色器里的 varying lowp vec2 varyTextCoord;和片元着色器里的 varying lowp vec2 varyTextCoord;必须定义的一模一样才行,包括通道、精度、类型和变量名都要一致,这样才能从顶点着色器传进来,否则拿不到对应数据。
    2、uniform sampler2D colorMap 是由 uniform 通道传进来的纹理采样器,通过它可以拿到对应的纹理。

    相关文章

      网友评论

        本文标题:OpenGL ES初步了解

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