» 您尚未登录:请 登录 | 注册 | 标签 | 帮助 | 小黑屋 |


 58 1234
发新话题
打印

[其他] 推荐一篇近期难得的实用技术文

TG业界区液内高玩众多,个人不敢私藏

但未经作者允许,所以就直接贴链接了:

http://bbs.a9vg.com/thread-3549729-1-1.html

简单易懂,态度客观中立,更新速度也很良心。和作者聊了下,作者更希望各位去阿9聊,所以有兴趣的,可以去PM他~


转一部分自己比较喜欢的章节


第七天 深度缓冲(Depth buffer或者Z-buffer)、帧缓冲(Framebuffer)以及像素填充率(Fillrate)


大家是不是很好奇?为什么顽皮狗在神秘海域1中搞不定手雷烟雾的半透明效果?

为了解答这个问题,我们必须引出一个概念,叫做深度缓冲(Depth buffer或者Z-buffer)。

首先,这个深度缓冲是啥呢?

我们在屏幕上看到的一个一个像素,它们除了有颜色的RGB值以外,还有一个深度值(Depth Value)。

这个深度值是什么呢?大家想想看,3D游戏的物体都是有三维坐标的,对不对?那投射到屏幕上肯定也是一个三维坐标,对不对?比如说,树木在前面,就会挡住人物。

这里我们暂时不讨论3D电视。因此,我们的屏幕都是二维的,要想存储一个像素所有的信息,就必须要有额外的信息,那就是深度值。

而所谓的深度缓冲,就是帧缓冲(Framebuffer)中的所有像素的深度值。

那什么又是帧缓冲呢?我先从最简单的情况入手吧。

在高清游戏主机中,帧缓冲的内容,就是你在屏幕上看到的所有像素的颜色值和半透明值(Alpha value)。

对于大多数的情况,像上面这样理解就可以了,完全没有问题。

不过,在比较传统的主机中,帧缓冲和屏幕上的像素还是有点区别的。因为主机的帧缓冲会比屏幕范围稍微大一点。实际显示的区域,要比显存中的帧缓冲要小一点。

对了,帧缓冲和深度缓冲都是在显存里面的。这是一个重要的事实。

世嘉青:那楼主我太感谢你了啦!你在分析土星机能的时候,居然没有把Framebuffer算进去耶!这样就能存更多的四边形了啦!

可不是我偏袒SS啊,因为SS有专门的两块存储器(2 X 256KB)来放帧缓冲,所以那块512KB的显存就可以专门用来放3D数据了。

细心的玩家肯定发现了:居然有两个framebuffer!

通常情况下,会有两到三个的。以后我们讲到垂直同步的时候,再详细聊一聊吧。

好,现在大家来复习一下:帧缓冲(Framebuffer)里面有什么?深度缓冲(Depth buffer或者Z-buffer)里面有什么?


现在要进入正题了。这个深度缓冲到底有什么用呢?

大家想象一下,我们先画了一个人物。如果一棵树也在同一个像素位置有像素,那么GPU就会比较两者的深度值。如果这个像素在人物后面,就不用画树的像素了;如果在人物的前面,在帧缓冲里面,这个新像素的颜色值就会替代人物像素的颜色值,深度值也会更新。

比较近的物体遮挡比较远的物体。这个显卡处理的硬件优化过程叫作Z消隐(Z-culling)。

以后,等我讲到排序(Sorting)的时候,就会讲到一个重要的事实。大家暂时先记住:
Z消隐(Z-culling)这个优化,只能应用在没有半透明的场景里。

如果所有物体都没有半透明效果的话,那么可以保证屏幕上的像素基本没有任何重画。屏幕上有多少像素,显卡就需要画多少像素。

如果物体有半透明的效果,那么显卡的工作就会繁重很多了。这个物体在屏幕上占据多少像素,这个区域所有的像素都需要重新计算一遍。

神秘海域1里面的手雷烟雾,经常是会占据一大半屏幕的。假如有半透明效果的话,屏幕上的像素就都需要处理两三遍。这就击中了PS3的显卡RSX的一个很大的软肋,像素填充率(Fillrate)太低。

所谓像素填充率,就是显卡画像素的速度。

