游戏开发论坛

 找回密码
 立即注册
搜索
楼主: xheartblue

快速8-bit通道的伪HDR

[复制链接]

1

主题

11

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2005-2-21 22:51:00 | 显示全部楼层

Re:快速8-bit通道的伪HDR

还有是如何把亮度转换成最终的RGB颜色的,没看懂,能解释一下吗?谢谢

17

主题

454

帖子

470

积分

中级会员

Rank: 3Rank: 3

积分
470
 楼主| 发表于 2005-2-22 17:34:00 | 显示全部楼层

Re:快速8-bit通道的伪HDR

不至于啊.我在ShaderDesigner里做的,速度一直都是那个数啊.56-60的样子,因为我的显示器只能刷到那个速度.

1

主题

11

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2005-2-23 22:39:00 | 显示全部楼层

Re:快速8-bit通道的伪HDR

你帖的代码有些问题,不知道是不是笔误,还是我没有搞懂。如:const float blurfactor = 12.5;//blur度,就是把多远处的像素取过来。这里如果blurfactor 取12.5的话,会出现虚边,我只取了四周的四个象素,即float delp = blurfactor* cdelp;就等于float delp =  cdelp;

6

主题

444

帖子

457

积分

中级会员

Rank: 3Rank: 3

积分
457
发表于 2005-2-24 01:17:00 | 显示全部楼层

Re:快速8-bit通道的伪HDR

那个不是他的笔误,因为这个本身就是近似效果,不过就像我最开始的那个帖子提到的,如果场景不是非低频场景,那么这种近似法必然会产生赝像(就是你说的虚边)不过这种方法的特点是代价低廉,想要效果好的话,那就用多pass实现吧:如果想要比较高程度的blur效果则先down sample一下原场景,然后再使用一些blur filter就行了(可以参考shaderX2上的《实时景深效果》文章,那里提供了2种常用blur filter)
至于速度慢,那么首要问题是代码:
color += texture2D(texture,vec2(gl_TexCoord[0].s+delp,gl_TexCoord[0].t-delp))*5.0 /22.0;
每一条都使用了dependent texture read,这是比较消耗硬件资源的,而楼主的代码明显是用到了GPU的FP寄存器和FP ALU,这对于NV3x是很不利的。我建议的优化是这样(由于我对OpenGL的Vertex/Fragment不熟,所以用D3D代替,和楼主的原理完全一样)
首先,制作一张曝光查表纹理,这里要用到一个简单技巧,由于曝光系数会大于1,为了保证精度,我们将其编码到纹理的rgba 4个通道,r保存sat(exposure);g保存sat(exposure - 1);b保存sat(exposure - 2);a保存sat(exposure - 3);这样,exposure = r+g+b+a,范围是[0,4],可以足够保证expfactor = 1.92时不出现消顶失真,这样我们以u为e, v为expfactor/2.0,依照公式exposure = exp(expfactor) -  exp(expfactor-e)制作该纹理,将其设置到texture[5]
在vs中计算纹理坐标,因为纹理坐标只不过是平移,所以在vs中计算的效果不会比ps中计算的效果差,设为t0-t4
ps代码如下:
ps_1_4
def c0,0.30,0.59,0.11,1.0
def c1,0.2273,0.0909,0.8,0.4      //5.0/22.0,2.0/22.0,sharpness,expfactor/2.0
texld r0, t0
texld r1, t1
texld r2, t2
texld r3, t3
texld r4, t4
mul r5, r0, c1.y
mad r5, r1, c1.x,r5
mad r5, r2, c1.x,r5
mad r5, r3, c1.x,r5
mad r5, r4, c1.x,r5   //blur map
dp3 r1, r5, c0          //blur map luminance
lrp r0, c1.z, r0, r5     //blur the source image
mov r1.y,c1.w         //move expfactor
phase
texld r5, r1             //get exposure map
add r2, r5.x, r5.w    //r+a
mul r3.xyz, r0, r2     
add r2, r5.y, r5.z     //b+g
mad_sat r0.xyz, r0, r2, r3
+mov r0.w, c0.w
说明一下,由于nv3x在ps1.4中临时寄存器范围是[-2,2]所以不能采用r+g+b+a,这样会消顶失真,所以采用r+a,b+g两步计算。

17

主题

454

帖子

470

积分

中级会员

Rank: 3Rank: 3

积分
470
 楼主| 发表于 2005-2-24 02:30:00 | 显示全部楼层

Re:快速8-bit通道的伪HDR

晕啊.ASM的代码.我是写的出来,看不懂,自己写的ASM Shader代码,过一阵都能看不懂...
哥哥.你能不能用Cg写,写完了再编译成VP和FP啊.

同意楼上的,不是笔误,是本来就是这样近似的。我写这个shader的原因就是不想做多PASS.能快就快.而效果是,只要有那么点意思就可以了
如果一个游戏里堆了很多这样的效果,速度肯定是首先要考虑的问题.能近似就近似吧

15

主题

1268

帖子

1268

积分

金牌会员

Rank: 6Rank: 6

积分
1268
发表于 2005-2-24 07:41:00 | 显示全部楼层

Re:快速8-bit通道的伪HDR

统一搂主的观点,游戏主要在于好玩,特效有个把点缀就可以了

6

主题

444

帖子

457

积分

中级会员

Rank: 3Rank: 3

积分
457
发表于 2005-2-24 07:44:00 | 显示全部楼层

Re:快速8-bit通道的伪HDR

不用Cg,还是用D3D中的事物来说明吧,对于ps1.x的代码,我一般是不采用HLSL的,因为作为ps1.x,指令数是很少的,所以只要加上注释一般看懂是没问题的,而且fxc的编译器对ps的优化并不是那么理想,而ps1.x限制颇多,所以代码经常要用到co-issue等手段来削减指令数量,还要经常手动进行一些代码微调,所以我认为编写asm的ps1.x code反而比用HLSL要方便。呵呵

17

主题

454

帖子

470

积分

中级会员

Rank: 3Rank: 3

积分
470
 楼主| 发表于 2005-2-24 09:55:00 | 显示全部楼层

Re:快速8-bit通道的伪HDR

优化是优化, 说明原理和实际应用是很大区别。你完全可以用HLSL写个Shader,回头在项目里偷偷的换成ASM

6

主题

444

帖子

457

积分

中级会员

Rank: 3Rank: 3

积分
457
发表于 2005-2-24 10:27:00 | 显示全部楼层

Re:快速8-bit通道的伪HDR

其实也不完全是优化的问题,有时的情况是如果用fxc将HLSL编译为ps1.x则根本无法编译成功(超出ps1.x的指令数等限制),省掉1-2个ins-slot在ps1.x中不仅仅意味着更快速,会直接关系到是否能生成合法的ps1.x code。呵呵……
只有在shader model强大自由到一定程度(指令集,允许指令槽数达到一定程度,比如vertex shader,pixel shader 2)编译器才能真正发挥作用。这也是我在ps1.x中使用asm的主要原因。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-24 11:07

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表