今天要和大家分享的内容是在Kanzi中使用Render Pass的部分功能实现Render To Texture(贴图烘焙)的效果。在介绍此项技术之前,首先对其用到的几个概念做一个简单的描述。
1什么是纹理(Texture)
凡是接触过HMI项目的人,无论是3D建模师还是动效设计师或者是具体编写代码的程序员,一定对Texture(纹理)这个概念不陌生。通常来讲,计算机图形学的目标之一就是计算出屏幕上所要显示的每一个像素点的颜色值。虽然我们可以通过着色器来计算这些像素点的颜色,但是很多情况下,仅使用着色器去计算这些像素点复杂性较高,且不易操作。(例如,我们如果想渲染一个森林的场景,仅仅通过数学计算来得出每一个像素点的颜色几乎是不可能完成的任务)。这时候,我们就可以求助于Texture。使用一张提前准备好的图像,提取其中像素点的颜色,用于实际渲染。所谓Texture,其实就是一块图像数据,从计算机的角度来讲,也可以说是一块存储了数据的内存区域。
2什么是帧缓存(FrameBuffer)
在了解了Texture的概念后,接下来介绍一下FrameBuffer(帧缓存对象)的概念。OpenGL中,如何在控制窗口显示各种颜色,主要是通过向缓存区(默认缓存区)写入数值来实现的。通常,在我们不做其他操作的情况下,渲染的效果都会被写入到默认缓存区之中,直接反映在窗口的显示之上。同时,OpenGL也允许我们自己开辟新的帧缓存空间。创建好自定义的帧缓存空间之后,我们就可以将部分渲染效果,绑定到自定义的空间中。
3在Kanzi中使用Render To Texture
我们常说的Render To Texture,就是基于上述原理来实现的。例如,将一些场景Kanzi中的Scene节点呈现出的效果,渲染到帧缓存之中,之后将帧缓存作为Texture,贴到其他的物体之上;抑或是对帧缓存中的像素进行二次处理,如模糊<Blur>、泛光<Bloom>等效果的显示。在Kanzi中,这部分的功能被集成在了Render Pass之中。
接下来,我们使用Kanzi的Render Pass,来实现一个简单的Render To Texture的操作。我们将会创建一个Scene场景,并将场景的效果,作为一张贴图,贴在另一个平面之上。
首先在Kanzi中创建两个Viewport2D的场景:

左边的平面用于接收右面场景渲染出来的贴图,右边的Viewport里是实际的场景(一个球和一个贴了森林图片的正方体)。
接下来,在Render Passes里建立一个Group Render Pass,并在Group Render Pass中创建一个Render To Texture Pass。

完成这一步之后,我们会发现,在Texture属性里,会多了一个可供选择的项(Render Target Texture),这就是我们新创建的用于接收渲染效果的一块区域,我们可以直接将其作为一个Texture进行使用。然后,我们选择Render To Texture Pass里面的Draw Objects,修改其属性里的Camera,选择为Viewport 2D_Scene中的Camera,即将右侧Viewport中的Camera作为我们将要渲染到纹理场景中所使用的Camera。

然后,我们将Viewport2D_Scene中的Render Pass修改为我们之前设置的Group Render Pass。同时,将Viewport2D_Target中Plane的材质贴图设置为生成好的Render Target Texture。

修改之后,我们发现,之前右侧场景中的球体和正方体已经消失了,而在左侧的的平面上出现了消失的球体和正方体。产生这种现象正是因为,我们把右侧的场景直接渲染到了一块Texture之上,而左边的平面恰好使用了这个Texture。

到此,其实我们已经掌握了Render To Texture在Kanzi中的基本使用方法。之后,如果想要做类似模糊,泛光的特效,则可以通过操作片元着色器来实现。另外需要注意的是,当我们使用Render To Texture实现效果时,对其性能产生的影响也是不能被忽视的。因为Render To Texture技术需要一块或多块额外的内存作为存储空间,相当于增加了GPU内存使用;其次,当我们希望动态改变帧缓存里面的内容时,会频繁的对这块内存进行读写操作,也会降低整体的渲染速度,导致帧数有所下降。
以上为本次分享内容,如想了解更多有关如何使用Kanzi功能实现图片效果的方法,请继续关注我们,我们将为您带来更多内容。
相关精彩推荐:

![]()
怿星一意,专注车载
引领汽车科技新高度


