• 创建场景和赛道——总结


    总结

    在这一章中你学到了很多关于渲染复杂3D物体的知识,如场景、赛道和在赛车游戏中创建关卡。希望也可用于其他游戏,当为游戏创建场景时你要记得下列几件事:

    • 总是先判断玩家是如何看场景的。看上去很棒的场景其实没多大意义,这种场景只在近距离看时很棒,这种场景在策略游戏、RPG游戏或赛车游戏中只覆盖了50米2面积。而在这类游戏中你需要面积更大,这意味着你要么重复纹理或有更好的渲染技术将细节纹理整合成一个大纹理,或使用splatting“绘制”场景地面。

    • 对于创建巨型场景,Splatting是一个很好的技术。大多数游戏使用纹理splatting,使用不同的地面纹理和额外的特殊纹理、赛道等等以构成看上去很棒的地形。如果你没有太多的开发时间,或者如果你不需要巨大的地形,你可以使用如上一章的简单解决方法,对射击游戏来说这个方法很不错。
    • 附加层,shader和特效,特别是水面shader和阴影映射,是一个非常耗时的任务。我特意不在游戏中使用水面效果,因为在过去几个项目里,总是要花费几个星期的时间才能获得满意的水面效果,我了解我自己——我会不停地修改它直到我满意,但往往没有这么多的时间。
    • 你可以从其他人身上学到许多技巧和窍门,互联网上的教程和诸如Game Programming GemsShaderX系列的书上有很多很好的资源。

    生成赛道有类似的规则,首先创建单元测试是很重要的。始终测试性能,特别是当你创建了一个有很多多边形的区域时,在本章中场景使用了130000个左右的多边形,赛道多达24000个多边形,还有额外的50000多个多边形用于赛道护栏,隧道和支持赛道的水泥柱。这意味着即使没有任何额外的场景物体,每帧也要渲染超过200000个多边形,也就是说在帧速率为每秒100帧的情况下光渲染场景和赛道就需要把2000多万个多边形在一秒内传递给GPU。汽车大约有25000个多边形而场景物体有几千多个,这意味如果有1000个场景物体,每帧仍要渲染数百万个多边形。听起来很多,但如果看看TestRenderLandscape单元测试中的截图,你会发现大概有2000个物体在场景中。

    你可能会想到,Xbox 360游戏机的GPU也许无法在一帧时间内处理2-3万多边形且仍保持超过每秒60帧的帧速率。在PC更糟的是,75赫兹是最常用的屏幕刷新率而大多数玩家的GPU太慢,导致无法在一帧中处理所有三维几何数据。为了确保游戏在中档或低档电脑上仍能运行良好,使用了以下技巧:

    • 不要渲染看不见的东西。场景和赛道总是可见的,所以你不能忽略它们。但许多场景模型可能在你身后或超出你的视野,可简单地忽略它们。另一个诀窍是忽略任何太遥远的模型,特别是100米开外的较小的3D模型。这是提升游戏性能的最大技巧。看一下Model类和Render方法以了解更多关于这一技巧的知识。

    • 在每帧开始时渲染GPU的大量数据。通过这种方式,你可以在GPU仍在处理场景和赛道多边形的同时,准备好场景模型和其他渲染数据。

    • 总是通过shader排序渲染。在前面的一些游戏中你已看到MeshRender是如何被使用的,以及它是如何极大地提高性能的。在对赛车游戏的性能测试(见Model类)中我不断提高MeshRenderManager类的性能。特别是对同一类型的大量物体使用相同的shader,性能是令人诧异的。查看TestRenderManyModels单元测试,它将超过1亿个多边形传递给Xbox 360的GPU(也可以是你的PC,如果你的GPU足够快的话)。

    • 使用简单的shader!在原始版本的Rocket Commander游戏中所有物体都使用ParallaxShader,相对NormalMapping shader来说只是添加了几条额外的指令,但它仍然需要花费比NormalMapping更多的时间。为此,在赛车游戏中只使用法线映射,而且视觉效果并没有多大差别。只有场景采用了更复杂的shader来添加细节映射效果(见图12-7;这确实是值得的)。

    好吧,在这一切新知识让你的大脑爆炸前,先放松一会儿。第13章是关于物理学的,会涉及很多数学知识。当你阅读第14章时,你将最终能把所有东西都整合到一起。

  • 相关阅读:
    2018暑假假期周进度报告——第八周
    zf-关于评价器的开关所在的配置文件,与代码如何修改。
    不要点击一个功能就创建一个新的网页,要尽量少的新创建页面(例如:办事指南,点击一个部门创建一个网页,选择具体事项时,又创建一个网页,这样创建的网页太多)
    实现jsp页面显示用户登录信息,利用session保存。
    zf-关于更换页面,的各种问题。
    报错 BeanFactory not initialized or already closed
    Server Tomcat v6.0 Server at localhost was unable to start within 45 seconds
    如果在一个实现类中改变另外一个类中的变量,但是怎么改网页上都没变化的问题。
    如果更新包更新包现场,class文件更新过去,没有改变,及时删掉,照样能进那个模块的问题。
    使用内链接(A a inner join B b on a.xx = b.xx)查询2个表中某一列的相同的字段。
  • 原文地址:https://www.cnblogs.com/AlexCheng/p/2120195.html
Copyright © 2020-2023  润新知