王朝百科
分享
 
 
 

实时渲染

王朝百科·作者佚名  2009-12-22  
宽屏版  字体: |||超大  

实时渲染的本质就是图形数据的实时计算和输出。最典型的图形数据源是顶点。顶点包括了位置、法向、颜色、纹理坐标、顶点的权重等。在第一代渲染技术中(1987年以前)——网格渲染,顶点属性只包含位置和颜色,顶点运算只包括对顶点位置的简单变换、顶点的裁剪和投影,光栅化处理中对顶点颜色也只进行了简单的内插,像素运算则很简单——覆盖。渲染技术发展到第二代(1987~1992年)——阴影渲染,顶点属性中增加了法向,用来进行光照计算。第二代渲染技术中引进了一个很重要的概念——深度,典型的应用就是深度缓冲。在光栅化处理中还增加了深度内插。像素运算中增加了颜色混合技术。第二代渲染技术丰富了画面的色彩感和层次感,但整个画面看起来还是很单调。第三代渲染技术解决了这一问题(1992~2000年)——纹理贴图,顶点属性中又增加了纹理坐标,顶点运算中也相应地增加了纹理坐标的变换和内插。光栅化处理中增加了纹理坐标内插。像素运算中增加了纹理寻址和混合以及反锯齿等技术。第三代渲染技术让画面更加绚丽多彩。随着图形处理技术的飞速发展,早期的固定函数渲染管线已经不能满足图形开发人员的要求,他们需要图形处理过程中更大的自由度。第四代渲染技术产生了(2000年后)——可编程渲染。在第四代渲染技术中,图形开发人员可以对渲染管线中的顶点运算和像素运算分别进行编程处理了,而无须象以前那样套用一些固定函数。比如,对于顶点渲染,你不仅仅能简单套用SetTransform方法实现顶点位置的变换,更为灵活的是,你可以通过编写程序(汇编程序或高级语言程序),实现顶点位置的更为复杂的变换;在光照计算中,你可以从最基本的光照模型出发,编写程序分别计算漫射、高光、折射、散射等,更重要的是,你还可以将计算结果作为像素渲染程序的输入,以实现各种丰富的效果。在像素渲染中,除了烦琐调用大量固定函数来实现外,你还可以编写程序,从外部或者上游获取参数和纹理资源,进行像素渲染运算。像素渲染需要的运算量远远大于顶点渲染,但输出画面的质量却很高。许多高质量的画面都是用像素渲染代替顶点渲染获得的。

谈到可编程渲染,那就必然要谈到编程语言。早期对图形处理器的编程采用Vertex Shader和Pixel Shader——它们一种类似汇编语言的程序语言,编写工作量大。随着图形硬件的发展,图形处理器所能处理的指令数快速增长,采用类似汇编的方式进行编程的工作量达到了让人不能接受的地步,于是用于图形处理器编程的高级语言诞生了。Cg语言就是其中的一个。Cg语言是nVIDIA公司与微软合作进行HLSL语言的研发过程中,nVIDIA公司开发的一个副产品。两者从本质上是一样的。为使得自己的产品更有通用性,nVIDIA的Cg语言是跨平台和跨API的。关于HLSL的介绍很多,这里就以Cg语言为例介绍一下可编程渲染。

Cg即C for Graphic,意即用于图形处理的C语言。其语法结构类似于C语言,但所有指令却是由GPU来执行的。C语言的指令都是由CPU来执行的。以C语言为基础,Cg针对GPU的特点进行了改进和优化。配合Cg语言的发布,nVIDIA提供了一套完整的工具包,其中主要包括:Cg用户手册、Cg语言编译器、Cg标准库、Cg运行时库、Cg浏览器等。用户手册向开发人员提供了有关Cg语言使用的详细说明;编译器允许你先将程序编译输出为汇编代码,直接供应用程序调用;Cg标准库非常类似于C语言的标准库,大大简化了编程,Cg标准库包括数学函数、几何函数、纹理映射函数以及一些导出函数等;Cg运行时库允许应用程序在运行时编译和连接Cg程序,运行时库包括核心运行库和API相关运行库两种;Cg浏览器方便开发者浏览nVIDIA公司提供的渲染实例效果。nVIDIA公司同样支持微软的.fx文件。FX文件中封装了渲染指令和渲染状态。针对FX文件同样有运行时库支持。nVIDIA为DCC们提供了一个插件,该插件调用FX文件,使得模型离线渲染的效果与运行时渲染的结果保持一致。

nVIDIA在Cg语言中提出了一个Profile的概念,不同的Profile决定了Cg程序在编译时其中的某些语法、控制指令、标准库函数、数据精度等是否被支持。从这一点上来讲,Profile似乎翻译成“版本”比较合适。如果这个“版本”被硬件所支持,Cg程序才可能得以正常执行。Cg支持所有当前硬件支持的Profile。这一点与HLSL不同,微软允许软件模拟——即由CPU去模拟本应由GPU完成的渲染任务。所以HLSL中允许软件渲染的Vertex Shader和Pixel Shader版本超过硬件所支持的版本。另一方面,由于Cg支持跨API,所以Cg还支持OpenGL 各个版本的Vertex Program Profile和Fragment Program Profile, HLSL则只支持DirectX Vertex Shader和Pixel Shader。

