OpenGL 从入门到实践:基础的绘制流程

这篇博客介绍了OpenGL在短视频开发中的重要性,并详细讲述了在Android中使用OpenGL的基础绘制流程,包括OpenGL简介、绘制流程、坐标系统、基本图元、渲染管线、内存拷贝、顶点和片段着色器的编程,以及编译和绘制过程。适合对OpenGL感兴趣的开发者和音视频开发人员学习。
摘要由CSDN通过智能技术生成

随着国内短视频应用竞争逐渐激烈,很多公司也推出了自己的短视频产品,而从开发者的角度来说,短视频应用开发的岗位需求都渐渐提到了解或者掌握 OpenGL 。

在视频的播放、渲染、特效等方面,处处都可以看到 OpenGL 的身影,可见在短视频时代或者在即将到来的 5G 时代,有志于从事音视频开发,那么掌握 OpenGL 已经是一项必备的技能了。

在本场 Chat 中,会讲到如下内容:

  • 对 OpenGL 的介绍
  • 在 Android 中使用 OpenGL 的流程
  • OpenGL 的绘制流程

适合人群:

  • 对 OpenGL 有兴趣的技术人员
  • 想从事音视频开发或者渲染特效开发的同学

终于要开始探索奇妙的 3D 世界了,OpenGL 搞起。

OpenGL 简介

OpenGL 是一种应用程序编程接口,它是一种可以对图形硬件设备特性进行访问的软件库。

重点:OpenGL 是一种接口,既然是接口,那么就必然要有实现。

事实上,它的实现是由显示设备厂商提供的,而且依赖于厂商提供的硬件设备。

OpenGL 常用于 CAD、虚拟实境、科学可视化程序和电子游戏开发。

在 Android 上使用的是 OpenGL ES,它是 OpenGL 的子集,在 OpenGL 的基础之上裁剪掉了一些非必要的部分,主要是针对手机、PAD 和游戏主机等嵌入式设备设计的。

在 Android 上开发 OpenGL 既可以使用 Java 也可以使用 C ,话不多说,撸起袖子就是干!

OpenGL 的绘制流程

学习 OpenGL 的绘制,最好还是先从 2D 绘制开始,逐渐过渡到 3D 绘制。

Android 为 OpenGL 的绘制提供了一个特定的视图GLSurfaceView,就像 SurfaceView 一样,它渲染绘制也可以在一个单独的线程中,而非主线程,毕竟 GLSurfaceView 就是继承自 SurfaceView 的。

在使用 GLSurfaceView 时,需要通过setRenderer方法给它设置一个渲染器,而主要的渲染工作就是由渲染器Renderer完成了。

通过继承GLSurfaceView.Renderer类来实现我们自己的渲染器程序,主要有如下三个方法:

  • onSurfaceCreated
    • 当 GLSurfaceView 创建时调用,主要做一些准备工作。
  • onSurfaceChanged
    • 当 GLSurfaceView 视图改变时调用,第一次创建时也会被调用。
  • onDrawFrame
    • 每一帧绘制时被调用。

实现渲染器程序时,首先要考虑三个问题:

  • 在什么地方进行绘制?
  • 绘制成什么形状?
  • 用什么颜色来绘制?

而我们的程序也主要以解决上述三个问题为主,下面以 OpenGL 绘制一个点来讲解。

OpenGL 坐标

手机屏幕的坐标是以左上角为原点(0,0),向右为 X 轴正方形,向下为 Y 轴正方向,而 OpenGL 也有着它自己的一套坐标定义。

假设我们定义了一个点的坐标(4.3,2.1),也就是它的 X 轴坐标和 Y 轴坐标,而 OpenGL 最后会把我们定义的坐标映射手机屏幕的实际物理坐标上。

无论是 X 坐标还是 Y 坐标,OpenGL 都会把手机屏幕映射到 $[-1,1$] 的范围内。也就是说:屏幕的左边对应 X 轴的 -1 ,屏幕的右边对应 +1,屏幕的底边会对应 Y 轴的 -1,而屏幕的顶边就对应 +1。

不管屏幕是什么形状和大小,这个坐标范围都是一样的,例如下图所示:

所以,上面定义的坐标(4.3,2.1),最后是会被映射到手机屏幕之外的,处于不可见的状态。

这里,假定绘制一个位于原点的点(0,0),那么映射之后的位置就手机屏幕的中心了。

基本图元

解决了位置的问题,接下来就是形状和颜色的问题。

如同 Android 的 Canvas 对象提供了一些方法来完成基本的绘制:drawPoint、drawRect、drawLine 等,OpenGL 程序也提供且仅提供了三种基本的图元来完成绘制。

  • 线
  • 三角形

其他的所有形状都是基于这三种图元来完成的,比如矩形就可以看成是两个三角形拼成的。

由于我们要绘制的是一个点,在坐标系中,一个坐标就可以代替一个点了。假设要绘制一个三角形,那么在坐标系中就需要三个点才行了。

接下来就涉及到 OpenGL 如何把定义的点的数据绘制出来了。

渲染管线

首先要明白一个概念渲染管线

根据百度百科的定义,渲染管线也称为渲染流水线像素流水线像素管线,是显示芯片内部(GPU)处理图形信号相互独立的并行处理单元。

显卡的渲染管线就是显示核心的重要组成部分,是负责给图形配上颜色的一组专门通道。渲染管线的数量是决定显示芯片性能和档次的最重要的参数之一。

现阶段的显卡都是分为顶点渲染像素渲染的。在显卡,内部分为两大区域,一个区域是顶点渲染单元(也叫顶点着色),主要负责描绘图形,也就是建立模型。一个区域是像素渲染管线,主要负责把顶点绘出的图形填上颜色。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值