DirectX 11:着色器不创建世界视图矩阵

时间:2014-10-26 23:05:19

标签: c++ debugging visual-studio-2013 shader directx-11

遇到此问题后here,由于顶点着色器值在与世界视图矩阵相乘时返回0,因此无法显示Entity::draw()调用。

enter image description here

问题是漏洞到一个错误的常量缓冲输入。但是,在检查了数值后,我似乎无法理解手头的问题。我预先乘以World,View和Projection矩阵:

mWorld = XMMatrixIdentity();
mView = XMMatrixLookAtLH(Eye, At, Up);
mProjection = XMMatrixPerspectiveFovLH(XM_PIDIV2, 1.0, 0.0f, 1000.0f);
mWVP = mWorld*mView*mProjection;

mWVP

-0.999999940, 0.000000000,  0.000000000, 0.000000000
 0.000000000, 0.999999940,  0.000000000, 0.000000000
 0.000000000, 0.000000000, -1.00000000, -1.00000000
 0.000000000, 0.000000000,  5.00000000,  5.00000000
转换后

mWVP进入常量缓冲区:

WorldCB.mWorldVP = XMMatrixTranspose(mWVP);
DeviceContext->UpdateSubresource(MatrixBuffer, 0, NULL, &WorldCB, 0, 0);
DeviceContext->VSSetConstantBuffers(0, 1, &MatrixBuffer);

XMMatrixTranspose(mWVP);

-0.999999940, 0.000000000,  0.000000000, 0.000000000
 0.000000000, 0.999999940,  0.000000000, 0.000000000
 0.000000000, 0.000000000, -1.00000000,  5.00000000
 0.000000000, 0.000000000, -1.00000000,  5.00000000

哪个看起来不错,至少对我而言。接下来,我的着色器开始做它的事情,但在这里,事情变得很时髦,检查反汇编产生的时间:

output.position = mul(position, WVP);

Vertex Shader:
00000000  dp4 o0.x, v0.xyzw, cb0[0].xyzw  
00000001  dp4 o0.y, v0.xyzw, cb0[1].xyzw  
00000002  dp4 o0.z, v0.xyzw, cb0[2].xyzw  
00000003  dp4 o0.w, v0.xyzw, cb0[3].xyzw  
00000004  mov o1.xyzw, v1.xyzw  

对于每次乘法,值返回0.如果output.position = position;值正确,则显示框,但不在世界转换内。

下面的完整着色器文件:

cbuffer ConstantBuffer:register(b0)
{
    matrix WVP;
}

struct VOut
{
    float4 position : SV_POSITION;
    float4 color : COLOR;
};

VOut VShader(float4 position : POSITION, float4 color : COLOR)
{
    VOut output;
    output.position = mul(position, WVP); // position;
    output.color = color;

    return output;
}


float4 PShader(float4 position : SV_POSITION, float4 color : COLOR) : SV_TARGET
{
     return color;
}

编辑:还注意到世界的转置矩阵等于零:

ObjectSpace = m_Scale*m_Rotation*m_Translate;
mWVP = ObjectSpace*direct3D.mView*direct3D.mProjection;

LocalWorld.mWorldVP = XMMatrixTranspose(wWVP);

XMMatrixTranspose(wWVP)出来了:

0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0

可能是问题所在。有关为什么矩阵的转置等于0的任何猜测

1 个答案:

答案 0 :(得分:1)

透视投影的近平面必须是大于零的某个值。如果它为零,则近平面正好是摄像机所在的位置,并且场景中的所有内容都会收敛到一个点。