游戏开发论坛

 找回密码
 立即注册
搜索
查看: 7713|回复: 21

请问在shader里如何获取当前点的深度值?

[复制链接]

227

主题

1793

帖子

1866

积分

金牌会员

Rank: 6Rank: 6

积分
1866
发表于 2008-12-4 12:47:00 | 显示全部楼层 |阅读模式
shadow map是用当前点的深度值和深度纹理作比较吧?
我现在用Z值代替
但是我的X550使用16位浮点纹理的速度……惨不忍睹
所以我只能用普通纹理
结果当然是惨不忍睹……
请问在shader里到底怎么获取当前点的深度值?

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2008-12-4 15:04:00 | 显示全部楼层

Re:请问在shader里如何获取当前点的深度值?

不会吧,我5200上32位浮点纹理都很快

估计你的GL走了软件模拟模式了,GL的特有问题,也许是shader太长了,或者纹理指令多了,或者哪个东西硬件不能直接支持了,就纯软了……

227

主题

1793

帖子

1866

积分

金牌会员

Rank: 6Rank: 6

积分
1866
 楼主| 发表于 2008-12-4 17:20:00 | 显示全部楼层

Re:请问在shader里如何获取当前点的深度值?

所有加一起还不到100行
另外
5200支持32位浮点纹理吗?
5200没有shader mode3.0吧?
有32位浮点纹理就应该能做hdr吧?

主要问题不在这里
问题在于我的方法根本上就有问题
我看别人都是用深度纹理
没有用Z纹理的

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2008-12-4 19:33:00 | 显示全部楼层

Re:请问在shader里如何获取当前点的深度值?

支持啊
用D3DFMT_32F,不是R32G32B32A32,所以不能HDR
深度和Z概念上区别不大

227

主题

1793

帖子

1866

积分

金牌会员

Rank: 6Rank: 6

积分
1866
 楼主| 发表于 2008-12-4 21:58:00 | 显示全部楼层

Re:请问在shader里如何获取当前点的深度值?

问题是深度贴图可以16位以上
Z值我就只能用RGB8
那精度我就不用多说了吧orz

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2008-12-4 23:20:00 | 显示全部楼层

Re:请问在shader里如何获取当前点的深度值?

……
GL最近两年没用,不是很清楚,不过应该也能用32位浮点纹理做render target吧

直接用depth纹理应该不行,但用shader把Z值写进浮点纹理还是可以的

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2008-12-4 23:46:00 | 显示全部楼层

Re:请问在shader里如何获取当前点的深度值?

老显卡就算支持浮点纹理,通常也很慢
可以把深度值编码到普通的rgb32纹理里,

•When we use integer textures, we need to pack the squared distance value and write it into the color channel. How can we pack a floating-point number into an integer texture? Here are two ways:
1.
Out.r = SquaredDistance * 2^0
Out.g = SquaredDistance * 2^8
Out.b = SquaredDistance * 2^16
Out.a = SquaredDistance * 2^24
float4 vPack = {1.0f, 256.0f, 65536.0, 16777216.0f};
return vPack * dot(vLight, vLight);

2.
Out.r = floor(fDepth) / 256.0;
Out.g = frac(fDepth);
float fDepth = dot(vLight, vLight);
return float(floor(fDepth) / 256.0, frac(fDepth),frac(fDepth), frac(fDepth));
By writing frac(fDepth) into the green and alpha channels, we save this pixel shader instruction (otherwise, we need an additional instruction to fill these channels):
mov r2.gba, r0.g  // r0.g contains frac(fDepth)

Method 1 is computationally cheaper, but the second one gives you higher precision

详细方法可以看http://http.developer.nvidia.com/GPUGems/gpugems_ch12.html的12.3.3和12.3.6

227

主题

1793

帖子

1866

积分

金牌会员

Rank: 6Rank: 6

积分
1866
 楼主| 发表于 2008-12-5 08:29:00 | 显示全部楼层

Re:请问在shader里如何获取当前点的深度值?

感谢楼上
不过真的没办法是用深度纹理吗?

2

主题

132

帖子

132

积分

注册会员

Rank: 2

积分
132
发表于 2008-12-5 17:41:00 | 显示全部楼层

Re:请问在shader里如何获取当前点的深度值?

只有自己多渲染一次,把z值写进一个rendertarget里面,纹理格式就是用32位的就行了。
要想只接读深度缓冲,用dx10...

227

主题

1793

帖子

1866

积分

金牌会员

Rank: 6Rank: 6

积分
1866
 楼主| 发表于 2008-12-5 21:41:00 | 显示全部楼层

Re:请问在shader里如何获取当前点的深度值?

问题就是没办法用32位纹理……
另外
使用7楼的办法仍然不行……
精度调整总是存在很大误差
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-20 18:50

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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