崩溃中,终于翻译完了,不管到底翻译得如何。
很久没有这样熬通宵来翻译文章的了,天天被外包折腾,夜里唯有的时间只能用来做自己想做的东西。我应该是属于昼伏夜出动物,这样才能满足自己的喜好和习性吧?
由于机缘的巧合,去年开始,自从在工作中被迫接触到这个技术之后,就不断被Unreal的Deferred Shading所郁闷,灌输和洗脑。事实上,一开始的不熟悉导致我很多的误解,但是,当确实体验到他的强大的时候,我开始不能自拔,痴迷于各种各样的资料——褒的,贬的,中性的。
痴迷并不意味着迷信,事实上,我认为,Unreal无论外面的评价有多好,但他在DS上的实现并不“正统”。以至于我们对一些亟待解决的问题进行处理的时候,显得畏首畏尾,无可奈何,直到最近,才敢于去探索和处理一些必须的东西。不过这也可能是我们的项目类型和中国的大环境所限制的,因为,无论如何,你不得不承认,《战争机器2》是个好游戏——起码看起来是。而基于同一套技术,只是在具体实作方面走向了不同方向的游戏名单,则可能还包括《杀戮地带2》,《星际争霸2》,《Crysis》……只不过,因为引擎其它部分极低效率的影响,无法发挥Deferred Shading的高光源,高面数优势,因此让我们觉得麻烦而已。
对于任何新技术,都有一个从旧到新转化时,所需付出代价的问题,那么,写一个基于Deferred Shading的引擎到底有多难?我觉得不难:从今年的一月份开始铺量,直到现在大约出了效果,也就是两个月的时间——或者说两个月的晚上4小时——请注意这中间并不是在使用原来的那套工具集,而是同时重头开始编写的Gamer Class,而绝大多数时间,其实并不是浪费到了Deferred Shading本身,而是浪费到了这套渲染系统上。
诚然,现在Gamer Class的Deferred Shading还很弱小,弱小到了只能在DEMO里通过硬硬的编码来完成,而无法做到如Unreal,星际,Crysis那样的广度和深度,但从学习这个技术过程中吸取的给养,很可能已经超过了我此前所学的各种技术的总和。
曾经有人把Deferred Shading夸得很强大,也曾经有人把Deferred Shading贬得一文不值,不过可能维持正统思想的程序员还是多数——“没有什么技术是正确的,也没有什么技术是错误的”。技术本无对错之分,就要看技术用在了谁的手里,用在了什么样的目的上。目的是第一位的,一切均服务于目的,目的高于一切,强于一切。Deferred Shading既不强大,也不弱小,它类如其他任何技术一样,只是在享受好处的时候需要刻意去避免麻烦,仅此而已。还是那句话:标榜解决了一切的技术一般都什么没解决,而标榜没有问题的方案只是没遇到问题。真正优秀的技术,永远是能先于别人发现自己的问题。
我对Deferred Shading推崇的一个原因是:Deferred Shading的大体思路,其实就是我们不厌其烦所听说的封装。作为一个程序员,可能我们都需要经历这样的时刻——当你有一段代码,它在90%的地方都有所出现,只是外部形式稍有不同时,你应该把它做成一个函数。
Deferred Shading,就是这样一个函数,而这重复率如此之高的代码段,正好是传统图形光照系统那千篇一律的光照代码。所谓的材质,就是用于描述物体的外在表征的方式,材质本身是没有意义的,光和材质的配合才会有意义。而我们如果回想一下就不难发现:基于传统光照模型的图形技术,无论其他方面有什么样的差别,在一个地方上都是一致的——那就是光照模型的代码:Diffuse是N乘L,Specular是半角H,Emissive是直接狂加,不过如此而已。如果将这个过程中所需的所有用于描述表面的数据,全部缓存到若干张纹理上,而在之后的光照过程中统一计算,那么,至少将享有如下的好处:
首先,硬件Occlusion可以裁切掉那些不需要渲染的光源。而不像传统管道那样,只是影响到了,但其实并不显示的光源也有可能被提交到渲染管道。
其次,最终的效率与场景的复杂度无关。准备材质数据的过程(Base Pass)非常简化,因此这个过程的计算量是很小的。打光的时候,你所面对的无非只是几张纹理,所做的所有工作几乎都是线性的。
第三,强制的基于像素的光照系统,这个可能既是个好处,也是个坏处。好处是品质确实很高,坏处是对于国内这种基于低品质来做游戏的思路,这种方式并不讨好,反倒是有种牛刀杀鸡的感觉。Deferred Shading的优势是多面多光源,而且是动态光源,这在现有的项目中几乎是不可想象的,所要冒的风险不比最后的结果差多少。韩国人之所以敢做,是因为韩国网吧和个人普遍的配置都比较高,中国嘛……正如你我都知道的那样。
假设说你已经准备支持了逐像素光照系统,那么在这样的诱惑面前,你有什么理由放弃Deferred Shading呢?
总结来说,Deferred Shading,就是用最小的代价,换取逐像素光照的品质——但是,诚然,没有任何午餐是免费的,您也将为此付出代价……
同时,如果您的项目是准备基于逐顶点、少面数、低动态光源的品质的话,那么,Deferred Shading是绝对的不适合。
题外话,毕竟网游总是和图形说拜拜的,这一点,你没法要求太高……
分享到:
相关推荐
翻译《Deferred Shading》(2004年Shawn Hargreaves的经典文章)
延迟着色(Deferred Shading)是一种在3D图形渲染领域广泛应用的技术,特别是在现代游戏和高级图形应用程序中。这种技术由Shawn Hargreaves等人提出并广泛推广,它改变了传统即时着色(Forward Shading)的方式,...
在计算机图形学领域,延迟渲染(Deferred Shading)是一种先进的渲染技术,主要用于实现复杂的光照效果和提高图像质量。它与传统的前向渲染(Forward Rendering)有所不同,前向渲染是在每个像素上直接计算光照,而...
延迟光照(Deferred Shading)是一种在3D图形渲染中广泛使用的高级光照技术,它与传统的立即模式光照(Forward Shading)方法有所不同。延迟光照的主要目标是优化处理大量光源时的性能,尤其在复杂的场景中,当物体...
Exercise 9:Deferred Shading的实现 要求: 1.在练习8的基础上,实现Deferred Shading算法; 考察目的: 1.阅读文献,理解并实现文献中算法; 2.通过FrameBufferObject实现render-to-texture技术; 3.实现multiple-...
在这个“OpenGL+Deferred Shading实现放大镜”的项目中,我们将深入探讨如何利用OpenGL的延迟着色技术来构建一个具有放大镜效果的应用。 延迟着色(Deferred Shading)是一种先进的图形渲染技术,它改变了传统即时...
Deferred Shading是一种先进的光照技术,用于解决实时渲染中的性能问题。传统的前向渲染(Forward Shading)方法为每个像素执行一次光照计算,当场景复杂度增加时,计算量会急剧增加。而延迟着色则将几何信息、颜色...
总结起来,"SSAO+HDR+deferred shading DX9"是一个利用DirectX 9实现的高效图形渲染方案,它整合了屏幕空间环境光遮蔽、高动态范围图像和延迟着色技术,以提供高质量的视觉体验,即使在性能较弱的显卡上也能运行。...
延迟着色(Deferred Shading)是一种渲染技术,它将光照计算与场景几何体的绘制过程分离,从而提高了渲染效率,尤其是在处理大量光源时更为显著。该技术基于DirectX 10,能够有效地渲染复杂的场景。 在传统的渲染...
在计算机图形学领域中,延迟着色(Deferred Shading)是一种常用于渲染复杂场景的技术。它通过将渲染过程分为两个阶段来进行:首先是几何阶段,其次是光照阶段。这种技术可以有效处理大量光源和复杂材质的场景,相比...
### URP-DeferredShading方案(高清版) #### URP中的延迟着色技术选型 在探讨URP(Universal Render Pipeline)中的延迟着色技术之前,我们先来了解一下URP的基本概念及其背景。 ##### 一、Universal Render ...
MLAA Deferred Shading MeshFromOBJ MLAA Deferred Shading MeshFromOBJ MLAA Deferred Shading MeshFromOBJ
Deferred Shading是一种高效的渲染技术, UE4中使用Deferred Shading来实现高效的渲染。Deferred Shading的原理是将场景中的几何体和材质信息存储在G-Buffer中,然后在屏幕空间中进行光照计算。 知识点8:Renderdoc...
在计算机图形学的世界里,延迟着色(Deferred Shading)是一种高级的渲染技术,它通过改变传统的渲染流水线来提高性能和灵活性。"cute-deferred-shading"项目提供了一个小巧且友好的延迟着色实现,主要使用了C++、...
6. **工厂模式**:jQuery.Deferred实现了一个工厂模式,每次调用$.Deferred()都会产生一个新的Deferred实例。 #### 四、实际应用示例 ```javascript function runAsync(){ var def = $.Deferred(); setTimeout...
首先,Deferred对象与“延迟”一词的关系并不紧密,因此将其翻译成“异步队列”更为恰当。Deferred对象可以看作是一个管理异步操作的控制中心,它允许开发者将多个回调函数注册到某个异步操作上,这些回调函数将在...
Deferred Shading 和 Forward+ 渲染技术的实现。 使成为 前向:使用标准前向渲染进行渲染。 我们使用纹理缓冲区对象将灯光信息发送到着色器。 Forward(blend):前向渲染的先前实现。 我们以 100 盏灯的间隔渲染场景...
延迟着色(Deferred Shading)是一种在3D图形渲染中广泛应用的技术,特别是在现代OpenGL实现中。它与传统的即时渲染(Forward Rendering)管线不同,后者直接对每个物体进行光照计算,而延迟着色则是先将场景的几何...
- **延迟渲染(Deferred Shading)**:通过将光照计算推迟到后期进行,显著提高渲染效率。 ##### 3.6 几何与细分着色器 - **几何着色器(Geometry Shader)**:动态修改几何形状,例如增加或减少顶点数量。 - **...
延迟渲染(Deferred Shading)是一种在3D图形处理中用于提高效率的技术,它与传统的立即模式渲染(Forward Rendering)有着显著的区别。立即模式渲染会在每个像素上执行所有的光照计算,对于复杂的场景,尤其是光照...