2013-10-14 3 views

답변

5

그것은 다음과 같이 작동

D3D11_TEXTURE2D_DESC texDesc; 
texDesc.Width = description.width; 
texDesc.Height = description.height; 
texDesc.MipLevels = 1; 
texDesc.ArraySize = 6; 
texDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; 
texDesc.CPUAccessFlags = 0; 
texDesc.SampleDesc.Count = 1; 
texDesc.SampleDesc.Quality = 0; 
texDesc.Usage = D3D11_USAGE_DEFAULT; 
texDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE; 
texDesc.CPUAccessFlags = 0; 
texDesc.MiscFlags = D3D11_RESOURCE_MISC_TEXTURECUBE; 

D3D11_SHADER_RESOURCE_VIEW_DESC SMViewDesc; 
SMViewDesc.Format = texDesc.Format; 
SMViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE; 
SMViewDesc.TextureCube.MipLevels = texDesc.MipLevels; 
SMViewDesc.TextureCube.MostDetailedMip = 0; 

D3D11_SUBRESOURCE_DATA pData[6]; 
std::vector<vector4b> d[6]; // 6 images of type vector4b = 4 * unsigned char 

for (int cubeMapFaceIndex = 0; cubeMapFaceIndex < 6; cubeMapFaceIndex++) 
{ 
    d[cubeMapFaceIndex].resize(description.width * description.height); 

    // fill with red color 
    std::fill(
     d[cubeMapFaceIndex].begin(), 
     d[cubeMapFaceIndex].end(), 
     vector4b(255,0,0,255)); 

    pData[cubeMapFaceIndex].pSysMem = &d[cubeMapFaceIndex][0];// description.data; 
    pData[cubeMapFaceIndex].SysMemPitch = description.width * 4; 
    pData[cubeMapFaceIndex].SysMemSlicePitch = 0; 
} 

HRESULT hr = renderer->getDevice()->CreateTexture2D(&texDesc, 
    description.data[0] ? &pData[0] : nullptr, &m_pCubeTexture); 
assert(hr == S_OK); 

hr = renderer->getDevice()->CreateShaderResourceView(
    m_pCubeTexture, &SMViewDesc, &m_pShaderResourceView); 
assert(hr == S_OK); 

이 큐브 맵에 대한 여섯 "빨간색"이미지를 만듭니다.

+0

큐브 맵 데이터를 붉은 색 대신 파일에서 텍스처로 채우려면 어떻게해야합니까? – PinkTurtle

+1

참고 : http://openil.sourceforge.net/ 또는 http://cimg.eu/와 같은 이미지 로더를 사용하여 텍스처 CPU 측을 초기화하십시오. – PinkTurtle

+0

텍스처 데이터로드 방법 : https://bitbucket.org/Anteru/d3d12sample/src/bf8c36ada43287ef3d786d99bc0d4d4b9eb9f394/inc/ImageIO.h?at=default – Vertexwahn

2

나는이 질문이 오래되었으며 이미 해결책이 있음을 알고있다. 여기

디스크에서 6 개 텍스처로드 및 큐브 맵으로 함께두고 코드 예이다

사전 조건 :

ID3D11ShaderResourceView* srv = 0; 
ID3D11Resource* srcTex[6]; 

ShaderResourceView 포인터 및 디스크에서 여섯 개 텍스처 가득 배열 . 나는 오른쪽, 왼쪽, 위, 아래, 앞, 뒤 순서를 사용한다.

// Each element in the texture array has the same format/dimensions. 
D3D11_TEXTURE2D_DESC texElementDesc; 
((ID3D11Texture2D*)srcTex[0])->GetDesc(&texElementDesc); 

D3D11_TEXTURE2D_DESC texArrayDesc; 
texArrayDesc.Width = texElementDesc.Width; 
texArrayDesc.Height = texElementDesc.Height; 
texArrayDesc.MipLevels = texElementDesc.MipLevels; 
texArrayDesc.ArraySize = 6; 
texArrayDesc.Format = texElementDesc.Format; 
texArrayDesc.SampleDesc.Count = 1; 
texArrayDesc.SampleDesc.Quality = 0; 
texArrayDesc.Usage = D3D11_USAGE_DEFAULT; 
texArrayDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE; 
texArrayDesc.CPUAccessFlags = 0; 
texArrayDesc.MiscFlags = D3D11_RESOURCE_MISC_TEXTURECUBE; 

ID3D11Texture2D* texArray = 0; 
if (FAILED(pd3dDevice->CreateTexture2D(&texArrayDesc, 0, &texArray))) 
    return false; 

// Copy individual texture elements into texture array. 
ID3D11DeviceContext* pd3dContext; 
pd3dDevice->GetImmediateContext(&pd3dContext); 
D3D11_BOX sourceRegion; 

//Here i copy the mip map levels of the textures 
for (UINT x = 0; x < 6; x++) 
{ 
    for (UINT mipLevel = 0; mipLevel < texArrayDesc.MipLevels; mipLevel++) 
    { 
     sourceRegion.left = 0; 
     sourceRegion.right = (texArrayDesc.Width >> mipLevel); 
     sourceRegion.top = 0; 
     sourceRegion.bottom = (texArrayDesc.Height >> mipLevel); 
     sourceRegion.front = 0; 
     sourceRegion.back = 1; 

     //test for overflow 
     if (sourceRegion.bottom == 0 || sourceRegion.right == 0) 
      break; 

     pd3dContext->CopySubresourceRegion(texArray, D3D11CalcSubresource(mipLevel, x, texArrayDesc.MipLevels), 0, 0, 0, srcTex[x], mipLevel, &sourceRegion); 
    } 
} 

// Create a resource view to the texture array. 
D3D11_SHADER_RESOURCE_VIEW_DESC viewDesc; 
viewDesc.Format = texArrayDesc.Format; 
viewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE; 
viewDesc.TextureCube.MostDetailedMip = 0; 
viewDesc.TextureCube.MipLevels = texArrayDesc.MipLevels; 

if (FAILED(pd3dDevice->CreateShaderResourceView(texArray, &viewDesc, &srv))) 
    return false; 

누구든지이 질문을 다시 읽는다면이 질문을 시도해보십시오. 경고 : deviceContext를 사용해야하기 때문에이 함수는 threadsafe가 아닙니다.

+1

맞습니까? MiscFlags를 D3D11_RESOURCE_MISC_TEXTURECUBE로 설정해야한다고 생각했습니다. – Thomas

+1

네가 맞다. 내 원래 코드에 조건이있다. texArrayDesc.MiscFlags = isCubeMap? D3D11_RESOURCE_MISC_TEXTURECUBE : 0; isCubeMap은 텍스처를 만드는 함수 매개 변수이며, 내 대답을 편집합니다. 고마워 – kaiser

관련 문제