2014-09-10 215 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