游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2286|回复: 6

交流贴:关于Parallax Mapping的一点小小改进

[复制链接]

64

主题

855

帖子

856

积分

高级会员

Rank: 4

积分
856
QQ
发表于 2005-10-17 09:45:00 | 显示全部楼层 |阅读模式
最近做Parallax的研究,发现必须要在PS中逐像素进行Eye Vector的归一化运算(Normalize),否则画面计算将不精确,无奈偶是用d3d8的,PS只能用到1.4版本,缺乏rsq、rcp指令的支持,对于插值的Eye Vector实在无法做到Normalization。原PS伪代码如下:

从纹理坐标寄存器得到当前像素EyeVec、Height
Normalize(EyeVec)    //此处PS2.0以下无法实现
NewTexCoord = OldTexCoord + EyeVec * Height * Scale * ( 1 - Biass )

我苦思冥想很久,终于得到一个变通办法跳过Normalize,且PS汇编指令比以前还大大减少。我的方法是先在VS中进行Eyevec 的TBN空间变化,然后计算得到EyeVec的模,再在PS中将EyeVec的X、Z坐标除以EyeVec的模,即可得到Normalization的EyeVec的X、Z坐标。关键代码如下:

vs.1.0
....  // r2.xyz存储了未Normalization的TBN空间的EyeVector分量
mov oT1.xyz, r2.xyz  // oT1.xyz储存未Normalization的EyeVector
dp3 r2.x, r2, r2
rsq r2.x, r2.x
rcp oT1.w, r2.x  // 将EyeVec模存储到oT1.w中

//-------------------------------------------------------------
ps.1.4
.....
texcrd r3.rg, t1_dw.rga  // t1.xy存储了EyeVec的X、Z坐标,t1.w存储了EyeVec的模

这样一条PS汇编指令就同时完成了装载EyeVec坐标且Normalize化的工作,比原算法中Normalize指令简化了不少。Interpolated的EyeVec模线性变化,这与每个像素到眼睛的距离是线性变化的一致,所以,这个算法理论上讲是正确的。

64

主题

855

帖子

856

积分

高级会员

Rank: 4

积分
856
QQ
 楼主| 发表于 2005-10-17 09:56:00 | 显示全部楼层

Re: 交流贴:关于Parallax Mapping的一点小小改进

效果如下:

64

主题

855

帖子

856

积分

高级会员

Rank: 4

积分
856
QQ
 楼主| 发表于 2005-10-17 11:20:00 | 显示全部楼层

Re:交流贴:关于Parallax Mapping的一点小小改进

兄台的CubeMap意见不错,偶好好研究研究。

64

主题

855

帖子

856

积分

高级会员

Rank: 4

积分
856
QQ
 楼主| 发表于 2005-10-19 15:37:00 | 显示全部楼层

Re: 交流贴:关于Parallax Mapping的一点小小改进

现在改成CubeMap归一化方式了,视觉上完全可以接受。另外,顶楼的方法还是有问题的,当眼睛到地面的向量长度不是单调递增或单调递减的话(长度先减少再增长或者先增长再减少),插值出来的EyeVector还是错的,向量长度必须单调变化。
sf_20051019153638.jpg

2

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2005-10-20 15:24:00 | 显示全部楼层

Re:交流贴:关于Parallax Mapping的一点小小改进

这里对使用Normalized Cube Maps提个醒,随着GPU速度的提高,他也面临了于CPU相似的问题,就是计算速度与内存带宽的不平衡。

对于较新的显卡来说,用NCM的速度在许多情况下都要比直接计算来得慢(Texture Fetch, Cache Hit Miss等会导致管线延迟(Pipeline Stall)),虽然理论上流水线的设计会使延迟尽量减少,但还是比不上实际计算。

但是对于老显卡性能却会有一定的上升。

同样在CPU上,对于sin, sqrt, log等函数,越来越多的人开始使用近似算法(e.g. Taylor Series...etc.),而不是传统的查表法。

64

主题

855

帖子

856

积分

高级会员

Rank: 4

积分
856
QQ
 楼主| 发表于 2005-10-20 17:19:00 | 显示全部楼层

Re:交流贴:关于Parallax Mapping的一点小小改进

有道理,关键看代价能否接收。

1

主题

51

帖子

51

积分

注册会员

Rank: 2

积分
51
发表于 2005-10-26 21:34:00 | 显示全部楼层

Re: Re:交流贴:关于Parallax Mapping的一点小小改进

wsmj: Re:交流贴:关于Parallax Mapping的一点小小改进

这里对使用Normalized Cube Maps提个醒,随着GPU速度的提高,他也面临了于CPU相似的问题,就是计算速度与内...


这要看Normal的特点而定吧.如果Normal比较紊乱,那么cache miss的可能确实比较大.
而如果降低Normalized Cube Maps size 能够提高cache hit的话,还是有好处的,毕竟很多GPU单元中,tex和alu单元可以并行操作,相当于近乎免费的Normalize.
不过这个问题以后再也不会造成麻烦了,NV的PS3.0单元中fp16可以做免费的Normalization.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-22 10:02

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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