作者pleaselouis (LOUISN)
看板GameDesign
标题Re: [请益] 请教 Normal Map 的相关问题
时间Mon Jul 13 14:39:00 2009
1F:推 scottnien:normal map也可以用texture combine来做 不一定要用 07/10 01:15
2F:→ scottnien:pixel shader.. 07/10 01:16
3F:推 songfat:推一楼。可以用texture stage state 07/10 16:42
我目前的作法就是靠 texture stage state 来实做 Normal Map 技术
也就是根据前文有提到的 中文WIKI内的教学文件 :
http://0rz.tw/eXR4W
以下为教学网页连结内的 程式码范例 以及我对其的理解 如有谬误 烦请指正 :
---
DWORD Vector2ARGB(D3DXVECTOR3 *v,float height)
{
DWORD r=(DWORD)(127.0f*v->x+128.0f);
DWORD g=(DWORD)(127.0f*v->y+128.0f);
DWORD b=(DWORD)(127.0f*v->z+128.0f);
DWORD a=(DWORD)(255.0f*height);
return((a<<24L)+(r<<16L)+(g<<8L)+b);
}
上面这一段 是困扰我最多的地方 也就是我一直搞不太懂参数 D3DXVECTOR3 *v 的定义
教学网页连结内 的内容有提到 :
"从浓淡点到光源的单位向量与表面法线单位向量做点积,
得到的结果就是光线在表面上的强度。"
因此之前才会以 : 光线的"向量座标" = 3D物件的座标 - 光线的座标 当作参数v作测试
只是我现在把他反过来测试 : 光线的"向量座标" = 光线的座标 -3D物件的座标
这样测试出来的结果 两者都是虽然Mesh的确会有出现明显的 凹凸阴影效果 ...
但只要将 Mesh 移动离光源远一点 就会出现表面几乎全黑的现象 虽然还是有表现凹凸感
也就是出现这样的情况 :
http://0rz.tw/4wD6p 上图为靠近光源 下图为远离光源 的情形
但是我有在网路上另外找到另一个范例 是使用 Tangent Space 做运算
然後再把值填入 每一个 vertex 的 diffuse 实做 Normal Map 技术
这个范例 就算我将光源设定离开Mesh很远 也不会出现我上述变黑的情形发生
我目前仍是认为 应该我将 参数v 的定义误会 或是忽略少做了什麽运算 ...
因此才再度来请益 请版上的前辈 可以给予小弟指导与建议 谢谢大家 <(_ _)>
---
D3DXComputeNormalMap(pNormalMap,pHeightMap,NULL,0,D3D_CHANNEL_RED,1.0f);
由於我自己已经有用 美术软体产生的 法向量图 所以并没又使用这一行程式码
---
DWORD F=Vector2ARGB(&light,0.0f);
pD->SetRenderState(D3DRS_TEXTUREFACTOR,F);
这边实际使用到 函式Vector2ARGB() 而其参数又定名为 "light"
但是其回传的DWORD F 又只有使用 SetRenderState 将其填入 并非针对每一个vertex
因此我才会有关於 复数盏灯光的情况下 应该如何设定的疑问产生??
至今我还是没有理出头绪...烦请版上的前辈 为小弟解答...
---
pD->SetTexture(1,pTEXTURE);
pD->SetTexture(0,pNormalMap);
pD->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);
pD->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_DOTPRODUCT3);
pD->SetTextureStageState(0,D3DTSS_COLORARG2,D3DTA_TFACTOR);
pD->SetTextureStageState(1,D3DTSS_COLORARG1,D3DTA_TEXTURE);
pD->SetTextureStageState(1,D3DTSS_COLOROP,D3DTOP_MODULATE);
pD->SetTextureStageState(1,D3DTSS_COLORARG2,D3DTA_CURRENT);
这边则是网路上的范例几乎都一样 所以应该是没有问题的...
首先先把法向量图 与 TFACTOR 作点乘积的运算 算出其代表的 光暗凹凸阴影面
再使用 MODULATE 将 Stage-0的结果 与 皮肤材质 做合成 ...
---
感谢你看完这边文章 ...
最後 还是请版上的前辈 可以给予小弟指导与建议 谢谢大家 <(_ _)>
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 211.76.190.21
4F:推 NDark:mesh移动离光源远 这边容易搞混 最好直接给光与物体的座标 07/13 15:25
5F:→ NDark:说不定光跑到反向也不一定 07/13 15:25
刚刚再测试一次 连结是测试图片 :
http://0rz.tw/hUpBc
光线的位置座标为 ( 0, 0 ,175 )
图片由上至下三张图片的 Mesh座标 依序为 :
1. Mesh-1 ( -30 , -30 , 100)
2. Mesh-2 ( -190 , 35 , 90)
3. Mesh-3 ( 180 , -160 , 100)
到这边我又想到一个问题 如果是 平行光 那个他只有方向性 没有 Position
那麽 平行光 是要如何算出他与 Mesh 的 向量 是多少呢??
谢谢你的建议 麻烦请你再帮帮忙 给点建议 非常感谢你 谢谢 <(_ _)> ...
※ 编辑: pleaselouis 来自: 211.76.190.21 (07/13 16:05)
6F:→ pleaselouis:忘记说 我算完向量 有做 正规化 Normalize 的动作 07/13 16:19
7F:推 NDark:平行光有方向 可视作无穷远的点 07/13 16:28
8F:推 NDark:然後要确定 错误是 光源位置 造成的(把NorMap关掉试) 07/13 16:38
9F:→ NDark:还是 Normal Map内部你有地方算错了. 07/13 16:39
10F:→ NDark:然後 D3DRS_TEXTUREFACTOR 这是在定义multi-text的混色 07/13 16:43
11F:→ pleaselouis:有试过将Normal Map关闭过 应该是其他因素的说... 07/13 18:17
12F:→ pleaselouis:谢谢你的建议 我再努力去找找看我的错误 07/13 18:19
13F:推 scottnien:你的normal map如果是tangent space的..那麽传进去的 07/14 03:35
14F:→ scottnien:光向量也应该是tangent space的. 07/14 03:36
15F:→ scottnien:因为每个端点的tangent space都不一样.所以每个点都要 07/14 03:39
16F:→ scottnien:计算..而不是像范例中只传进单一个向量.. 07/14 03:39
17F:→ pleaselouis:请问有网友有找到使用 Texture Stage State 实做 07/14 09:32
18F:→ pleaselouis:Normal Map 且有用到 Tangent space 的范例供参考吗?? 07/14 09:33
19F:→ pleaselouis:我个人找到使用 Texture Stage State 的范例 都不是针 07/14 09:34
20F:→ pleaselouis:对Mesh的每一个顶点做运算 让我很困扰 请大家帮帮忙 07/14 09:34
21F:→ pleaselouis:谢谢大家的帮忙 感谢大家 谢谢 <(_ _)> 07/14 09:35