ARCore:相机预览背景绘制

在完成了OpenGL ES和ARCore基本的实现后,下一步肯定就是图像绘制了。在Google为ARCore提供的Demo中,主要进行了相机预览、检测点云、检测平面和Android小机器人的绘制。本节我们将跟大家介绍相机预览背景的绘制过程和原理。

一、OpenGL ES渲染管线


OpenGL ES渲染管线其实就是渲染流水线,实质上指的是一系列的绘制过程。这些过程输入的是待渲染3D物理的相关描述信息数据,经过渲染管线,输出一帧想要的图像。

OpenGL ES渲染管线,如下图所示:
这里写图片描述

1.基本处理
在该阶段设定3D空间中物体的顶点坐标、顶点对应的颜色、顶点纹理坐标等属性,并指定绘制方式,如点绘制、线段绘制或者三角形绘制等。

OpenGL ES支持2D和3D图形的绘制。当你希望在2D界面绘制一条任意的曲线的时候,把这边曲线放的足够大来看,会发现这条曲线其实是由许多足够短的直线连接起来的。那么绘制3D图形,即使你看见的是一个“圆滑曲面”的3D图形,实际上足够放大它依然是由多个小平面组成的。所以对于2D图形,可能是由很多“曲线”组成;而3D图形可能是由很多“曲面”组成。
这里写图片描述

2.顶点缓冲对象
该阶段在应用程序中是可选的。在整个场景中顶点的基本数据不变的情况。可以在初始化阶段将顶点数据经过基本处理后送入顶点缓冲对象,在绘制每一帧想要的图像就省去了顶点IO的麻烦,直接从顶点缓冲对象中获取顶点数据即可。

3.顶点着色器
顶点着色器是一个可编程处理单元,为执行顶点变换、光照、材质的应用与计算等顶点相关的操作,每个顶点执行一次。工作过程首先将原始的几何信息及其他属性传送到顶点着色器中,经过自己开发的顶点着色器处理后产生纹理坐标、颜色、点位置等后流程需要的各项顶点属性信息,然后将其传递给图元装配阶段。

顶点着色器输入主要为待处理顶点相应的attribute(属性)变量、uniform(一致)变量、采样器以及临时变量;输出主要为经过顶点着色器后生成的varying(易变)变量以及一些内建输出变量。
这里写图片描述

4.图元装配
该阶段主要任务是图元组装和图元处理。

图元组装是指顶点数据根据设置的绘制方式被结合成完整的图元。如点绘制每个顶点为一个图元;线段绘制方式每个图元则为两个顶点;三角形绘制方式下需要3个顶点构造成一个图元。

图元处理最重要的工作是剪裁,其任务是消除位于半空间之外的部分几何图元。之所以进行剪裁,是因为随着观察位置、角度不同,并不能总看到特定3D物体某个图元的全部。剪裁时,若图元完全位置视景体以及自定义裁剪平面的内部,则将图元传递到后面步骤进行处理;如果其完全位于视景体或者自定义剪裁平面的外部,则丢弃该图元。
这里写图片描述

5.光栅化
虚拟3D世界中的物体的几何信息一般采用连续的数学向量来表示,因此投影的平面结果也是用连续的数学向量表示的。但目前的显示设备都是离散化的(由一个一个的像素组成),因此还需要将投影的结果离散化。将其分解为一个一个离散化的小单元。
这里写图片描述

6.片元着色器
片元着色器是用于处理片元值以及相关数据的可编程单元,其可以执行纹理的采样、颜色的汇总、计算雾颜色等操作,每片元执行一次。片元着色器通过重复执行,将3D物体中的图元光栅化后产生的每个片元的颜色等属性计算出来后送入后续阶段,如剪裁测试、深度测试及模板测试等。

片元着色器输入是从顶点着色器传递到片元着色器的易变变量(Varying0~n),输出为内建变量(gl_FragColor)是片元的最终颜色。
这里写图片描述

7.剪裁测试
OpenGL ES会检查每个片元在帧缓冲中对应的位置,若对应位置在剪裁窗口中则将此片元送入下一阶段,否则丢弃此片元。

8.深度测试和模板测试
深度测试指将输入片元的深度值与缓冲区中存储的对应位置的深度值进行比较,若输入片元的深度值小于则将输入片元送入下一个阶段准备覆盖帧缓冲中的原片元或帧缓冲中的原片元缓冲,否则丢弃输入片元。

模板测试的主要功能是为将绘制区域限定在一定范围内,一般应用在湖面倒影、镜像等场合。

9.颜色缓冲混合
若程序开启的Alpha混合,则根据混合因子将上一阶段送来的片元帧缓冲对应的位置的片元进行Alpha混合,否则送入的片元将覆盖帧缓冲中对应位置的片元。

10.抖动
抖动是一种简单的操作,允许只使用少量的颜色模拟出更宽的颜色显示范围,从而使颜色视觉更丰富。

11.帧缓冲
OpenGL ES中的物体绘制并不是直接绘制在屏幕上进行的,而是预先在帧缓冲区中进行绘制,每绘制完一帧再将绘制的结果交换到屏幕上。因此,在每次绘制更新一帧都需要清除缓冲区中的相关数据。

二、纹理映射


除了基本基本图形的绘制,如果想要绘制更加真实、炫酷的3D物体,就需要用到纹理映射。它就是把一幅纹理应用到相应的几何图元,告知渲染系统如何进行纹理映射。告知的方式就是为图元中的每个顶点指定恰当纹理坐标,然后通过纹理坐标在纹理图中可以确定选中的纹理区域,最后将选中的纹理区域中的内容根据纹理坐标映射到指定的图元上。
这里写图片描述

三 、相机预览背景绘制步骤


1.绘制背景准备
在该过程,完成了顶点和纹理坐标数据的提供,纹理id的生成获取、绑定和设置,创建顶点坐标和纹理坐标顶点缓冲对象,加载并绑定背景顶点和片元着色器,获取顶点和纹理坐标位置属性等。

2.背景纹理和Session摄像头纹理绑定
在该过程中,将背景纹理id和Session摄像头纹理id进行绑定。

3.执行背景绘制
该阶段处理显示旋转纹理坐标的变换,设置深度测试,告知OpenGL应用的纹理id和使用的程序,将顶点和纹理坐标传送渲染管线,启动顶点和纹理id数据,执行背景绘制和禁用顶点数据等。

四、案例源码分析


1.绘制背景准备
com\google\ar\core\examples\java\helloar\rendering\BackgroundRender.java

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值