DirectX纹理渲染不正确

时间:2014-09-10 18:40:02

标签: render directx-11 texture2d

我正在尝试使用纹理渲染一个立方体,立方体可以工作,但纹理在前面,后面,右边和左边都很奇怪: enter image description here

我正在使用的纹理: enter image description here

您可能会注意到纹理在两侧伸展。 这是我的代码(不完整,只有您可能需要的部分:D):

我如何创建着色器资源视图:

//Create Shader Resouce View from file  and sampler
    HR(CreateDDSTextureFromFile(mDevice, L"D:\\DXSDK\\Projects\\Test\\Debug\\brick.dds", NULL, &mSRV));

    //Create Sampler State
    D3D11_SAMPLER_DESC sd;
    ZeroMemory(&sd, sizeof(D3D11_SAMPLER_DESC));
    sd.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
    sd.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
    sd.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
    sd.ComparisonFunc = D3D11_COMPARISON_NEVER;
    sd.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
    sd.MaxLOD = D3D11_FLOAT32_MAX;

    HR(mDevice->CreateSamplerState(&sd, &mSampler));

我如何创建我的缓冲区:

    //Create Vertex Buffer
    Vertex vertices[] = {
            //Front face vertices
            { XMFLOAT3(-1.0f, +1.0f, -1.0f), Colors::Blue, XMFLOAT2(0.0f, 0.0f) },
            { XMFLOAT3(+1.0f, +1.0f, -1.0f), Colors::Red, XMFLOAT2(1.0f, 0.0f) },
            { XMFLOAT3(-1.0f, -1.0f, -1.0f), Colors::Yellow, XMFLOAT2(0.0f, 1.0f) },
            { XMFLOAT3(+1.0f, -1.0f, -1.0f), Colors::White, XMFLOAT2(1.0f, 1.0f) },
            //Back face vertices
            { XMFLOAT3(-1.0f, +1.0f, +1.0f), Colors::Black, XMFLOAT2(0.0f, 0.0f) },
            { XMFLOAT3(+1.0f, +1.0f, +1.0f), Colors::Violet, XMFLOAT2(1.0f, 0.0f) },
            { XMFLOAT3(-1.0f, -1.0f, +1.0f), Colors::Aqua, XMFLOAT2(0.0f, 1.0f) },
            { XMFLOAT3(+1.0f, -1.0f, +1.0f), Colors::Green, XMFLOAT2(1.0f, 1.0f) }
    };

    D3D11_BUFFER_DESC vbDesc;
    ZeroMemory(&vbDesc, sizeof(D3D11_BUFFER_DESC));
    vbDesc.Usage = D3D11_USAGE_DEFAULT;
    vbDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
    vbDesc.ByteWidth = sizeof(Vertex) * 8;

    D3D11_SUBRESOURCE_DATA vbSub;
    ZeroMemory(&vbSub, sizeof(D3D11_SUBRESOURCE_DATA));
    vbSub.pSysMem = vertices;

    HR(mDevice->CreateBuffer(&vbDesc, &vbSub, &mBoxVB));

    //Create Index Buffer
    UINT indices[] = {
        //Front face
        0, 1, 2,
        1, 2, 3,
        //Back face
        4, 5, 6,
        5, 6, 7,
        //Right face
        1, 3, 5,
        3, 5, 7,
        //Left face
        0, 2, 4,
        2, 4, 6,
        //Top face
        0, 1, 5,
        0, 4, 5,
        //Bottom face
        2, 3, 7,
        2, 6, 7
    };

    D3D11_BUFFER_DESC ibDesc;
    ZeroMemory(&ibDesc, sizeof(D3D11_BUFFER_DESC));
    ibDesc.Usage = D3D11_USAGE_IMMUTABLE;
    ibDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;
    ibDesc.ByteWidth = sizeof(UINT) * 36;

    D3D11_SUBRESOURCE_DATA ibSub;
    ZeroMemory(&ibSub, sizeof(D3D11_SUBRESOURCE_DATA));
    ibSub.pSysMem = indices;

    HR(mDevice->CreateBuffer(&ibDesc, &ibSub, &mBoxIB));

    //Create Constant Buffer
    D3D11_BUFFER_DESC cbDesc;
    ZeroMemory(&cbDesc, sizeof(D3D11_BUFFER_DESC));
    cbDesc.Usage = D3D11_USAGE_DEFAULT;
    cbDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
    cbDesc.ByteWidth = sizeof(XMFLOAT4X4);

    HR(mDevice->CreateBuffer(&cbDesc, NULL, &mBoxCB));

另外,我仔细检查了一切,所以一切都绑定到管道等等。

如果有人可以提供帮助,那就太好了! 提前谢谢!

2 个答案:

答案 0 :(得分:2)

问题是你只使用8个顶点,这在立方体的情况下是不正确的,因为每个面顶点都需要不同的uv坐标(如果你以后需要它们,它也将与法线相同)。

所以你需要为每个面创建4个顶点,以便为每个顶点设置正确的uv。

以下是DirectX Toolkit

中的示例

答案 1 :(得分:1)

你有这样一个纹理的事实似乎是纹理尺寸没有立方体边大小那么大的问题。这样,它将复制多次填充立方体的整个边。

如果你放大纹理文件10次会发生什么?