严谨的说,并没有一个统一的标准来衡量它。究竟是画一块单色的像素的速度呢?还是画一块有纹理有光照的像素呢?它们之间的区别很大。

但是经过实践,业界是有共识的。RSX处理有纹理有半透明效果的像素,速度确实不理想。

因为,即便是顽皮狗,也只好让烟雾没有半透明效果。这样子,RSX就可以做Z 消隐了。

PS Vita的显卡,虽然运算速度不如RSX,但是,它却没有像素填充率的软肋!所以,包括我在内的很多游戏开发者,都松了一口气。

那么,在神秘海域2中,这个问题是怎么得到解决的呢?这就是CELL处理器的威力了,等我们以后解析PS3的时候,再说吧。


明天我们应该会开始光照的入门话题,大家明天见!


TOP

嗯,昨天在A9也看到了



TOP

第六节的内容一直提示非法内容所以无法转载。。。

最后的小妞爱好者可以关注一下六七节


TOP

32位色里多的那8bit?原来是做这个的啊

TOP

posted by wap, platform: GALAXY S III

基本看不懂…

TOP

这个一直在追,对我等小白来说是不错的科普材料,今天貌似没更新

TOP

看作者写了一堆SS,PS什么的,基本可以肯定作者既没看过(或看懂)PS的SDK也没看过(懂)SS的SDK。还alpha混合与深度缓存呢……

TOP

posted by wap, platform: Android

mark

TOP

posted by wap, platform: GALAXY S III
引用:
原帖由 @hourousha  于 2013-8-13 23:03 发表
看作者写了一堆SS,PS什么的,基本可以肯定作者既没看过(或看懂)PS的SDK也没看过(懂)SS的SDK。还alpha混合与深度缓存呢……
那劳驾,你来这点更专业的

TOP

第一次看到神海1里面的烟雾效果确实惊呆了:D

TOP

想象了一下,没插显卡的电脑玩CS丢烟雾蛋,是不是类似的效果?那一块块乌漆嘛黑的东西飘在屏幕上...

TOP

挺不错的

TOP

引用:
原帖由 guken 于 2013-8-14 00:52 发表
posted by wap, platform: GALAXY S III
那劳驾,你来这点更专业的
他讲的这种3D流水线结构,只适应于N64和之后的Console。并不适应之前的。
比如PS和SS都没有Z-buffer,自然也没有Z-test,自然贴图也没有透视矫正。
关于Alpha-Blending,无论PS还是SS,都没有所谓的Alpha混合,而是半加,半减之类的方式,所以当初这个功能叫做半透明,是有道理的。说确切的话,它们根本没有alpha通道这个概念,而是用color key来表示纹理透明/不透明。SS最高支持到24bit,而PS支持到16bit(1555格式)。
此外,它关于UV,Index,Vertex等等的描述,也不符合PS/SS的形式,它们不使用浮点数,顶点基本是以UInt16这种16bit定点数来表示。另外SS没有UV的概念,它都是sprite,至于Vertex Index,PS/SS硬件和API本身是没这个概念的。
直接总结的话
SS本质就是一台2D机器:3D顶点变换靠CPU硬算,fragment部分就是一纯2D硬件。半透明受限是源于SS对变形sprite的绘制方式不支持半透明。
PS本质是一台增强了部分3D性能的2.xD机器:它有一个矢量运算加速器GTE,因此顶点变换等操作要快速得多。但它的fragment部分,依然只能算一个2D绘制硬件,比SS强的部分是2D贴图功能的增强,至少支持了UV mapping这种形式而不只是SS那种sprite形式。也正因为如此,它的半透明功能限制较少。

[ 本帖最后由 hourousha 于 2013-8-14 14:03 编辑 ]
本帖最近评分记录
  • shaderdog 激骚 +1 最骚 Rated by wap 2013-8-14 20:06
  • guken 激骚 +2 感谢分享 2013-8-14 18:35
  • catman 激骚 +4 感谢分享 2013-8-14 16:48
  • shinkamui 激骚 +5 我很赞同 2013-8-14 14:20

TOP

这个作者语气让人不爽,动不动就是对不对,对不对?娘炮

TOP

和每句话后都要加
是不是这个道理?
不是差不多。

TOP

 58 1234
发新话题
     
官方公众号及微博