这里,假定绘制一个位于原点的点(0,0),那么映射之后的位置就手机屏幕的中心了。
基本图元
解决了位置的问题,接下来就是形状和颜色的问题。
如同 Android 的 Canvas 对象提供了一些方法来完成基本的绘制:drawPoint、drawRect、drawLine 等,OpenGL 程序也提供且仅提供了三种基本的图元来完成绘制。
- 点
- 线
- 三角形
其他的所有形状都是基于这三种图元来完成的,比如矩形就可以看成是两个三角形拼成的。
由于我们要绘制的是一个点,在坐标系中,一个坐标就可以代替一个点了。假设要绘制一个三角形,那么在坐标系中就需要三个点才行了。
接下来就涉及到 OpenGL 如何把定义的点的数据绘制出来了。
渲染管线
首先要明白一个概念渲染管线
。
根据百度百科的定义,渲染管线也称为渲染流水线
或像素流水线
或像素管线
,是显示芯片内部(GPU)处理图形信号相互独立的并行处理单元。
显卡的渲染管线就是显示核心的重要组成部分,是负责给图形配上颜色的一组专门通道。渲染管线的数量是决定显示芯片性能和档次的最重要的参数之一。
现阶段的显卡都是分为顶点渲染
和像素渲染
的。在显卡,内部分为两大区域,一个区域是顶点渲染单元(也叫顶点着色),主要负责描绘图形,也就是建立模型。一个区域是像素渲染管线,主要负责把顶点绘出的图形填上颜色。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-acqNMm38-1650016198335)(https://user-gold-cdn.xitu.io/2018/5/8/1633d19c4a073089?imageView2/0/w/1280/h/960/ignore-error/1)]
上图就是 OpenGL 中渲染管线的一个处理流程。
可以看到,流程图从读取顶点数据开始,然后后执行两个着色器:
- 顶点着色器
- 主要负责描绘图形,也就是根据顶点坐标,建立图形模型。
- 片段着色器
- 主要负责把顶点绘出的图形填上颜色。
由于这两个着色器对于最后图形显示效果至关重要,并且它们还是可以通过编程来控制的,这也是为什么可编程渲染管线
要优于固定编程管线了。
事实上,随着显示技术的发展,渲染管线将不复存在了,顶点着色器和渲染管线统一被流处理器(Stream Processors)
所取代。
但是目前手机上 OpenGL 还是使用渲染管线中,有了渲染管线,我们就可以完成点的形状绘制和着色两大问题了,接下来的工作也是围绕这条渲染管线开始的。
内存拷贝
当定义完了顶点坐标,并且明确了下一步:顶点坐标将要通过渲染管线进行一系列处理,那么接下来就是如何把顶点坐标传递给渲染管线了。
OpenGL 的实现是由显示设备厂商提供的,它作为本地系统库直接运行在硬件上。而我们定义的顶点 Java 代码是运行在虚拟机上的,这就涉及到了如何把 Java 层的内存复制到 Native 层了。
一种方法是直接使用JNI
开发,直接调用本地系统库,也就是用 C++
来开发 OpenGL,这种实现肯定要学会的。
另一