未渲​​染的3d模型(DirectX 12)

时间:2017-03-14 18:21:22

标签: direct3d vertex-shader vertex

我正在开发一个使用assimp加载3d模型的小程序,但它不会渲染模型。起初我认为顶点和索引没有正确加载但事实并非如此(我打印在txt文件的顶点和索引上)。我认为探测器可能与模型和相机的位置有关。应用程序不会返回任何错误,它会正常运行。

顶点结构:

struct Vertex {
    XMFLOAT3 position;
    XMFLOAT2 texture;
    XMFLOAT3 normal;
};

输入布局:

D3D12_INPUT_ELEMENT_DESC inputLayout[] =
    {
        { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
        { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
        { "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D12_APPEND_ALIGNED_ELEMENT, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 }
    };

顶点,texcoords,法线和索引加载器:

model = new ModelMesh();
    std::vector<XMFLOAT3> positions;
    std::vector<XMFLOAT3> normals;
    std::vector<XMFLOAT2> texCoords;
    std::vector<unsigned int> indices;
    model->LoadMesh("beast.x", positions, normals,
        texCoords, indices);
    // Create vertex buffer

    if (positions.size() == 0)
    {
        MessageBox(0, L"Vertices vector is empty.",
            L"Error", MB_OK);
    }
    Vertex* vList = new Vertex[positions.size()];
    for (size_t i = 0; i < positions.size(); i++)
    {
        Vertex vert;
        XMFLOAT3 pos = positions[i];
        vert.position = XMFLOAT3(pos.x, pos.y, pos.z);
        XMFLOAT3 norm = normals[i];
        vert.normal = XMFLOAT3(norm.x, norm.y, norm.z);
        XMFLOAT2 tex = texCoords[i];
        vert.texture = XMFLOAT2(tex.x, tex.y);
        vList[i] = vert;
    }

    int vBufferSize = sizeof(vList);

构建相机和视图:

    XMMATRIX tmpMat = XMMatrixPerspectiveFovLH(45.0f*(3.14f/180.0f), (float)Width / (float)Height, 0.1f, 1000.0f);
    XMStoreFloat4x4(&cameraProjMat, tmpMat);

    // set starting camera state
    cameraPosition = XMFLOAT4(0.0f, 2.0f, -4.0f, 0.0f);
    cameraTarget = XMFLOAT4(0.0f, 0.0f, 0.0f, 0.0f);
    cameraUp = XMFLOAT4(0.0f, 1.0f, 0.0f, 0.0f);

    // build view matrix
    XMVECTOR cPos = XMLoadFloat4(&cameraPosition);
    XMVECTOR cTarg = XMLoadFloat4(&cameraTarget);
    XMVECTOR cUp = XMLoadFloat4(&cameraUp);
    tmpMat = XMMatrixLookAtLH(cPos, cTarg, cUp);
    XMStoreFloat4x4(&cameraViewMat, tmpMat);


    cube1Position = XMFLOAT4(0.0f, 0.0f, 0.0f, 0.0f); 
    XMVECTOR posVec = XMLoadFloat4(&cube1Position); 

    tmpMat = XMMatrixTranslationFromVector(posVec); 
    XMStoreFloat4x4(&cube1RotMat, XMMatrixIdentity()); 
    XMStoreFloat4x4(&cube1WorldMat, tmpMat); 

更新功能:

    XMStoreFloat4x4(&cube1WorldMat, worldMat);


    XMMATRIX viewMat = XMLoadFloat4x4(&cameraViewMat); // load view matrix
    XMMATRIX projMat = XMLoadFloat4x4(&cameraProjMat); // load projection matrix
    XMMATRIX wvpMat = XMLoadFloat4x4(&cube1WorldMat) * viewMat * projMat; // create wvp matrix
    XMMATRIX transposed = XMMatrixTranspose(wvpMat); // must transpose wvp matrix for the gpu
    XMStoreFloat4x4(&cbPerObject.wvpMat, transposed); // store transposed wvp matrix in constant buffer

    memcpy(cbvGPUAddress[frameIndex], &cbPerObject, sizeof(cbPerObject));

VERTEX SHADER:

struct VS_INPUT
{
    float4 pos : POSITION;
    float2 tex: TEXCOORD;
    float3 normal : NORMAL;
};

struct VS_OUTPUT
{
    float4 pos: SV_POSITION;
    float2 tex: TEXCOORD;
    float3 normal: NORMAL;
};

cbuffer ConstantBuffer : register(b0)
{
    float4x4 wvpMat;
};

VS_OUTPUT main(VS_INPUT input)
{
    VS_OUTPUT output;
    output.pos = mul(input.pos, wvpMat);
    return output;
}

希望这是一个很长的代码,但我不明白这段代码出了什么问题。希望有人可以帮助我。

1 个答案:

答案 0 :(得分:0)

要尝试/检查的一些事情:

  • 使背景清晰为灰色。这样,如果您正在绘制黑色三角形,您将看到它们。
  • 在渲染状态下关闭背面剔除,以防三角形返回到前方。
  • 在渲染状态下关闭深度测试。
  • 关闭Alpha混合。
  • 您不会显示像素着色器,但请尝试编写常量颜色以查看您的光照计算是否已损坏。
  • 使用NVIDIA的nSight工具或Visual Studio Graphics调试器来查看图形管道正在做什么。

这些通常是我先尝试的东西......