gpt4 book ai didi

c++ - 顶点着色器中的 Direct3D11 错误顶点变换

转载 作者:太空宇宙 更新时间:2023-11-04 13:08:54 26 4
gpt4 key购买 nike

我正在尝试运行 D3D 11 渲染系统的实践来加载和渲染 FBX 文件,但我在顶点着色器中转换顶点时遇到问题。

我不认为出了什么问题,在 Visual Studio Graphics Debugger 中,我可以看到传递给管道的网格在输入汇编器阶段是正常的,但是在顶点着色器转换之后,所有问题都爆发并呈现错误,如果有人能告诉我出了什么问题,我会很感激你提供的信息。

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_);

最佳答案

从评论来看,问题实际上可能是矩阵行优先/列优先差异。如果在 CPU 端转置矩阵,原始 HLSL 代码可能会起作用。

关于c++ - 顶点着色器中的 Direct3D11 错误顶点变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40835991/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com