的DirectX纹理渲染incorretly
我试图渲染贴图,立方体作品立方体,但质地古怪拉伸的前,后,左,右: 的DirectX纹理渲染incorretly
纹理我使用:
正如您可能会注意到纹理被拉伸到两侧。 这是我的代码(不饱满,只是你可能需要部分: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));
此外,我加倍检查了一切,所以一切都绑定到管线等。
如果有人可以帮助,那会很棒! 在此先感谢!
问题是,您只使用8个顶点,这对于立方体来说是不正确的,因为对于每个面,顶点需要不同的UV坐标(如果以后需要它们,法线也是相同的)。
因此,您需要为每个人脸创建4个顶点,以便为每个人设置正确的uv。
下面是DirectX Toolkit的一个示例
事实上,你有这样的纹理似乎是纹理尺寸不像立方体的大小一样大的问题。通过这种方式,它将复制尽可能多的次数,以填充多维数据集的整个面。
如果放大纹理文件让我们说10次会发生什么?
试一试......谢谢! – Rakete1111 2014-09-10 18:42:43
也许我错了,但在我看来,它是纹理文件的大小或在x,y和z轴上的缩放比例 – Sliver2009 2014-09-10 18:43:49
我会试穿,无所谓如果它是错误的:) – Rakete1111 2014-09-10 18:44:50
是的,修好了!谢谢! – Rakete1111 2014-09-11 15:20:13