在游戏引擎中常用的phong光照模型型有哪些

您所在位置: &
&nbsp&&nbsp
3D游戏引擎中场景绘制及光照渲染技术的研究与实现.pdf60页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
文档加载中...广告还剩秒
需要金币:50 &&
你可能关注的文档:
··········
··········
中南大学 硕士学位论文
3D游戏引擎中场景绘制及光照渲染技术的研究与实现 姓名:胡维和 申请学位级别:硕士 专业:计算机软件与理论 指导教师:曾巧明 座机电话号码 摘要 3D游戏引擎包括几个方面:场景绘制、光照渲染、动画技术、
碰撞检测以及网络管理。其中,三维场景的绘制与光照的渲染是它的
核心与关键。另外,计算机游戏对游戏场景要求有较高的真实度与实
时性。其真实度要求全局光照效果的逼真渲染,实时性则要求对场景
进行快速绘制。如何提高游戏与用户的交互速度而又不影响场景的真
实效果,一直以来是一个研究热点。 针对这一现象而进行了研究与改进。首先,介绍了3D游戏引擎
的发展与加速绘制三维游戏场景及全局光照渲染的相关技术。然后,
研究了如何利用三角形网格为三维游戏场景中的几何体进行建模。通
过结合光学中的视域衰减模型,提出了一个基于视域衰减的LOD地
形快速生成算法。最后,通过对全局光照模型的各个分枝地研究,并
结合预计算技术,提出了一个基于预计算静态场景的间接光照路径而
实现的全局光照明的动画算法。 通过研究与实现,对3D游戏引擎中的场景绘制及全局光照有了
深入的了解。基于视域衰减算法生成了三维LOD地形三角形网格,
绘制帧频达到了实时的要求,并且具有相当的真实性。预计算静态场
景的全局光照而实现的动画算法,在加速游戏场景光照效果渲染上有
非常实用的价值和意义。
关键词三维建模,地形生成,非规则三角网格,实时绘制,预计算 ABSTRACT a withauser Avideo is thatinvolvesinteraction interface gamegame feedbackonavideo wordvideoin
to visual device.The video generate referredtoaraster device. traditi
正在加载中,请稍后...【DirectX11】第八篇 光照模型——漫反射
本系列文章主要翻译和参考自《Real-Time 3D Rendering with DirectX and HLSL》一书(感谢原书作者),同时会加上一点个人理解和拓展,文章中如有错误,欢迎指正。
是书中的代码和资源。
在现实世界中,没有光我们将看不见任何东西,你所看见的物体或者是反射了光源的光或者是本身就能自发光。在计算机渲染的过程中,你将模拟灯光与物体的交互,并以此增加3D物体表面的细节。但是灯光的相互影响是一个非常复杂的过程,在目前的技术中并不能达到在一个可交互的帧率范围内进行这样大量的重复计算。因此,一般会采用一种近似算法,用一种描述灯光与3D模型如何交互的灯光模型来为你的感官增加更多可感受的细节。这篇文章中将介绍一些基础的光照模型。
Diffuse Lighting: 漫反射光照
不同的表面会以不同的方式反射光。镜面会将光线以与入射光相同角度的反方向反射出去。漫反射表面则会将入射光均等地反射到各个方向。
目前最简单通用的模拟漫反射的光照模型应该是兰伯特余弦定理(Lambert&s cosine law)。兰伯特余弦定理:模型表面的明亮度直接取决于光线向量(light vector)和表面法线两个向量将夹角的余弦值。光线向量是指这个点到光从哪个方向射入,表面法线则定义了这个表面的朝向。如下图所示:​
两个向量间的夹角可以通过两个向量点乘的公式计算得出。表面法线可以通过两条边叉乘得出,通常情况,表面法线信息会在3D模型中直接提供出来。下面我们来讨论下如何得到光线向量。
(1) Directional Lights : 平行光
在3D图形学中,有三种常见的光线类型:平行光(directional lights),点光源(point lights)以及聚光灯(spotlights)。平行光所代表的光源是那种具有无限远距离的光源,这种光源对你场景中的模型并没有具体位置。正因如此,这类型的光线总是以平行的方式到达每个物体的表面,他们都以同样的方向进行入射。太阳光就是这类型光源的很好的例子,虽然太阳并不是严格意义上有无限远距离的光源。但他与地球的距离已经足够让你没有办法分辨每一束光的入射方向。如下图所示为平行光:
想要模型化一个平行光,你只需要知道一个三维向量上光线的来源方向。你也可以在这个光源信息中加入颜色和强度信息,就想在这篇文章中环境光中所做的那样。下面的代码展示了如何用单一的平行光渲染出效果。
代码段Listing 6.2 DiffuseLighting.fx
#include &include\\Common.fxh&
/*************** Resources ***************/
cbuffer CBufferPerFrame
float4 AmbientColor : AMBIENT
string UIName = &Ambient Light&;
string UIWidget = &Color&;
= {1.0f, 1.0f, 1.0f, 0.0f};
float4 LightColor : COLOR
string Object = &LightColor0&;
string UIName = &Light Color&;
string UIWidget = &Color&;
& = {1.0f, 1.0f, 1.0f, 1.0f};
float3 LightDirection : DIRECTION
string Object = &DirectionalLight0&;
string UIName = &Light Direction&;
string Space = &World&;
& = {0.0f, 0.0f, -1.0f};
cbuffer CBufferPerObject
float4x4 WorldViewProjection : WORLDVIEROJECTION ;
float4x4 World : WORLD ;
Texture2D ColorTexture
string ResourceName = &default_color.dds&;
string UIName = &Color Texture&;
string ResourceType = &2D&;
SamplerState ColorSampler
Filter = MIN_MAG_MIP_LINEAR;
AddressU = WRAP;
AddressV = WRAP;
RasterizerState DisableCulling
CullMode = NONE;
/*************** Data Structures ***************/
struct VS_INPUT
float4 ObjectPosition : POSITION;
float2 TextureCoordinate : TEXTCOORD;
float3 Normal : NORMAL;
struct VS_OUTPUT
float4 Position : SV_P
float3 Normal : NORMAL;
float2 TextureCoordinate : TEXTCOORD0;
float3 LightDirection : TEXCOORD1;
/*************** Vertex Shader ***************/
VS_OUTPUT Vertex_shader(VS_INPUT IN)
VS_OUTPUT OUT = (VS_OUTPUT)0;
OUT.Position = mul(IN.ObjectPosition, WorldViewProjection);
OUT.TextureCoordinate = get_corrected_texture_coordinate(IN.TextureCoordinate);
OUT.Normal = normalize(mul(float4(IN.Normal, 0), World).xyz);
return OUT;
/*************** Pixel Shader ***************/
float4 pixel_shader(VS_OUTPUT IN) : SV_Position
float4 OUT = (float4)0;
float3 normal = normalize(IN.Normal);
float3 lightDirection = normalize(IN.LightDirection);
float n_dot_1 = dot(lightDirection, normal);
float4 color = ColorTexture.Sample(ColorSampler, IN.TextureCoordinate);
float3 ambient = AmbientColor.rgb * AmbientColor.a * color.
float3 diffuse = (float3)0;
if(n_dot_1 & 0)
diffuse = LightColor.rgb * LightColor.a * n_dot_1 * color.
OUT.rgb = ambient +
OUT.a = color.a;
return OUT;
/*************** Techniques ***************/
technique10 main10
SetVertexShader(CompileShader(vs_4_0, vertex_shader()));
SetGeometryShader(NULL);
SetPixelShader(CompileShader(ps_4_0, pixel_shader()));
SetRasterizerState(DisableCulling);
(2) Diffuse Lighting Effect Preamble : 漫反射光照效果准备
DiffuseLighting.fx文件的第一行以C语言风格的代码引入一个常用的效果函数库文件。你需要在你的项目中新建一个include文件夹并将这个文件添加到文件夹下。下面的代码段展示了这个文件中的内容。注意引入文件所使用的是双引号,并且FLIP_TEXTURE_Y宏定义和get_corrected_texture_coordinate()函数已经转移到这个文件中实现了。
代码段Listing 6.3 Common.fxh
#ifndef _COMMON_FXH
#define _COMMON_FXH
/************* Constants *************/
#define FLIP_TEXTURE_Y 1
/************* Utility Functions *************/
float2 get_corrected_texture_coordinate(float2 textureCoordinate)
#if FLIP_TEXTURE_Y
return float2(textureCoordinate.x, 1.0 - textureCoordinate.y);
return textureC
float3 get_vector_color_contribution(float4 light, float3 color)
// Color (.rgb) * Intensity (.a)
return light.rgb * light.a *
float3 get_scalar_color_contribution(float4 light, float color)
// Color (.rgb) * Intensity (.a)
return light.rgb * light.a *
#endif /* _COMMON_FXH */
接下来在CBufferPerFrame中也加入了新成员:LightColor和LightDirection。LightColor和AmbientColor有一样的函数体,分别代表了平行光的颜色和强度。LightDirection中保存了光源在世界空间中的方向。这两个新成员同样也关联了新的对象注解。这两个注解说明这两个成员也可以被关联到场景对象中,也就是说,你可以在FX Composer的属性面板中通过注解字符串找到对应的属性并进行调整,关于怎么调整将在这篇文章的稍后一部分中介绍[(5) Diffuse Lighting Output)]。
CBufferPerObject中也加入了新成员World。这个成员与VS_INPUT结构体中的新成员normal密切相关。表面法线方向一开始是相对于本地坐标系的,就像顶点数据一样。你使用法线向量和光向量相乘得到这个像素的光强度时,这个光向量却是相对于世界坐标系的,因此必须把法线向量也转换成在世界坐标系下的,world这个矩阵就是用来做这种转换的。不能用WorldViewProjection矩阵做转换是因为这个矩阵会将向量转换为齐次坐标空间下的。在这里需要注意World这个矩阵也可能会将向量在原来的基础上进行缩放,而我们需要的法线是单位化向量,因此在经过这个矩阵的转换后还需要将法线再单位化一次。
(3) Diffuse Lighting Vertex Shader : 漫反射光照顶点着色器
VS_OUTPUT结构体中增加了两个新成员:Normal和LightDirection。Normal常量用于传输经过计算的表面法线值。LightDirection,这个成员是由于你在像素着色器中需要的是从表面到光源的方向,而从顶点着色器的输入参数中获得的是光源到表面的着色器。因此,你需要在顶点着色器中将其进行转换,当然,你也可以在CPU端转好了再传过来(最好是这样)。
关于顶点着色器的输出
细心的童鞋可以发现,顶点着色器的输出结构中LightDirection这个成员所关联的语义是TEXCOORD1。为什么一个方向型的float3常量会和TEXCOORD这样的语义相关联呢?又为什么TEXCOORD这个语义后面的数字是1?可不可以是2、3、4甚至5呢?
以下为笔者自己的理解。 在结构体里面定义的这些常量,不一定每一个都有具体的语义和他相对应,在没有的情况下可以选择TEXCOORD这个语义,因为他是float4类型的,所以当然float3类型的也可以通过他进行传递。那么再来是第二个问题,TEXCOORD在官方SDK中的定义是TEXCOORD[n],可见,后面的这个数字是任意的,也可以没有,加上不同的数字只是为了与不同的常量相关联,这样,在传递数据的时候才能区分开来。
(4) Diffuse Lighting Pixel Shader
这部分将介绍下加入了漫反射光后像素着色器中多了些什么。
代码段Listing6.4 DiffuseLighting.fx文件中的像素着色器
float4 pixel_shader(VS_OUTPUT IN) : SV_Target
float4 OUT = (float4)0;
float3 normal = normalize(IN.Normal);
float3 lightDirection = normalize(IN.LightDirection);
float n_dot_1 = dot(lightDirection, normal);
float4 color = ColorTexture.Sample(ColorSampler, IN.TextureCoordinate);
float3 ambient = AmbientColor.rgb * AmbientColor.a * color.
float3 diffuse = (float3)0;
if(n_dot_1 & 0)
diffuse = LightColor.rgb * LightColor.a * n_dot_1 * color.
OUT.rgb = ambient +
OUT.a = color.a;
return OUT;
首先,为了更清晰的描述最终的颜色值还加入了漫反射光的影响,将ambient的计算与最终输出的OUT像素值分开。
其次,将传入的Normal和LightDirection向量都进行了单位化,这是因为从光栅阶段传过来的这些数据可能已经经过处理,已经不是单位化的了。这里的错误很容易被忽略,因为这只是视觉效果上的差异。当运行的时候发现报错了,也很可能会将这些错误忽略,所以这个步骤非常重要。
最后,我们将光向量和表面法线做了点乘,并用这个值计算出了最终的漫反射光线颜色。注意,在计算diffuse颜色时,我们使用了if判断句,因为当n_dot_1小于零时说明光线在这个表面的背后,也即这个表面无法接受到光,所以这部分像素点的漫反射光线颜色应该是纯黑色的。当n_dot_1值为0时代表光线与表面法线是完全垂直的,即与表面是完全平行的,那这个面应该不接受漫反射光线。同理,但n_dot_1值为1时代表光线与表面时完全垂直的,能够接受到全部的入射光。最终输出的颜色值是由环境光和漫反射光线的结果结合起来得到的。注意,代码中默认的环境光alpha通道是0,所以假定环境光对这个模型完全没有影响,这样我们才能看到模型的背面是全黑的。
(5) Diffuse Lighting Output
像素着色器中最终输出的像素颜色值由环境光和漫反射光相加得到,像素点的透明度由图片的alpha通道决定。下图为对模型使用了之前使用的地球贴图并将环境光强度调为0后的显示结果:
注意,在这张图中可以看出在模型的下面加入了一个平行光。NVIDIA FX Composer可以选择在Render Panel中显示创建的环境光(ambient)、点光(point)、聚光灯(spot)和平行光(directional)。要增加这些光可以在主工具栏中选择或者是在Create菜单中添加。要使添加的平行光和你的shader联系起来,必须将灯光绑定到LightColor和LightDirection常量中。这里对象中的注解就派上用场了。要绑定灯光需要先选中Render面板中的地球球体,然后选中属性面板中的Material Instance Properties选项,这个图标位于面板上图标的第五个(详见下图)。再为面板中的directionallight0和lightcolor0两个常量选中你刚刚创建的那个平行光。现在,你的平行光已经绑定到这个shader中了,你对平行光所做的操作都会体现在球体的光照上,比如旋转平行光,你会发现模型上的阴影位置改变了。但需要注意,由于平行光没有具体的位置概念,因此不管你怎么改变平行光模型的位置都不会对模型的光线产生任何影响。你也可以通过选中平行光在属性面板中改变平行光的颜色和强度。
NVIDIA FX Composer工具支持手动、自动绑定。当启用自动绑定时,工具会尽量帮你在项目中查找最适合的灯光来绑定shader常量。但这不是总能正确成功的,所以你需要自己去检查常量有没有被正确绑定。
但是,当你rebuild这个shader时,手动绑定的常量会遗失,需要再重新绑定。
这篇文章中主要介绍了一个最简单的漫反射光照模型是如何实现的,关于漫反射光照模型还有其他更为详细的实现方式,比如龙书中的相关章节就给出了更多参数的Lambert光照模型。漫反射光照模型是基础,下一篇文章中的高光模型就需要在漫反射的基础上加入高光点的计算。
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。游戏引擎架构_百度百科
游戏引擎架构
《游戏引擎架构》是2014年电子工业出版社出版的图书,作者是杰森.格雷戈瑞)。
游戏引擎架构内容简介
《游戏引擎架构》同时涵盖游戏引擎软件开发的理论及实践,并对多方面的题目进行探讨。本书讨论到的概念及技巧实际应用于现实中的游戏工作室,如艺电及。虽然书中采用的例子通常依据一些专门的技术,但是讨论范围远超于某个引擎或API。文中的参考及引用也非常有用,可让读者继续深入游戏开发过程的任何特定方向。
《游戏引擎架构》为一个大学程度的游戏编程课程而编写,但也适合软件工程师、业余爱好者、自学游戏程序员,以及游戏产业的从业人员。通过阅读《游戏引擎架构》,资历较浅的游戏工程师可以巩固他们所学的游戏技术及引擎架构的知识,专注某一领域的资深程序员也能从本书更为全面的介绍中获益。
宣传语:迈向现代游戏之路完美入口 业界万众企盼 隆重推荐
游戏引擎架构作品目录
推荐序1 iii
第一部分 基础 1
第1章 导论 3
1.1 典型游戏团队的结构 4
1.2 游戏是什么 7
1.3 游戏引擎是什么 10
1.4 不同游戏类型中的引擎差异 11
1.5 游戏引擎概观 22
1.6 运行时引擎架构 27
1.7 工具及资产管道 46
第2章 专业工具 53
2.2 微软Visual Studio 61
2.3 剖析工具 78
2.4 和损坏检测 79
2.5 其他工具 80
第3章 游戏软件工程基础 83
3.1 重温C++及最佳实践 83
3.2 C/C++的数据、代码及内存 90
3.3 捕捉及处理错误 118
第4章 游戏所需的三维数学 125
4.1 在二维中解决三维问题 125
4.2 点和矢量 125
4.3 矩阵 139
4.5 比较各种旋转表达方式 164
4.6 其他数学对象 168
4.7 的运算 173
4.8 产生 180
第二部分 低阶引擎系统 183
第5章 游戏支持系统 185
5.1 子系统的启动和终止 185
5.3 容器 208
5.4 字符串 225
5.5 引擎配置 234
第6章 资源及文件系统 241
6.1 文件系统 241
6.2 资源管理器 251
第7章 游戏循环及实时模拟 277
7.1 渲染循环 277
7.2 游戏循环 278
7.3 游戏循环的架构风格 280
7.4 抽象时间线 283
7.5 测量及处理时间 285
7.6 多处理器的游戏循环 296
7.7 网络多人游戏循环 304
第8章 人体学接口设备(HID) 309
8.1 各种人体学接口设备 309
8.2 人体学接口设备的接口技术 311
8.3 输入类型 312
8.4 输出类型 316
8.5 游戏引擎的人体学接口设备系统 318
8.6 人体学接口设备使用实践 332
第9章 调试及开发工具 333
9.1 日志及跟踪 333
9.2 调试用的绘图功能 337
9.3 游戏内置菜单 344
9.4 游戏内置主控台 347
9.5 调试用摄像机和游戏暂停 348
9.6 作弊 348
9.7 屏幕截图及录像 349
9.8 游戏内置性能剖析 349
9.9 游戏内置的内存统计和泄漏检测 356
第三部分 图形及动画 359
第10章 渲染引擎 361
10.1 采用深度缓冲的三角形基础 361
10.2 渲染管道 404
10.3 高级光照及 426
10.4 视觉效果和 438
10.5 延伸阅读 446
第11章 动画系统 447
11.1 角色动画的类型 447
11.2 骨骼 452
11.3 姿势 454
11.4 动画片段 459
11.5 蒙皮及调色板 471
11.6 动画混合 476
11.7 后期处理 493
11.8 压缩技术 496
11.9 动画系统架构 501
11.10 动画管道 502
11.11 动作 515
11.12 动画控制器 535
第12章 碰撞及 537
12.1 你想在游戏中加入物理吗 537
12.2 碰撞/物理中间件 542
12.3 碰撞检测系统 544
12.4 刚体动力学 569
12.5 整合至游戏 601
12.6 展望:高级物理功能 616
第四部分 游戏性 617
第13章 游戏性系统简介 619
13.1 剖析游戏世界 619
13.2 实现动态元素:游戏对象 623
13.3 数据驱动游戏引擎 626
13.4 游戏世界编辑器 627
第14章 运行时游戏性基础系统 637
14.1 游戏性基础系统的组件 637
14.2 各种运行时对象模型架构 640
14.3 世界组块的数据格式 657
14.4 游戏世界的加载和串流 663
14.5 对象引用与世界查询 670
14.6 实时更新游戏对象 676
14.7 事件与消息泵 690
14.8 脚本 707
14.9 高层次的游戏流程 726
第五部分 总结 727
第15章 还有更多内容吗 729
15.1 一些未谈及的引擎系统 729
15.2 游戏性系统 730
参考文献 733
中文索引 737
英文索引 755
游戏引擎架构精彩节摘
最初拿到《Game Engine Architecture》一书的英文版,是编辑侠少邮寄给我的打印版。他建议我接下翻译此书的合同。当时我正在杭州带领一个团队开发3D游戏引擎,我和我的同事都对这本书的内容颇有兴趣,两大本打印的英文书立刻在同事间传开。可惜那段时间个人精力顾及不来,把近千页的英文读物精读而后翻译成中文对个人的业余时间是个极大的挑战,不能担此翻译任务颇为遗憾。
不久以后听说Milo Yip(叶劲峰)已开始着手翻译,甚为欣喜。翻译此巨著,他一定是比我更合适的人选。我和Milo虽未曾蒙面,但神交已久。在网络上读过一些他的成长经历,和我颇为相似,心有戚戚。他对游戏3D技术研究精深为我所不及,我们曾通过Google Talk讨论过许多技术问题,他都有独到的见解。翻译工作开始后,Milo是香港人,英文技术术语在香港的中文译法和大陆的有许多不同。但此书由大陆出版社出版,考虑到面对的读者主要是大陆程序员,Milo希望能更符合大陆程序员的用词习惯,所以在翻译一开始就通过Google Docs创建了协作页面,邀请大家共同探讨书中技术名词的中译名。从中我们可以一窥他作为译者的慎重。
三年之后,有幸在出版之前就拿到了完整的译本。这是一本用LaTeX精心排版的800页的电子书,我只花了一周时间,几乎是一口气读完。流畅的阅读享受,绝对不仅仅是因为原著精彩的内容,精美的版面和翔实的译注也加了不少分。
在阅读本书的过程中,我不只一次地获得共鸣。例如在第5章的内存管理系统的介绍中,作者介绍的几种游戏特有的方法我都曾在项目中用过,而这是第一次有书籍专门将这些方法详尽记录;又如第11章动画系统的介绍,我们也同样在3D引擎开发过程中改进原有动画片段混合方法的经历。虽然书中介绍的每个技术点,都可能可以在某篇论文,某本其他的书的章节,某篇网络blog上见过,但之前却无一本书可以把这些东西放在一起相互参照。对于从事游戏引擎开发的程序员来说,了解各种引擎在处理每个具体问题时的方案是相当重要的。而每种方案又各有利弊,即使不做引擎开发工作而是在某一特定游戏引擎上做游戏开发,从中也可以理解引擎的局限性以及可能的改进方法。尤其是第14章介绍的对游戏性相关系统的设计,各个开发人员几乎都是凭经验设计,很少见有书籍对这些做总结。对于基于渲染引擎做开发的游戏程序员,这是必须面对的工作,这一章会有很大的借鉴意义。
本书作者是业内资深的游戏引擎开发人,他所参于的《》和《》都是我的个人最爱。在玩游戏的过程中,作为游戏程序员的天性,自然会不断地猜想各个技术点是如何实现的,背后需要怎样的工具支持。能在书中一一得到印证是件特别开心的事情。作者反复强调代码实践的重要性,在书中遍布着C++代码。我不认为这些代码有直接取来使用的价值,但它们极大地帮助了读者理解书中的技术点。书中列出的工作室用lisp方言作为游戏配置脚本的范例也给我很大的启发,有了这些具体的代码示例以及作者本身的一线工程师背景,也让我确信书中那些关于主机游戏开发相关等,我所没有接触过的内容都也绝非泛泛而谈。
国内的游戏开发社区的壮大,主要是随最近十年的风潮而生。而就在大型网络游戏在中国有些畸形发展,让这类游戏偏离电子游戏游戏性的趋势时,我们有幸迎来了为移动设备开发游戏的大潮。游戏开发的重心重新回到游戏性本身。我们更需要去借鉴单机游戏是如何为玩家带来更纯粹的游戏体验,我相信书中记录的各种技术点会变的更有帮助。
在我认识的许多游戏业开发同仁中,只有少数香港同胞,Milo Yip(叶劲峰)却正是这样一位给我印象非常深刻的优秀香港游戏开发者。我俩认识,是在Milo加入腾讯互动娱乐研发部引擎技术中心后,说来到现在也只是两年多时间。其间,他为人的谦逊务实,对待技术问题的严谨求真态度,对算法设计和性能优化的娴熟技术,都为人所称道。Milo一丝不苟的工作风格,甚至表现在对待技术文档排版这类事情上(Milo常执著地用LaTeX将技术文档排到完美),我想这一定是他在香港读大学、硕士及在的多媒体创新中心从事研究员,一贯沿袭至今的好作风。
我很高兴腾讯游戏有实力吸引到这样优秀的技术专家;即使在其已从上海迁回香港家中,依然选择到深圳腾讯互动娱乐总部工作。叶兄从此工作日每天早晚过关,来往香港和深圳两地,虽有舟车劳顿,但是兼顾了对家庭的照顾和在游戏引擎方面的专业研究,希望这样的状况是令他满意的。
认识叶兄当时,我便知道他在进行Jason Gregory所著《游戏引擎架构》一书的中译工作。因为自己从前也有业余翻译游戏开发有关书籍的经历,所以我能理解其中的辛苦和责任重大,对叶兄也更多一分钦佩。我以为,本书以及本书的中文读者最大的幸运便是,遇到叶兄这位对游戏有着如同对家对国般强烈责任感,犹如“游戏科学工作者”般的专业译者!
现在(2013年年末)无疑是游戏史上对独立游戏制作者最友好的年代。开发设备方便获得(相对过往仅由主机厂商授权才能获得专利开发设备,现在有一台智能手机和一台个人电脑就可以开发)、技术工具友好、调试过程简单方便,且互联网上有丰富的例程和开源代码参考,也有网上社区便于交流。很多爱好者能够很快地制作出可运行的游戏原型,其中一些也能发布到应用商店。
但是不全面掌握各方面知识,尤其是游戏引擎架构知识,往往只能停留在勉强修改、凑合重用别人提供的资源的应用程度上,难以做极限的性能改进,更妄谈革命式的架构创新。这样的程度是很难在成千上万的游戏中脱颖而出的。我们所认可的真正的游戏大作,必定是在某方面大幅超越用户期待的产品。为了打造这样的产品,游戏内容创作者(策划、美术等)需要“戴着镣铐跳舞”(在当前的机能下争取更多的创作自由度),而引擎架构合理的游戏可以经得起也值得进行反复优化,最终可以提供更多的,这是大作出现的技术前提。
书的作者、译者、出版社的编者,加上读者,大家是因书而结缘的有缘人。因叶兄这本《游戏引擎架构》译著而在线上线下相识的读者们,你们是不是因“了解游戏引擎架构,从而制作/优化”这样的理想而结了缘呢?
亲爱的读者,愿你的游戏有一天因谜题巧妙绝伦、趣味超凡、虚拟世界气势磅礴、视觉效果逼真精美等专业因素取得业界褒奖,并得到玩家真诚的赞美。希望届时曾读叶兄这本《游戏引擎架构》译作的你,也可以回馈社会,回馈游戏开发的学习社区,帮助新人。希望你也可以建立微信公众号、博客等,或翻译游戏开发书籍,造福外语不好的读者,所以如果你的外语(英语、日语、韩语之于游戏行业比较重要)水平仍需精进,现在也可以同步加油了!
游戏引擎架构编辑推荐
《游戏引擎架构》[2]
由游戏界传奇人物及“”团队倾情作序推荐,既是游戏工作者必读Bible,对其他IT从业者也不无裨益。
内容包括:
- 游戏开发中的大规模C++
- 游戏编程所需的数学
- 供调试、控制及性能剖析的游戏开发工具
- 引擎基础系统、渲染、碰撞、物理、角色动画、游戏世界对象模型等引擎子系统
- 多平台游戏引擎
- 多处理器环境下的游戏编程
- 工作管道及游戏资产数据库
游戏引擎架构作者简介
作者介绍:Jason Gregory在1994年开始任职专业软件工程师,自1999年3月开始在游戏产业中任职软件工程师。在圣迭哥Midway Home Entertainment公司开始游戏编程的他,为《疯狂飞行员(Freaky Flyers)》及《Crank the Weasel》开发PlayStation 2/上的动画系统。在2003年,他转到洛杉矶艺电,为《荣誉勋章:血战太平洋(Medal of Honor: Pacific Assault)》开发游戏引擎及游戏性技术,并在《荣誉勋章:空降神兵(Medal of Honor: Airborne)》中担任首席工程师。他现时是公司的通才程序员,为《神秘海域:德雷克船长的宝藏(Uncharted: Drake's Fortune)》及《神秘海域:纵横四海(Uncharted: Among Thieves)》开发引擎及游戏性软件。他也在南加州大学教授游戏技术的课程。
译者简介:叶劲峰(Milo Yip)从小自习编程,并爱好计算机图形学。上中学时兼职开发策略RPG《》,该游戏在1995年于台湾发行。其后他获取了学士、系统工程及工程管理哲学硕士。毕业后在从事游戏引擎及相关技术的研发,职至项目主任。除发表学术文章外,也曾合著《DirectX9游戏编程实务》。2008年往上海育碧担任引擎工程师开发《美食从天而降(Cloudy with a Chance of Meatballs)》///PC,2009年起于麻辣马开发《爱丽丝:疯狂回归(Alice: Madness Returns)》Xbox360/PS3/PC,2011年加入腾讯互动娱乐引擎技术中心担任专家工程师,所研发的技术已用于《斗战神》、《》、《》等项目中。
游戏引擎架构媒体评论
本书针对每一个现代游戏开发相关的重要系统和话题,给出一个完美、综合的概览,无论是计算机科学、软件工程,或是游戏主程,以及业余爱好者、游戏玩家,本书均不可或缺。
——获评CHOICE杰出学术作品
……这里有最专业的领域知识与概念讲解……有了它,你将具备对如何构建游戏引擎的深入理解……本书让人印象尤其深刻,因为该领域再也找不到另一本如此详尽的图书。
——Eric Haines
作者将数年经验及专业积累集中在这本完整、全面的著作中,内容跨越游戏引擎开发理论与实践。书中提供的游戏开发过程各方面的精彩实例,保罗万象且对读者大有补益。不仅游戏引擎开发人员看后会大受鼓舞,甚至也可作为有经验的该领域技术专家的实用参考。本书可谓无价,除内容“用户友好”外,其附录也值得强烈推荐,无论是个人开发者、专家还是计算机科学学术人员,都可将其作为资源集合与参考资料,当然游戏设计架构人员更是不可不读。
——The Midwest Book Review
本书涵盖有关如何开发游戏引擎要旨的巨量数据。
——Gamasutra, November 2009
本书曾位列“the Game Developer”杂志前沿大奖候选图书。
——PR Newswire
游戏引擎架构前言
最早的电子游戏完全由硬件构成,但微处理器(microprocessor)的高速发展完全改变了游戏的面貌。现在的游戏是在多用途的PC和专门的电子游戏主机(video game console)上玩的,凭借软件带来绝妙的游戏体验。从最初的游戏诞生至今已有半个世纪,但很多人仍然认为游戏是一个未成熟的产业。即使游戏可能是个年轻的产业,若仔细观察,也会发现它正在高速发展。 现时游戏已成为一个上百亿美元的产业,覆盖不同年龄、性别的广泛受众。
千变万化的游戏,可以分为从纸牌游戏到大型多人在线游戏(massively multiplayer online game,)等多个种类(category)和“类型(genre)”,也可以运行在任何装有()的设备上 。你现在可以在PC、手机及多种特别为游戏而设计的手持/电视游戏主机上玩游戏。家用电视游戏通常代表最尖端的游戏科技,又由于它们是周期性地推出新版本,因此有游戏机“世代”(generation)的说法。最新一代的游戏机包括微软的Xbox 360和索尼的PlayStation 3,但一定不可忽视长盛不衰的PC,以及最近非常流行的任天堂Wii。
最近,剧增的下载式休闲游戏,使这个多样化的商业变得更复杂。虽然如此,仍然是一门。今天的游戏平台非常复杂,有难以置信的运算能力,这使软件的复杂度得以进一步提升。所有这些先进的软件都需要由人创造出来,这导致团队人数增加,开发成本上涨。随着产业变得成熟,开发团队要寻求更好、更高效的方式去制作产品,可复用软件(reusable software)和中间件(middleware)便应运而生,以补偿软件复杂度的提升。
由于有这么多风格迥异的游戏及多种游戏平台,因此不可能存在单一理想的软件方案。然而,业界已经发展出一些模式 ,也有大量的潜在方案可供选择。现今的问题是如何找到一个合适的方案去迎合某个项目的需要。再进一步,开发团队必须考虑项目的方方面面,以及如何把各方面集成。对于一个崭新的游戏设计,鲜有可能找到一个完美搭配游戏设计各方面的软件包。
现时业界内的老手,入行时都是“开荒牛”。我们这代人很少是计算机科学专业出身(Matt的专业是、Jason的专业是系统设计工程),但现时很多学院已设有游戏开发的课程和学位。时至今日,为了获取有用的游戏开发信息,学生和开发者必须找到好的途径。对于高端的图形技术,从研究到实践都有大量高质量的信息。可是,这些信息经常不能直接应用到游戏的生产环境,或者没有一个生产级质量的实现。对于图形以外的游戏开发技术,市面上有一些所谓的入门书籍,没提及参考文献就描述很多内容细节,像自己发明的一样。这种做法根本没有用处,甚至经常带有不准确的内容。另一方面,市场上有一些高端的专门领域书籍,例如物理、碰撞、人工智能等。可是,这类书或者啰嗦到让你难以忍受,或者高深到让部分读者无法理解,又或者内容过于零散而难于融会贯通。有一些甚至会直接和某项技术挂钩,软硬件一旦改动,其内容就会迅速过时。
此外,互联网也是收集相关知识的绝佳工具。可是,除非你确实知道要找些什么,否则断链、不准确的资料、质量差的内容也会成为。
好在,我们有Jason Gregory,他是一位拥有在(Naughty Dog)工作经验的业界老手,而顽皮狗是全球高度瞩目的游戏工作室之一。Jason在南加州大学教授游戏编程课程时,找不到概括游戏架构的教科书。值得庆幸的是,他承担了这个任务,填补了这个空白。
Jason把应用到实际发行游戏的生产级别知识,以及整个游戏开发的大局编集于本书。他凭经验,不仅融汇了游戏开发的概念和技巧,还用实际的代码示例及实现例子去说明怎样贯通知识来制作游戏。本书的引用及参考文献可以让读者更深入探索游戏开发过程的各方面。虽然例子经常是基于某些技术的,但是概念和技巧是用来实际创作游戏的,它们可以超越个别引擎或API的束缚。
本书是一本我们入行做游戏时想要的书。我们认为本书能让入门者增长知识,也能为有经验者开拓更大的视野。
Jeff Lander
Matthew Whiting
.豆瓣读书[引用日期]
Jason Gregory.游戏引擎架构:电子工业出版社,2014年1月

我要回帖

更多关于 光照模型 的文章

 

随机推荐