Почему координаты текстуры неверны, когда я пытаюсь визуализировать модель fbx в DirectX - PullRequest
1 голос
/ 05 апреля 2019

У меня есть проект c ++ / cx, в котором я хочу рендерить сетки (загруженные из FBX-файлов), используя DirectX-11.FBX-файлы содержат текстурные координаты, но при их рендеринге эти UV-координаты, отправляемые вершинному шейдеру, совершенно неверны.

Вот как это выглядит:

2 cyclists

Предполагается, что это два человека-велосипедиста, но текстура отображается совершенно неверно.

Описание vertexDescription следующее:

D3D11_INPUT_ELEMENT_DESC _vertexDescriptions[3] =
{
    { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
    { "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
    { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};

Обратите внимание, что Position иНоминальные данные верны при рендеринге, только неправильные / отсутствующие координаты текстуры.

VertexShader-input и -output:

struct VertexShaderInput
{
    float3 position : POSITION;
    float3 normal : NORMAL;
    float2 uv : TEXCOORD0;
};

struct VertexShaderOutput
{
    float4 color : COLOR0;
    float2 uv : TEXCOORD0;
    float4 position : SV_POSITION;
};

PixelShader-input:

struct PixelShaderInput
{
    float4 color: COLOR0;
    float2 uv : TEXCOORD0;
};

Вот фрагмент файла fbx:

LayerElementUV: 0 {
    Version: 101
    Name: "UVTex"
    MappingInformationType: "ByPolygonVertex"
    ReferenceInformationType: "IndexToDirect"
    UV: 0.118273,0.459037,0.598600,0.180400,0.647187,0.129884,
    //...
    UVIndex: 2136,255,879,734,2136,734,3602,1034,1034,3602,6071,1176,
    //...

Файл fbx встроен в cmo-файл в Visual Studio, и он загружается следующим образом с помощью directxtk:

_effectFactory = std::make_unique<EffectFactory>(_d3dDevice.Get());
_playerModel = Model::CreateFromCMO(_d3dDevice.Get(), L"Ambiorix.Track3DComponent\\PlayerModel.cmo", *_effectFactory);

PlayerMesh затем инициализируется следующим образом (_playerModel передается этой функции):

task<void> PlayerMesh::InitializeAsync(Model *const model)
{
    _logger->Trace(L"PlayerMesh.InitializeAsync()");
    _isInitialized = false;

    _primitiveTopology = model->meshes[0]->meshParts[0]->primitiveType;
    _vertexBufferStride = model->meshes[0]->meshParts[0]->vertexStride;
    _vertexBufferOffset = model->meshes[0]->meshParts[0]->vertexOffset;
    _vertexBuffer = model->meshes[0]->meshParts[0]->vertexBuffer;
    _inputLayout = model->meshes[0]->meshParts[0]->inputLayout;
    _indexFormat = model->meshes[0]->meshParts[0]->indexFormat;
    _indexCount = model->meshes[0]->meshParts[0]->indexCount;
    _indexBuffer = model->meshes[0]->meshParts[0]->indexBuffer;

    std::vector<task<void>> tasks;
    tasks.push_back(CreateVertexShaderAsync(_vertexShaderRelativeFilePath, _vertexDescriptions, ARRAYSIZE(_vertexDescriptions)));
    tasks.push_back(CreatePixelShaderAsync(_pixelShaderRelativeFilePath));

    return when_all(tasks.begin(), tasks.end())
        .then([this]
        {
            CreateSamplerState();

            auto createTextureResult = CreateDDSTextureFromFile(_d3dDevice.Get(), _textureRelativeFilePath->Data(), nullptr, _texture.ReleaseAndGetAddressOf());
            if (FAILED(createTextureResult))
            {
                _logger->Error(L"Failed to create texture.");
                return;
            }

            PlayerMeshConstantBuffer solidColorConstantBuffer;

            D3D11_SUBRESOURCE_DATA InitData;
            InitData.pSysMem = &solidColorConstantBuffer;
            InitData.SysMemPitch = 0u;
            InitData.SysMemSlicePitch = 0u;

            CD3D11_BUFFER_DESC bufferDescription(sizeof(PlayerMeshConstantBuffer), D3D11_BIND_CONSTANT_BUFFER);

            auto createConstantBuffer = _d3dDevice->CreateBuffer(&bufferDescription, &InitData, _constantBuffer.GetAddressOf());
            if (FAILED(createConstantBuffer))
            {
                _logger->Error(L"PlayerMesh.InitializeAsync() | Failed to create constant buffer.");
                return;
            }

            _isInitialized = true;
            _logger->Trace("PlayerMesh.InitializeAsync() | Done.");
        });
}

Я могу поделиться большим кодом и всем файлом fbx, если это поможет, просто спросите, я не оченьзнать, что еще полезно знать.

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

любая помощь?

Редактировать : Первоначально я указал UV, где 0, но я заметил, что наличие

struct VertexShaderOutput
{
    float4 color : COLOR0;
    float2 uv : TEXCOORD;
    float4 position : SV_POSITION;
};

вместо

struct VertexShaderOutput
{
    float4 color : COLOR0;
    float4 position : SV_POSITION;
    float2 uv : TEXCOORD;
};

исправило это, хотя понятия не имею, почему.

...