2014-09-10 213 views
1

我試圖渲染貼圖,立方體作品立方體,但質地古怪拉伸的前,後,左,右: enter image description here的DirectX紋理渲染incorretly

紋理我使用: 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

問題是,您只使用8個頂點,這對於立方體來說是不正確的,因爲對於每個面,頂點需要不同的UV座標(如果以後需要它們,法線也是相同的)。

因此,您需要爲每個人臉創建4個頂點,以便爲每個人設置正確的uv。

下面是DirectX Toolkit的一個示例

+0

是的,修好了!謝謝! – Rakete1111 2014-09-11 15:20:13

1

事實上,你有這樣的紋理似乎是紋理尺寸不像立方體的大小一樣大的問題。通過這種方式,它將複製儘可能多的次數,以填充多維數據集的整個面。

如果放大紋理文件讓我們說10次會發生什麼?

+0

試一試......謝謝! – Rakete1111 2014-09-10 18:42:43

+0

也許我錯了,但在我看來,它是紋理文件的大小或在x,y和z軸上的縮放比例 – Sliver2009 2014-09-10 18:43:49

+0

我會試穿,無所謂如果它是錯誤的:) – Rakete1111 2014-09-10 18:44:50