离屏渲染

基于离屏渲染技术确定raycasting算法中的投射光线参数

raycasting算法在众多体绘制算法中以采样精度高,绘制图像细腻著称,但计算量的缺点阻碍了它的广泛应用。

GPU的raycasting算法被提出后,达到了实时交互的绘制速度。近年来,该技术逐渐成熟,可分为两类:单通路和多通路。多通路最早被提出,由于GPU的可编程性能较差,需绘制体数据包围盒多次来计算光线参数,而随着GPU的可编程性能提高,单通路算法被提出,只需绘制一次体数据包围盒就可获得投射光线参数,但顶点着色程序较为复杂。最近利用离屏渲染获取投射光线参数的方法被提出,该方法绘制包围盒两次来获取投射光线参数,避免的复杂的顶点着色程序。下面对该算法进行详细的叙述。

主要由以下几个部分组成:

(1). 3D纹理的生成。保存原始3D体数据场为3D纹理。

(2). 投射光线起始点、终点的确定。利用Framebuffer object执行离线渲染来确定投射光线参数。Framebuffer object于2005年提出,主要用于离屏渲染,它在显存中定义一块存储区域作为帧缓存使用,和真正的帧缓存一样,同样包括颜色缓存、深度缓存和模板缓存等,不同的是将绘制的结果保存在与Framebuffer object绑定的纹理对象中,而不是直接显示在屏幕上。确定投射光线起点、终点等参数的步骤如下:

什么是离屏渲染?什么情况下会触发?该如何应对?

离屏渲染就是在当前屏幕缓冲区以外,新开辟一个缓冲区进行操作。

离屏渲染出发的场景有以下:
  •   圆角 (maskToBounds并用才会触发)
  •   图层蒙版
  •   阴影
  •   光栅化

为什么要有离屏渲染?

大家高中物理应该学过显示器是如何显示图像的:需要显示的图像经过CRT电子枪以极快的速度一行一行的扫描,扫描出来就呈现了一帧画面,随后电子枪又会回到初始位置循环扫描,形成了我们看到的图片或视频。

为了让显示器的显示跟视频控制器同步,当电子枪新扫描一行的时候,准备扫描的时发送一个水平同步信号(HSync信号),显示器的刷新频率就是HSync信号产生的频率。然后CPU计算好frame等属性,将计算好的内容交给GPU去渲染,GPU渲染好之后就会放入帧缓冲区。然后视频控制器会按照HSync信号逐行读取帧缓冲区的数据,经过可能的数模转换传递给显示器,就显示出来了。具体的大家自行查找资料或询问相关专业人士,这里只参考网上资料做一个简单的描述。