2016-11-28 162 views
1

我想要运行D3D 11渲染系统来加载和呈现FBX文件的做法,但是我在顶点着色器中转换顶点时遇到了问题。顶点着色器中的Direct3D11错误顶点转换

我不认为在Visual Studio图形调试器中出了什么问题,我可以看到在输入汇编程序阶段传递给管道的网格状态正常,但是在顶点着色器转换完成后,如果有人可以判断出现错误我出了什么问题我会欣赏信息。

View of the Input Assembler Stage

View of the Vertex Shader Output

这是顶点着色器代码

cbuffer MatrixBuffer 
{ 
    matrix worldMatrix; 
    matrix viewMatrix; 
    matrix projectionMatrix; 
}; 

struct VertexInputType 
{ 
    float4 position : POSITION; 
    float3 normal : NORMAL; 
    float2 uv : TEXCOORD; 
}; 

struct PixelInputType 
{ 
    float4 position : SV_POSITION; 
    float3 normal : NORMAL; 
    float2 uv : TEXCOORD; 
}; 

PixelInputType TextureVertexShader(VertexInputType input) 
{ 
    PixelInputType output; 

    output.position = mul(input.position, worldMatrix); 
    output.position = mul(output.position, viewMatrix); 
    output.position = mul(output.position, projectionMatrix); 

    output.normal = input.normal; 
    output.uv = input.uv; 

    return output; 
} 

这是矩阵初始化

float lFieldOfView = 3.141592f * 0.4f; 
float lScreenAspect = static_cast<float>(width_)/static_cast<float>(height_); 

DirectX::XMMATRIX lProjection = MatrixDirectX::XMMatrixPerspectiveFovLHlFieldOfView, lScreenAspect, 1.0f, 10000.0f); 
DirectX::XMStoreFloat4x4(&lMatrixBuffer.projectionMatrix, lProjectionMatrix); 

DirectX::XMMATRIX lWorldMatrix = DirectX::XMMatrixIdentity(); 
DirectX::XMStoreFloat4x4(&lMatrixBuffer.worldMatrix, lWorldMatrix); 

DirectX::XMFLOAT3 lookAtPos(0.0f, 0.0f, 0.0f); 
DirectX::XMFLOAT3 eyePos(0.0f, 0.0f, -50.0f); 
DirectX::XMFLOAT3 upDir(0.0f, 1.0f, 0.0f); 
DirectX::FXMVECTOR lLookAtPos = DirectX::XMLoadFloat3(&lookAtPos); 
DirectX::FXMVECTOR lEyePos = DirectX::XMLoadFloat3(&eyePos); 
DirectX::FXMVECTOR lUpDir  = DirectX::XMLoadFloat3(&upDir); 

DirectX::XMMATRIX lViewMatrix = DirectX::XMMatrixLookAtLH(lEyePos, lLookAtPos, lUpDir); 
DirectX::XMStoreFloat4x4(&lMatrixBuffer.viewMatrix, lViewMatrix); 

D3D11_BUFFER_DESC lBufferDesc = { 0 }; 
lBufferDesc.ByteWidth  = sizeof(MatrixBufferType); 
lBufferDesc.Usage   = D3D11_USAGE_DYNAMIC; 
lBufferDesc.BindFlags  = D3D11_BIND_CONSTANT_BUFFER; 
lBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; 

D3D11_SUBRESOURCE_DATA lMatrixBufferData; 
lMatrixBufferData.pSysMem = &lMatrixBuffer; 

hResult = D3DDevice_->CreateBuffer(&lBufferDesc, &lMatrixBufferData, &D3DMatrixBuffer_); 
+0

通常你的顶点输入位置是一个“float3”而不是“float4”。如果您始终将顶点缓冲区中的w组件设置为1.0,则可以使用''float4'',但使用''float3''可能会更好。 –

+0

感谢您的帮助。问题解决了。问题是乘法顺序。我先把矢量然后把矩阵放在mul运算符上,然后正确的乘法顺序是反向的,先是矩阵然后是向量。谢谢!! –

回答

0

的代码的注释,它看起来像问题实际上可能是一个矩阵行 - 主要/专栏主要区别。如果矩阵将转置在CPU端,原始的HLSL代码可能会工作。