题释
本文包含两个部分,第一部分描述自写的基于OpenGL的渲染接口,包含该接口的结构和使用方法。该接口简单易用,用户只需要定义需要渲染的实体,发送给该接口即可。且该接口封装了OpenGL的一些简单功能,如生成RenderTexture,渲染到纹理,控制OpenGL命令等,借助这些功能可以构建出一套相对完整的实时渲染系统。
第二部分会介绍如何一步一步渲染出视频中的效果,其中使用了屏幕空间阴影收集,顺序无关透明渲染等技巧。
表达能力有限,第一部分难以表达渲染接口的所有细节,只能尽可能描述我的大致思路,希望有借鉴价值,若对这一部分兴趣不大,也可直接跳到第二部分,因为第二部分才是渲染的过程。
简介
因为我很多时候都需要模型的渲染结果,而先输出模型文件,再用第三方软件如meshlab、maya或者游戏引擎如unity等打开文件进行渲染的方法存在着低效率、无法定制等问题。
而每次重新配置OpenGL环境,定义发送数据等过程又过于繁琐,于是决定使用OpenGL制作一个便于使用的接口,可供以后使用。为了体现该接口的潜力,我另外构造了一套简易的渲染系统,完成的渲染结果即为题图。题图的渲染并没有实现光照模型,半透明物体更是通体相同的颜色(Figure 9),效果虽然粗糙,但体现了半透明物体及其阴影的合理渲染。例如中间的红色球体,它看起来像一个球而非一个相同颜色的圆形块的唯一原因是合理的透明阴影。
实现OpenGL接口的时候借鉴了ECS的思想,将数据和实体尽可能分离,解耦方便,可并行程度高,如果以后有拓展需要,也便于进行自定义。
渲染接口
最开始我的需求仅仅是输入模型和其对应纹理,程序输出一张渲染图片即可。但许多较为精美的渲染结果均需要预计算和后处理,如Gem3的高级皮肤渲染中,为了得到准确的高光反射模型,需要预计算一张Beckmann distribution texture用于存储微表面分布(microfacet distribution)。受此启发,我认为该系统应该支持渲染到纹理这样的基础操作,并让其便于用户使用。
重新构建的架构将数据和实体尽可能分离,分别用Component 和 Entity管理,架构大致如Figure 1。所有的数据均存放在Compon