为什么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++ codestruct 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)将变换为
具体投影矩阵,楼主可以参考其他资料。
楼主可以检查一下你的投影矩阵设置,带入上面公式计算就知道了
[解决办法][解决办法]俄 我用的就是vs2005 每次写shader的时候 都用批pix调试 很麻烦的
[解决办法]LZ的view矩阵的Zoffset太大了,导致z/w趋近于1
[解决办法]不对,Zoffset没影响