Я пытаюсь запустить практику системы рендеринга 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_);
Обычно у вас есть позиция ввода вершин, которая будет '' float3'' вместо '' float4''. Вы можете использовать '' float4'', если вы всегда устанавливаете w-компонент в 1.0 в буфер вершин, но вам, вероятно, будет лучше использовать '' float3''. –
Спасибо за помощь. Задача решена. Проблемой был порядок умножения. Я положил сначала вектор, а затем матрицу на mul-оператор, а правильный порядок умножения - это обратная, первая матрица, то вектор. Благодаря!! –