前面学习了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 通道传进来的纹理采样器,通过它可以拿到对应的纹理。
网友评论