3D编程的一些总结

来源:互联网 发布:java mongotemplate 编辑:程序博客网 时间:2024/05/19 18:47

以下是这段时间自己的一些理解,想法和总结:

渲染UI以及其他字体方式:在3D场景渲染完成以后,关闭z缓存,投影方式由原来的透视投影变为正交投影(在代码中表现为使用不同的投影矩阵进行顶点计算),然后开始渲染2D图像(比如UI,字体等),由于z缓存已经关闭,所以渲染2D的时候需要使用类似画家算法的方法按顺序把2D图像渲染到backbuffer中。还有值得注意的是,一般UI和字体的viewMatrix(视图变换矩阵)是不变的(不随摄像机的移动而变换,区别与3D场景中的一切),所以可以在初始化时就定义好。

视截体剔除(frustum culling): 这是提高3D场景渲染效率的一种方式。其实就是在渲染每一个3D模型之前,判断一下此模型(一般会给复杂的模型定义一个bounding volume代表此模型的边界,而不是使用模型的每一个三角面来进行测试,以此减少运算量)是否在视截体(就是近平面和远平面构成的一个立体的梯状体,共六个面,面的构建和检测算法貌似都得自己实现)中,如果检测结果为否,则不对此物体进行绘制操作。相比之下,如果不进行如前所述的方法,对3D场景中的每一个模型都进行渲染操作,则D3D在内部进行剔除操作时,会对场景中的每一个模型的每一个三角面进行剔除操作,显然这是非常笨拙和缓慢的做法(比如一个模型含有1W个三角面,需要进行1W次的三角面的测试剔除操作,如果使用bounding volume,通常只是一个立方体或者圆柱体或者其他简单的几何体来代表这个模型)。

D3D字体系统:字体的显示属于2D显示,和UI一样,渲染时需要关闭z缓存,使用正交投影,viewMatrix保持不变。D3D貌似提供API来进行字体绘制(据我了解D3D9是提供的),但大部分3d应用程序的字体系统都有很高的定制需求,所以会自己实现一套字体系统。基本原理就是使用贴图的方式(两个三角形构成一个正方形,把贴图放到此正方形中),把需要的字体渲染到场景中。

原创粉丝点击