实时渲染

图形数据的实时计算和输出

实时渲染的本质就是图形数据的实时计算和输出。最典型的图形数据源是顶点。顶点包括了位置、法向、颜色、纹理坐标、顶点的权重等。在第一代渲染技术中(1987年以前)。

渲染简介
在2002年,显卡的性能得到了极大的发展,首先是AGP8X在显卡接口上的引入,使得显卡和处理器在数据传输的带宽上得到了成倍的增加,达到了2.1Gb/s,此外,一些3D性能极其强大的GPU也随着显卡巨头ATI和nVIDIA的竞争不断被发布,如ATI的Radeon9700 pro以及NVIDA的Geforce FX,都支持微软最新一代DirectX 9.0。其中,NVIDIA的Geforce FX更是由于CineFX架构的采用,号称可以支持实时渲染,那么实时渲染对于我们的应用会产生什么影响呢?实时渲染的时代真的要来了吗?
渲染种类
网格渲染
顶点属性只包含位置和颜色,顶点运算只包括对顶点位置的简单变换、顶点的裁剪和投影,光栅化处理中对顶点颜色也只进行了简单的内插,像素运算则很简单——覆盖。渲染技术发展到第二代(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的概念,将实时渲染提到了一个全新的高度。
实时渲染技术从诞生的那一天起就不断地推动着游戏产业的发展,相信也将继续影响下去。
全国各地天气预报查询

上海市

  • 市辖区
  • 云南省

  • 临沧市
  • 云南省

  • 丽江市
  • 云南省

  • 保山市
  • 云南省

  • 大理白族自治州
  • 云南省

  • 德宏傣族景颇族自治州
  • 云南省

  • 怒江傈僳族自治州
  • 云南省

  • 文山壮族苗族自治州
  • 云南省

  • 昆明市
  • 云南省

  • 昭通市
  • 云南省

  • 普洱市
  • 云南省

  • 曲靖市
  • 云南省

  • 楚雄彝族自治州
  • 云南省

  • 玉溪市
  • 云南省

  • 红河哈尼族彝族自治州
  • 云南省

  • 西双版纳傣族自治州
  • 云南省

  • 迪庆藏族自治州
  • 内蒙古自治区

  • 乌兰察布市
  • 内蒙古自治区

  • 乌海市
  • 内蒙古自治区

  • 兴安盟
  • 内蒙古自治区

  • 包头市
  • 内蒙古自治区

  • 呼伦贝尔市
  • 内蒙古自治区

  • 呼和浩特市
  • 内蒙古自治区

  • 巴彦淖尔市
  • 内蒙古自治区

  • 赤峰市
  • 内蒙古自治区

  • 通辽市
  • 内蒙古自治区

  • 鄂尔多斯市
  • 内蒙古自治区

  • 锡林郭勒盟
  • 内蒙古自治区

  • 阿拉善盟
  • 北京市

  • 市辖区
  • 吉林省

  • 吉林市
  • 吉林省

  • 四平市
  • 吉林省

  • 延边朝鲜族自治州
  • 吉林省

  • 松原市
  • 吉林省

  • 白城市
  • 吉林省

  • 白山市
  • 吉林省

  • 辽源市
  • 吉林省

  • 通化市
  • 吉林省

  • 长春市
  • 四川省

  • 乐山市
  • 四川省

  • 内江市
  • 四川省

  • 凉山彝族自治州
  • 四川省

  • 南充市
  • 四川省

  • 宜宾市
  • 四川省

  • 巴中市
  • 四川省

  • 广元市
  • 四川省

  • 广安市
  • 四川省

  • 德阳市
  • 四川省

  • 成都市
  • 四川省

  • 攀枝花市
  • 四川省

  • 泸州市
  • 四川省

  • 甘孜藏族自治州
  • 四川省

  • 眉山市
  • 四川省

  • 绵阳市
  • 四川省

  • 自贡市
  • 四川省

  • 资阳市
  • 四川省

  • 达州市
  • 四川省

  • 遂宁市
  • 四川省

  • 阿坝藏族羌族自治州
  • 四川省

  • 雅安市
  • 天津市

  • 市辖区
  • 宁夏回族自治区

  • 中卫市
  • 宁夏回族自治区

  • 吴忠市
  • 宁夏回族自治区

  • 固原市
  • 宁夏回族自治区

  • 石嘴山市
  • 宁夏回族自治区

  • 银川市
  • 安徽省

  • 亳州市
  • 安徽省

  • 六安市
  • 安徽省

  • 合肥市
  • 安徽省

  • 安庆市
  • 安徽省

  • 宣城市
  • 安徽省

  • 宿州市
  • 安徽省

  • 池州市
  • 安徽省

  • 淮北市
  • 安徽省

  • 淮南市
  • 安徽省

  • 滁州市
  • 安徽省

  • 芜湖市
  • 安徽省

  • 蚌埠市
  • 安徽省

  • 铜陵市
  • 安徽省

  • 阜阳市
  • 安徽省

  • 马鞍山市
  • 安徽省

  • 黄山市
  • 山东省

  • 东营市
  • 山东省

  • 临沂市
  • 山东省

  • 威海市
  • 山东省

  • 德州市
  • 山东省

  • 日照市
  • 山东省

  • 枣庄市
  • 山东省

  • 泰安市
  • 山东省

  • 济南市
  • 山东省

  • 济宁市
  • 山东省

  • 淄博市
  • 山东省

  • 滨州市
  • 山东省

  • 潍坊市
  • 山东省

  • 烟台市
  • 山东省

  • 聊城市
  • 山东省

  • 菏泽市
  • 山东省

  • 青岛市
  • 山西省

  • 临汾市
  • 山西省

  • 吕梁市
  • 山西省

  • 大同市
  • 山西省

  • 太原市
  • 山西省

  • 忻州市
  • 山西省

  • 晋中市
  • 山西省

  • 晋城市
  • 山西省

  • 朔州市
  • 山西省

  • 运城市
  • 山西省

  • 长治市
  • 山西省

  • 阳泉市
  • 广东省

  • 东莞市
  • 广东省

  • 中山市
  • 广东省

  • 云浮市
  • 广东省

  • 佛山市
  • 广东省

  • 广州市
  • 广东省

  • 惠州市
  • 广东省

  • 揭阳市
  • 广东省

  • 梅州市
  • 广东省

  • 汕头市
  • 广东省

  • 汕尾市
  • 广东省

  • 江门市
  • 广东省

  • 河源市
  • 广东省

  • 深圳市
  • 广东省

  • 清远市
  • 广东省

  • 湛江市
  • 广东省

  • 潮州市
  • 广东省

  • 珠海市
  • 广东省

  • 肇庆市
  • 广东省

  • 茂名市
  • 广东省

  • 阳江市
  • 广东省

  • 韶关市
  • 广西壮族自治区

  • 北海市
  • 广西壮族自治区

  • 南宁市
  • 广西壮族自治区

  • 崇左市
  • 广西壮族自治区

  • 来宾市
  • 广西壮族自治区

  • 柳州市
  • 广西壮族自治区

  • 桂林市
  • 广西壮族自治区

  • 梧州市
  • 广西壮族自治区

  • 河池市
  • 广西壮族自治区

  • 玉林市
  • 广西壮族自治区

  • 百色市
  • 广西壮族自治区

  • 贵港市
  • 广西壮族自治区

  • 贺州市
  • 广西壮族自治区

  • 钦州市
  • 广西壮族自治区

  • 防城港市
  • 新疆维吾尔自治区

  • 乌鲁木齐市
  • 新疆维吾尔自治区

  • 伊犁哈萨克自治州
  • 新疆维吾尔自治区

  • 克孜勒苏柯尔克孜自治州
  • 新疆维吾尔自治区

  • 克拉玛依市
  • 新疆维吾尔自治区

  • 博尔塔拉蒙古自治州
  • 新疆维吾尔自治区

  • 吐鲁番市
  • 新疆维吾尔自治区

  • 和田地区
  • 新疆维吾尔自治区

  • 哈密市
  • 新疆维吾尔自治区

  • 喀什地区
  • 新疆维吾尔自治区

  • 塔城地区
  • 新疆维吾尔自治区

  • 巴音郭楞蒙古自治州
  • 新疆维吾尔自治区

  • 昌吉回族自治州
  • 新疆维吾尔自治区

  • 自治区直辖县级行政区划
  • 新疆维吾尔自治区

  • 阿克苏地区
  • 新疆维吾尔自治区

  • 阿勒泰地区
  • 江苏省

  • 南京市
  • 江苏省

  • 南通市
  • 江苏省

  • 宿迁市
  • 江苏省

  • 常州市
  • 江苏省

  • 徐州市
  • 江苏省

  • 扬州市
  • 江苏省

  • 无锡市
  • 江苏省

  • 泰州市
  • 江苏省

  • 淮安市
  • 江苏省

  • 盐城市
  • 江苏省

  • 苏州市
  • 江苏省

  • 连云港市
  • 江苏省

  • 镇江市
  • 江西省

  • 上饶市
  • 江西省

  • 九江市
  • 江西省

  • 南昌市
  • 江西省

  • 吉安市
  • 江西省

  • 宜春市
  • 江西省

  • 抚州市
  • 江西省

  • 新余市
  • 江西省

  • 景德镇市
  • 江西省

  • 萍乡市
  • 江西省

  • 赣州市
  • 江西省

  • 鹰潭市
  • 河北省

  • 保定市
  • 河北省

  • 唐山市
  • 河北省

  • 廊坊市
  • 河北省

  • 张家口市
  • 河北省

  • 承德市
  • 河北省

  • 沧州市
  • 河北省

  • 石家庄市
  • 河北省

  • 秦皇岛市
  • 河北省

  • 衡水市
  • 河北省

  • 邢台市
  • 河北省

  • 邯郸市
  • 河南省

  • 三门峡市
  • 河南省

  • 信阳市
  • 河南省

  • 南阳市
  • 河南省

  • 周口市
  • 河南省

  • 商丘市
  • 河南省

  • 安阳市
  • 河南省

  • 平顶山市
  • 河南省

  • 开封市
  • 河南省

  • 新乡市
  • 河南省

  • 洛阳市
  • 河南省

  • 漯河市
  • 河南省

  • 濮阳市
  • 河南省

  • 焦作市
  • 河南省

  • 省直辖县级行政区划
  • 河南省

  • 许昌市
  • 河南省

  • 郑州市
  • 河南省

  • 驻马店市
  • 河南省

  • 鹤壁市
  • 浙江省

  • 丽水市
  • 浙江省

  • 台州市
  • 浙江省

  • 嘉兴市
  • 浙江省

  • 宁波市
  • 浙江省

  • 杭州市
  • 浙江省

  • 温州市
  • 浙江省

  • 湖州市
  • 浙江省

  • 绍兴市
  • 浙江省

  • 舟山市
  • 浙江省

  • 衢州市
  • 浙江省

  • 金华市
  • 海南省

  • 三亚市
  • 海南省

  • 三沙市
  • 海南省

  • 儋州市
  • 海南省

  • 海口市
  • 海南省

  • 省直辖县级行政区划
  • 湖北省

  • 十堰市
  • 湖北省

  • 咸宁市
  • 湖北省

  • 孝感市
  • 湖北省

  • 宜昌市
  • 湖北省

  • 恩施土家族苗族自治州
  • 湖北省

  • 武汉市
  • 湖北省

  • 省直辖县级行政区划
  • 湖北省

  • 荆州市
  • 湖北省

  • 荆门市
  • 湖北省

  • 襄阳市
  • 湖北省

  • 鄂州市
  • 湖北省

  • 随州市
  • 湖北省

  • 黄冈市
  • 湖北省

  • 黄石市
  • 湖南省

  • 娄底市
  • 湖南省

  • 岳阳市
  • 湖南省

  • 常德市
  • 湖南省

  • 张家界市
  • 湖南省

  • 怀化市
  • 湖南省

  • 株洲市
  • 湖南省

  • 永州市
  • 湖南省

  • 湘潭市
  • 湖南省

  • 湘西土家族苗族自治州
  • 湖南省

  • 益阳市
  • 湖南省

  • 衡阳市
  • 湖南省

  • 邵阳市
  • 湖南省

  • 郴州市
  • 湖南省

  • 长沙市
  • 甘肃省

  • 临夏回族自治州
  • 甘肃省

  • 兰州市
  • 甘肃省

  • 嘉峪关市
  • 甘肃省

  • 天水市
  • 甘肃省

  • 定西市
  • 甘肃省

  • 平凉市
  • 甘肃省

  • 庆阳市
  • 甘肃省

  • 张掖市
  • 甘肃省

  • 武威市
  • 甘肃省

  • 甘南藏族自治州
  • 甘肃省

  • 白银市
  • 甘肃省

  • 酒泉市
  • 甘肃省

  • 金昌市
  • 甘肃省

  • 陇南市
  • 福建省

  • 三明市
  • 福建省

  • 南平市
  • 福建省

  • 厦门市
  • 福建省

  • 宁德市
  • 福建省

  • 泉州市
  • 福建省

  • 漳州市
  • 福建省

  • 福州市
  • 福建省

  • 莆田市
  • 福建省

  • 龙岩市
  • 西藏自治区

  • 山南市
  • 西藏自治区

  • 拉萨市
  • 西藏自治区

  • 日喀则市
  • 西藏自治区

  • 昌都市
  • 西藏自治区

  • 林芝市
  • 西藏自治区

  • 那曲市
  • 西藏自治区

  • 阿里地区
  • 贵州省

  • 六盘水市
  • 贵州省

  • 安顺市
  • 贵州省

  • 毕节市
  • 贵州省

  • 贵阳市
  • 贵州省

  • 遵义市
  • 贵州省

  • 铜仁市
  • 贵州省

  • 黔东南苗族侗族自治州
  • 贵州省

  • 黔南布依族苗族自治州
  • 贵州省

  • 黔西南布依族苗族自治州
  • 辽宁省

  • 丹东市
  • 辽宁省

  • 大连市
  • 辽宁省

  • 抚顺市
  • 辽宁省

  • 朝阳市
  • 辽宁省

  • 本溪市
  • 辽宁省

  • 沈阳市
  • 辽宁省

  • 盘锦市
  • 辽宁省

  • 营口市
  • 辽宁省

  • 葫芦岛市
  • 辽宁省

  • 辽阳市
  • 辽宁省

  • 铁岭市
  • 辽宁省

  • 锦州市
  • 辽宁省

  • 阜新市
  • 辽宁省

  • 鞍山市
  • 重庆市

  • 重庆市

  • 市辖区
  • 陕西省

  • 咸阳市
  • 陕西省

  • 商洛市
  • 陕西省

  • 安康市
  • 陕西省

  • 宝鸡市
  • 陕西省

  • 延安市
  • 陕西省

  • 榆林市
  • 陕西省

  • 汉中市
  • 陕西省

  • 渭南市
  • 陕西省

  • 西安市
  • 陕西省

  • 铜川市
  • 青海省

  • 果洛藏族自治州
  • 青海省

  • 海东市
  • 青海省

  • 海北藏族自治州
  • 青海省

  • 海南藏族自治州
  • 青海省

  • 海西蒙古族藏族自治州
  • 青海省

  • 玉树藏族自治州
  • 青海省

  • 西宁市
  • 青海省

  • 黄南藏族自治州
  • 黑龙江省

  • 七台河市
  • 黑龙江省

  • 伊春市
  • 黑龙江省

  • 佳木斯市
  • 黑龙江省

  • 双鸭山市
  • 黑龙江省

  • 哈尔滨市
  • 黑龙江省

  • 大兴安岭地区
  • 黑龙江省

  • 大庆市
  • 黑龙江省

  • 牡丹江市
  • 黑龙江省

  • 绥化市
  • 黑龙江省

  • 鸡西市
  • 黑龙江省

  • 鹤岗市
  • 黑龙江省

  • 黑河市
  • 黑龙江省

  • 齐齐哈尔市