游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4533|回复: 8

今天做了个实验,发现个奇怪的问题,关于顶点法向量的。

[复制链接]

9

主题

32

帖子

36

积分

注册会员

Rank: 2

积分
36
发表于 2008-5-12 09:39:00 | 显示全部楼层 |阅读模式
先建个模型,很简单,建个cube就可以。然后导入程序,原本一切OK。这时候我乘上一个放大矩阵,比如5倍吧。
这时后再渲染时发现模型变暗了。此时如果把光照的rgb分量*5,发现效果又和原先一样了。这说明顶点法向量的模确实是缩短了5倍。可是按理来说一个向量乘以一个放大矩阵,如<1,1,1,0>*(5,0,0,0,
                                                                0,5,0,0,
                                                           0,0,5,0,
                                                           0,0,0,1)得到<5,5,5,0>,模的确是<1,1,1,0>的5倍啊,怎么反而却是原本的1/5呢??
如果你乘以的是缩小矩阵,会发现模型反而变得高亮,也说明法向量模不是缩短反而是伸长了。这其中有什么玄机?恳请高手指点 [em7] [em7]

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
发表于 2008-5-12 09:42:00 | 显示全部楼层

Re:今天做了个实验,发现个奇怪的问题,关于顶点法向量

不懂……不过感觉很奇怪:法向量只有方向有意义吧,模也会影响光照?

8

主题

182

帖子

268

积分

中级会员

Rank: 3Rank: 3

积分
268
发表于 2008-5-12 11:26:00 | 显示全部楼层

Re:今天做了个实验,发现个奇怪的问题,关于顶点法向量

D3DRS_NORMALIZENORMALS

9

主题

32

帖子

36

积分

注册会员

Rank: 2

积分
36
 楼主| 发表于 2008-5-12 12:26:00 | 显示全部楼层

Re: Re:今天做了个实验,发现个奇怪的问题,关于顶点法

hugp1973: Re:今天做了个实验,发现个奇怪的问题,关于顶点法向量的。

D3DRS_NORMALIZENORMALS

先感谢阁下提供这个方法,不过我估计这个State可能相当耗资源,平方+平方+平方再开方的操作可是很昂贵的,顶点一多起来可不得了。
不过我现在最关心的不是如何解决太亮或太暗的问题。而是,顶点法线在乘以一个放大矩阵时,模不但没有伸长反而缩短了??? [em6]

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
发表于 2008-5-12 12:30:00 | 显示全部楼层

Re:今天做了个实验,发现个奇怪的问题,关于顶点法向量

实在不行的话,你每次缩放的时候都对发向量乘以一定的倍数?

9

主题

32

帖子

36

积分

注册会员

Rank: 2

积分
36
 楼主| 发表于 2008-5-12 13:06:00 | 显示全部楼层

Re: Re:今天做了个实验,发现个奇怪的问题,关于顶点法

sjinny: Re:今天做了个实验,发现个奇怪的问题,关于顶点法向量的。

实在不行的话,你每次缩放的时候都对发向量乘以一定的倍数?

谢谢,不过您也是告诉我解决的办法。而我现在更迫切想知道的是这个实验结果为什么和理论上结果刚好相反,或者说我的判断错在哪里。
SetTransform(D3DTS_WORLD, &matWorld ); 其实我估计就是D3D把你所有的顶点去乘以这个matWorld,但是这个matWorld有可能就是我刚刚说的放大矩阵,这样每个顶点一乘后,顶点坐标确实被放大了,所以整个模型也变大了。这个好理解。可是,法线呢?根据矩阵乘法也应该变大,但是我的实验结果告诉我却是变小

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
发表于 2008-5-12 13:27:00 | 显示全部楼层

Re:今天做了个实验,发现个奇怪的问题,关于顶点法向量

SetTransform
不懂D3D,但是OGL里调用Transform之类的函数的时候都要指定操作的是什么矩阵,你检查看下这里操作的是不是物体自身的矩阵……

3

主题

113

帖子

147

积分

注册会员

Rank: 2

积分
147
发表于 2008-5-12 13:36:00 | 显示全部楼层

Re:今天做了个实验,发现个奇怪的问题,关于顶点法向量

没有标准化向量.
另外,Nvidia中有个快速求平方根的方法,请避免使用D3DRS_NORMALIZENORMALS
        __forceinline float reciprocal_squareroot(const float x)
        {
                u32 tmp = (u32(IEEE_1_0 << 1) + IEEE_1_0 - *(u32*)&x) >> 1;   
                f32 y = *(f32*)&tmp;                                             
                return y * (1.47f - 0.47f * x * y * y);
        }

9

主题

32

帖子

36

积分

注册会员

Rank: 2

积分
36
 楼主| 发表于 2008-5-12 13:47:00 | 显示全部楼层

Re: Re:今天做了个实验,发现个奇怪的问题,关于顶点法

duzhi5368: Re:今天做了个实验,发现个奇怪的问题,关于顶点法向量的。

没有标准化向量.
另外,Nvidia中有个快速求平方根的方法,请避免使用D3DRS_NORMALIZENORMALS
        __forceinlin...

您所说的标准化是说在实时渲染中标准化?如果这样的话,我觉得会相当耗资源,除非有硬件支持,要是在渲染之前标准化,那没用,如果碰到的世界矩阵是缩放的,法线的模的大小还是会改变。
但是我不明白的是为什么模型放大了模反而变小,模型缩小了模反而变大??我现在只想知道这个
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-22 12:57

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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