游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6616|回复: 12

关于shader中像素的法向量的问题,求助

[复制链接]

2

主题

15

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2008-4-15 09:39:00 | 显示全部楼层 |阅读模式
初学shader不久,现在在用shder做一个纹理动画的水面,使用法线图进行逐像素打光,最终结果只是
散射颜色+高光颜色。
做了些尝试,遇到些问题,希望牛人能指点一下:
1、只使用pixelshader,在shader文件里将光向量与视向量都变换到视图空间,(视向量根据一定方法插值计算,当然不是很精确),这个时候能够看到高光。

2、使用vertexshader和pixelshader,在vertexshader中输出顶点位置,光向量L、视向量V和顶点法线N(出于非平面水面的需要所作的尝试),在pixelshader中对法线纹理采样,用像素法线来计算散射颜色和高光。

  但是这种方式下不论在vertexshader中将L、V、N三个向量变换至世界空间还是视图空间,结果都是只能看到散射颜色,完全见不到高光。

  对于这个问题,希望高手们能够帮我解决一下,感激不尽 [em7]

0

主题

228

帖子

285

积分

中级会员

Rank: 3Rank: 3

积分
285
发表于 2008-4-15 10:29:00 | 显示全部楼层

Re:关于shader中像素的法向量的问题,求助

法线图中的法线是切线空间的,需要把用于计算的相关向量也转换到切线空间中去
请参考Bump Mapping

2

主题

15

帖子

15

积分

新手上路

Rank: 1

积分
15
 楼主| 发表于 2008-4-15 10:48:00 | 显示全部楼层

Re:关于shader中像素的法向量的问题,求助

首先感谢楼上的回复。

我自己也做过平面的bumpmap,对于单个平面的凹凸映射我做过试验的:L、V不变换到切空间和变换到切空间的凹凸效果基本一致,只是对于一个平面的东西反而是变换到切空间的不稳定(对于一个编好的debug的exe在没有改动的情况下居然会出现不一样的情况,我只能认为自己的应用程序写的有问题了)。

上面的算题外话,我在做这个纹理动画的时候确实没有使用切空间,按楼上的说法,似乎必须变换到切空间,但是我还是不明白为什么能够散射颜色正常而输出的高光却全是黑的。

这种使用法线图的是否一定要变换到切空间呢?

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2008-4-16 00:27:00 | 显示全部楼层

Re:关于shader中像素的法向量的问题,求助

估计是计算高光的过程中出了问题,如果是黑色,则很可能是某个中间量为0.

2

主题

15

帖子

15

积分

新手上路

Rank: 1

积分
15
 楼主| 发表于 2008-4-16 08:49:00 | 显示全部楼层

Re:关于shader中像素的法向量的问题,求助

谢谢楼上的回复,我会查一下是否是这个问题。
我计算高光是用:
float3 h = normalize(v+l);
spec = pow(dot(h,n), power);

另外,我想问的是变换到切空间使用的顶点切线,如果使用d3d的mesh,是有d3d库函数可以直接计算其顶点切线的,如果是自定义球体的话那么其顶点切线应该如何计算呢?如果只是对一个平面进行凹凸映射,那这时候的顶点切线又该如何计算呢?

希望有人给我指点一下,谢谢了

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2008-4-17 00:43:00 | 显示全部楼层

Re:关于shader中像素的法向量的问题,求助

d3dx 有这个函数,具体自己找一下吧。

2

主题

15

帖子

15

积分

新手上路

Rank: 1

积分
15
 楼主| 发表于 2008-4-17 11:45:00 | 显示全部楼层

Re:关于shader中像素的法向量的问题,求助

谢谢楼上连续的回复。

我先按二楼说的将相关向量变换到切空间中,确实能够看到逐像素的高光了(是对于自定义的球体的)。但是对于每个顶点我给的切线是一样的(比如(1,1,1)),这样可以吗?

又使用D3DXCreateSphere创建球,设断点发现是382个点,760个面的图形,用position, texcoord,normal,tangent的VertexElement去 CloneMesh,并使用D3DXComputeNormals和D3DXComputeTangent去计算切线和法线,发现法线的计算没什么问题,但是顶点切线算出来全部都是(0,0,0)!?
而且由于CreateSphere创建的球体没有纹理坐标信息,顶点的纹理坐标还要自己去填……

如果有做过这种使用球形网格的凹凸映射的,能不能把你们成功的经验分享一下?希望能把所有细节都描述一下,谢谢了

PS:近几天因故不能上网,只能周末再来看贴子了,希望高手多帮帮忙^_^

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2008-4-17 22:38:00 | 显示全部楼层

Re:关于shader中像素的法向量的问题,求助

一般计算切线是要通过纹理坐标来计算的.

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2008-4-17 22:40:00 | 显示全部楼层

Re:关于shader中像素的法向量的问题,求助

球形的纹理手动填也不是很难,算一下就知道了.

2

主题

15

帖子

15

积分

新手上路

Rank: 1

积分
15
 楼主| 发表于 2008-4-21 08:43:00 | 显示全部楼层

Re:关于shader中像素的法向量的问题,求助

再次感谢一下楼上的。

球形的纹理坐标已经填上了,我想请问使用D3DXComputeTangent这个方法算出的切线都是(0,0,0)这个是否正确呢?还是过程哪里出了问题?

想了很长时间也不知道这种多边形的顶点切线应该怎么求,因为对于一个球来说可以切其任意表面一点的集合应该是一个切面,具体怎么算切线就是不清楚……楼上的能否给一个通过纹理坐标来计算切线的算法?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-22 17:52

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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