首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络游戏 >

为什么Vertex Shader中,输出的oPos的w值与z值总是相等的?该怎么处理

2012-02-14 
为什么Vertex Shader中,输出的oPos的w值与z值总是相等的?用VS.net 2003的Shader debugger调试,渲染的结果

为什么Vertex Shader中,输出的oPos的w值与z值总是相等的?
用VS.net 2003的Shader debugger调试,渲染的结果是正确的,但是在SHADER中设置断点时发现,经过
坐标变换后输出的位置float4 oPos的z与w值总是相等的,真是奇怪。为什么啊?有没有遇到相同情况的
啊。
下面是VERTEX SHADER,很简单的。

C/C++ code
struct VS_INPUT {float3 pos : POSITION;float2 tex : TEXCOORD;};struct VS_OUTPUT{float4 pos : POSITION;float2 tex : TEXCOORD;};VS_OUTPUT vs_main(VS_INPUT vs_in){VS_OUTPUT vs_out = (VS_OUTPUT)0;vs_out.pos = mul(float4(vs_in.pos, 1.0f), matWVP);//这里vs_out.pos.z与w总是相等的,为什么啊?vs_out.tex = vs_in.tex;return vs_out;}

矩阵是这样得到的:
D3DXMATRIX matWVP = m_matWorld * (*fpc.GetViewMatrix()) * (*fpc.GetProjMatrix());
hr = m_lpEffect->SetMatrix("matWVP", &matWVP);
------------
The m_matWorld是单位矩阵, fpc是CFirstPersonCamera

[解决办法]
这里 float4(vs_in.pos, 1.0f),中的w总是为1.0的嘛
[解决办法]
把vsinPos和matWVP发上来
[解决办法]
你这是怎么调试的阿 怎么发现w和z值相等的 求指教
[解决办法]
w=1正常,你的z如果=1可能是z刚好遇到等于1了,
[解决办法]
matWVP是世界变换矩阵和view变换矩阵合在一起的一个矩阵,并不涉及到投影变换
在shader里要进行这个变换的原因是因为不管是vertex shader还是pixel shader都是在view space中计算的,所以这个传入的顶点都是进行从本地坐标系到相机坐标系的变换,在这整个变换过程中,由于没有涉及到投影变换,只要是顶点,w的分量都是1
[解决办法]
不知道楼主这里怎么要乘以一个投影矩阵?
[解决办法]
啊~

我知道楼主的意思了。

因为使用投影变换后,一个顶点(x,y,z,1)将变换为


具体投影矩阵,楼主可以参考其他资料。

楼主可以检查一下你的投影矩阵设置,带入上面公式计算就知道了
[解决办法]
探讨
引用:
不知道楼主这里怎么要乘以一个投影矩阵?

其实我也不知道是什么意思,只是看DX的示例代码是世界,视,投影矩阵连乘再传入到SHADER中,所以就用了。不过我始终认为,VERTEX SHADER的输出顶点坐标是应该变换到投影空间去的吧。这好像是VERTEX SHADER硬性规定吧。

[解决办法]
俄 我用的就是vs2005 每次写shader的时候 都用批pix调试 很麻烦的
[解决办法]
LZ的view矩阵的Zoffset太大了,导致z/w趋近于1
[解决办法]
不对,Zoffset没影响

热点排行