2016-11-28 14 views
1

Я пытаюсь запустить практику системы рендеринга D3D 11 для загрузки и рендеринга файлов FBX, но у меня есть проблема преобразования вершин в вершинном шейдере.Direct3D11 неправильные преобразования вершин в вершинном шейдере

Я не предполагаю, что не так, в графическом отладчике Visual Studio. Я вижу, что сетка, переданная конвейеру, находится в порядке на этапе ввода ассемблера, но после преобразования шейдеров вершин все разрывается и отображается неправильно, если кто-то может сказать мне что-то не так, я буду благодарен за информацию.

View of the Input Assembler Stage

View of the Vertex Shader Output

Это код Vertex Shader

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''. Вы можете использовать '' float4'', если вы всегда устанавливаете w-компонент в 1.0 в буфер вершин, но вам, вероятно, будет лучше использовать '' float3''. –

+0

Спасибо за помощь. Задача решена. Проблемой был порядок умножения. Я положил сначала вектор, а затем матрицу на mul-оператор, а правильный порядок умножения - это обратная, первая матрица, то вектор. Благодаря!! –

ответ

0

Из комментария выглядит как вопрос на самом деле может быть матрицей row- майора/столбца. Исходный код HLSL, вероятно, будет работать, если матрицы будут транспонированы на стороне ЦП.