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


发新话题
打印

[老游杂谈] 遗老们又开始跳了,贴一点PS上SS永远无法实现的画面效果

土星和半透明这事吧,其实得这么讲
1:基于有限的图层合成模式,从根子上就和半透明相冲。因为半透明不满足结合律。
也就是:(A 透 B 透 C) 不等于( A 透 (B 透 C))
举个例子,三个元素,ABC,B叠在A上C叠在B上
那么按照半透明公式(相加除2),应该显示出的颜色是((A+B)/2+C)/2 = A/4+B/4+C/2
那么如果现在A是背景层,BC都是活动块层,如果先把BC和混合成(B+C)/2,再混合A,那结果就成了(A/2+(B+C)/2)/2 = A/2+B/4+C/4,显然错了。
所以说,vdp1输出内容包含的要不就是要与背景层半透明的sprite,要不就是sprite之间正确半透明但和背景不透明的sprite,尽管也是个问题,但这并不是本质的问题。根子在这种有限的多层合成上。国外那些用vdp1输出不透明framebuffer到vdp2的方法,一样不能避免这个问题。
如果能够把图层合成后的结果loop-back回vdp1的framebuffer,让vdp1再次在上面绘制,那倒是可以解决这个问题,但明显这与土星的设计初衷就是相悖的。
或者干脆不用vdp2,直接只用vdp1来绘制所有,这倒也是可以避免上面的问题,但是又有下面的问题
2:vdp1不能对变形sprite使用半透明,也就不单是非矩形sprite或polygon,连使用旋转的矩形sprite或polygon也不行,因此比如洛克人的那个探照灯,靠vdp1想实现半透明也有问题。
3:vpd1的半透明,基本来说只有(A+B)/2一种,不像vdp2的图层叠加可以设置ratio也不像PS那样有(A+B),(A-B)等混合模式。所以想实现类似淡入淡出,用vpd1也有问题。
所以总的来说,SS在半透明效果的设计上,纯粹是先天硬伤。说它不支持吧,也有点冤,但要说支持吧,实在是很落后,聊胜于无。


TOP

引用:
原帖由 KainX 于 2024-12-3 16:43 发表

1没什么可说的,2和3并非如此。
VDP1可以将任意变形的活动块/多边形半透明,前面有人提过《索尼克R》最后一关整条赛道都是半透明多边形构建的。
虽说VDP1的半透明就只能将图元整体透明50%,但要做出渐变色半透明 ...
准确说是变形sprite或多边形的半透明结果无法保证正确。因为它的四边形填充方式,有些点可能会重复绘制。
淡入淡出要的是前景和背景的比例动态从0变到1,这是vdp2的正经功能,vdp1半透明的问题在于frame buffer的权重无法高于0.5,使用高洛德也只能改变前景sprite的部分。

[ 本帖最后由 hourousha 于 2024-12-3 17:49 编辑 ]



TOP

引用:
原帖由 KainX 于 2024-12-3 18:41 发表

重复绘制有办法避免,可以通过软件光栅化以图案为结果转储图元、或者VDP1在帧缓存空闲区中光栅化并以图案为结果转储图元,
当年有少数官方游戏就是这么做的,现在也有土星同人游戏开发者采用。

如果你说的淡入 ...
我相信有这么做的,但这个做法依然只是个凑合的、特定情况方案,原因如下
从framebuffer往VRAM中复制数据,并非无代价的,所以在一帧中无法使用很多次。换句话说,依然需要把变形精灵/多边形打包绘制后再进行转换图元的操作。因此,依然会触及我之前帖子里说的第一个问题。
还用洛克人的探照灯举例:背景色A探照灯色B,那么探照灯扫的区域颜色是(A+B)/2,但假如有两束探照灯,在某一时刻,两个光束产生了交集,则交集处的颜色是((A+B)/2+B)/2 = 0.25*A+0.75*B,试问这种情况如何用你说的办法解决?
唯一的办法就是,先只画探照灯1,然后把framebuffer存成图元1,再只画探照灯2,存成图元2,最后再用vdp1依次画两个半透明正常精灵。想一次画两个探照灯存成一个图元,然后再用一个半透明精灵绘制,那是没戏的。也就是说,需要生成图元进行framebuffer->vram的次数,取决于overdraw数。
再加上该方法本身就需要明显更多的填充率,因此我实在不认为该方法是一个通用解决方案。
跑个题,这让我想起04年左右吧,那会NV出了翻身的NV40系列,而ATI出了吃老本的R400系列。NV40有一个R400没有特性,就是FP16 RenderTarget的AlphaBlending,当时认为FP16是HDR渲染的必要功能,因此两边粉丝就为这事来回扯皮。最后是HalfLife2实现了个INT16下的HDR渲染,终于让A粉丝长出口气说‘A卡也不是不能实现HDR’但谁心里都清楚那代A卡在HDR支持上就是远不如N卡,而且再嘴硬的A粉丝也不至于说:‘A卡也支持FP16的AlphaBlending,因为可以把RenderTarget当成纹理用PixelShader算啊’这种理论上并非不行,但明显没有多少实际意义的话。


TOP

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