在讨论可编程GPU时,为什么要将Vertex Program和Fragment Program分开呢。与CPU只是一个处理器不同,GPU内部包含两个处理器——顶点处理器和像素处理器,同时还包括一些不可编程的硬件单元(用于固定函数管线渲染)。所以对CPU进行编程只需要一个C程序,而对GPU进行编程则需要两种程序:Vertex Program对顶点处理器进行编程,而Fragment Program对像素处理器进行编程。当然,对顶点处理和像素处理部分也可以选择固定函数管线处理。Cg语言可以完美地实现Cg程序与固定函数管线的完美结合。

可编程渲染技术的发展,对游戏引擎中渲染部分的开发也产生了深远的影响。一般地,我们可以通过两种途径实现游戏中的渲染效果。第一,渲染效果在关卡设计过程中由设计人员灵活实现。这主要是得益于.FX文件。这样做的好处显而易见,设计人员有了更大的自由度和发挥空间,而且所设计出来的场景与实际运行时的效果保持一致。采用这一途径需要注意避免频繁地切换渲染程序导致渲染帧率的降低。第二,从预先制作好的渲染效果库中选取游戏所需要的。这需要程序设计人员添加必要的C++代码引用这些渲染程序模块。一般情况下,程序员还需要将渲染程序中的相关参数编码到模型(顶点)或纹理中去,以有效提高渲染速率。采用这种方式,程序设计人员就可以比较有针对性地避免渲染程序的频繁切换,以确保游戏运行时的帧率。当然,一旦引擎确定,可得到的渲染效果库也就确定了。不同的游戏类型,不同的游戏,对两种渲染途径的要求也不同。这些都需要我们在设计游戏引擎时进行分析和考虑的。

随着相关产业对图形处理要求的不断提高,图形处理器将朝着两个方向发展:更快的运算速度和更加自由的可编程性。硬件速度的提高,也将不断催生出一些新的渲染技术,同时也使得一些在目前的硬件平台上难以实现的渲染技术变为可能。光照计算所需要的运算量很大,在目前还只能通过各种间接的途径模拟实现。可以预见,在下一代的实时渲染技术中,象光线追踪、真阴影等技术或许将变为可能。这些技术的实现,将使得图形渲染效果变得更为真实。高度真实是实时渲染技术未来发展的一大特征。硬件可编程度的提高,使得设计人员对硬件的控制将变得更为灵活和富有创造性。可编程将是未来渲染技术发展的又一大特征。nVIDIA在力推其新一代图形处理器及Cg语言的同时提出了一个Cinematic Render的概念,将实时渲染提到了一个全新的高度。

实时渲染技术从诞生的那一天起就不断地推动着游戏产业的发展,相信也将继续影响下去。

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
如何用java替换看不见的字符比如零宽空格​十六进制U+200B
 干货   2023-09-10
网页字号不能单数吗,网页字体大小为什么一般都是偶数
 干货   2023-09-06
java.lang.ArrayIndexOutOfBoundsException: 4096
 干货   2023-09-06
Noto Sans CJK SC字体下载地址
 干货   2023-08-30
window.navigator和navigator的区别是什么?
 干货   2023-08-23
js获取referer、useragent、浏览器语言
 干货   2023-08-23
oscache遇到404时会不会缓存?
 干货   2023-08-23
linux下用rm -rf *删除大量文件太慢怎么解决?
 干货   2023-08-08
刀郎新歌破世界纪录!
 娱乐   2023-08-01
js实现放大缩小页面
 干货   2023-07-31
生成式人工智能服务管理暂行办法
 百态   2023-07-31
英语学习:过去完成时The Past Perfect Tense举例说明
 干货   2023-07-31
Mysql常用sql命令语句整理
 干货   2023-07-30
科学家复活了46000年前的虫子
 探索   2023-07-29
英语学习:过去进行时The Past Continuous Tense举例说明
 干货   2023-07-28
meta name="applicable-device"告知页面适合哪种终端设备:PC端、移动端还是自适应
 干货   2023-07-28
只用css如何实现打字机特效?
 百态   2023-07-15
css怎么实现上下滚动
 干货   2023-06-28
canvas怎么画一个三角形?
 干货   2023-06-28
canvas怎么画一个椭圆形?
 干货   2023-06-28
canvas怎么画一个圆形?
 干货   2023-06-28
canvas怎么画一个正方形?
 干货   2023-06-28
中国河南省郑州市金水区蜘蛛爬虫ip大全
 干货   2023-06-22
javascript简易动态时间代码
 干货   2023-06-20
感谢员工的付出和激励的话怎么说?
 干货   2023-06-18
 
>>返回首页<<
 
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有