OpenGL的优势:
OpenGl的主程序运行在CPU上,主程序(CPU)向显存写入图像定点等数据,并启动渲染器,着色器程序开始在GPU运行,在GPU上面做运算速度快很多。GPU与CPU的区别可以参考http://www.cnblogs.com/biglucky/p/4223565.html,CPU和GPU之所以大不相同,是由于其设计目标的不同,它们分别针对了两种不同的应用场景。其中GPU注重输入不同的数据,进行相同的预算;而CPU需要很强的通用性来处理各种不同类型的数据,同时又需要各种逻辑判断分支跳转的处理,使得CPU的内部结构异常复杂。
OpenGL的基础知识:
· OpenGL绘制的都是形状,包括绘制形状和填充颜色,绘制形状基本是三角形。
· 每个形状都有定点vertrex,顶点序列的组合就是形状
· Shader,着色器,描述如何绘制+渲染,GLSL(OpenGL Shader Language),是OpenGL的编程语言。OpenGL有两种着色器,顶点着色器(vertrex)和片元着色器(fragment)
· vertex shader,顶点着色器,控制图像定点的绘制,包括坐标、转换等。
· fragment shader,片元着色器,控制形状内图像的渲染、纹理填充内容。
OpenGL的着色器相当于画笔,顶点着色器个片元着色器的关系如下:
OpenGL实战
接下来通过创建OpenGL的工程来熟悉它。
1、创建工程OpenGLSample
2、在MainActivity中添加GLSurfaceView
步骤:
添加GLSurfaceView控件
设置OpenGL的版本号,一般设置为2
给OpenGL设置渲染器(最重要的就是这个Render类)
设置渲染模式:连续模式或懒汉模式
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 1.创建一个新的GLSurfaceView
GLSurfaceView glSurfaceView = new GLSurfaceView(this);
// 2.设置版本号,一般是2
glSurfaceView.setEGLContextClientVersion(2);
// 设置渲染器
glSurfaceView.setRenderer(new SimpleRender());
// 设置渲染模式为连续模式(60fps)
glSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);
}
}
这里说明一下,上面讨论的是OpenGL,为啥创建的是GLSurfaceView对象,因为GLSurfaceView内置的Surface专门负责OpenGl的渲染。通过查看GLSurfaceView的源码,可以看出,它是OpenGL的一个子类。所以,此处我们直接通过GLSurfaceView来实战OpenGL。
SurfaceView的主要功能就是将底层显存Surface的内容显示在屏幕上,而GLSurfaceView继承自SurfaceView,GLSV在SV的基础上面增加了OpenGL绘制。
3、编写SimpleRender
重点来了,OpenGL的核心就是Render着色器,OpenGL的绘制过程就是,顶点着色器先绘制图形,然后片元着色器渲染颜色。
GLSL的创建过程:
创建GLSL程序(Program)
加载shader代码(顶点和片元)
attach shader
链接shader
获取shader id
和普通的 view 利用 canvas 来绘制不一样,OpenGL 需要加载 GLSL 程序,让 GPU 进行绘制。所以我们需要定义 shader 代码,并在 onSurfaceChanged回调中加载: