6 개의 이미지에서 D3D11에 큐브 맵을 만드는 방법은 무엇입니까? 내가 찾은 모든 예는 하나의 .dds 만 사용합니다. 특히 큐브 텍스처의 개별면을 어떻게 업로드합니까?D3D11 : 6 개의 이미지에서 큐브 맵 만들기
4
A
답변
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);
이 큐브 맵에 대한 여섯 "빨간색"이미지를 만듭니다.
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. tiff 이미지에서 비트 맵 객체 만들기
- 2. svg 이미지에서 시작하는 링크 가능 맵 만들기
- 3. Matlab, 이미지에서 사용자 정의 색상 맵 만들기
- 4. Windows에서 비트 맵 이미지에서 대각선 이미지 만들기
- 5. 큐브 맵 룩업
- 6. OpenGL 4.0 큐브 맵 문제
- 7. 큐브 맵 (PCSS)의 PCF
- 8. GLSL을 사용하여 큐브 맵 표시
- 9. GCC 용 올바른 D3D11 라이브러리 파일 만들기
- 10. 단일 이미지에서 깊이 맵/Defoucs 맵 - GPU
- 11. 로컬 큐브 만들기
- 12. 네비게이션 3D 큐브 만들기
- 13. iphone 큐브 클래스 만들기
- 14. 뷰 컨트롤러 간의 큐브 애니메이션 iOS 6
- 15. 비트 맵 이미지에서 BPP 변경
- 16. 비트 맵 이미지에서 배경색 설정
- 17. 커스텀 쉐이더 - 유니티 - 디퓨즈 + 라이트 맵 + 노멀 + 큐브 맵
- 18. 6 개의 템플릿 인자를 가진 Angular.Dart Cube 컴포넌트 만들기
- 19. D3D11 : 여러 삼각형 회전
- 20. 범프 및 스펙 큐브 맵 내보내기
- 21. 단일 패스로 큐브 맵 그리기 OpenGL
- 22. OpenGL 그림자 큐브 맵 - 조회 문제
- 23. OpenGL 큐브 맵 텍스처의 한면으로 렌더링하는 방법
- 24. OpenGL : 큐브 맵 텍스쳐, UV 맵핑 없음
- 25. 움직이는 카메라로 뒤집는 OpenGL 큐브 맵 반사
- 26. 3d에서 깊이 맵 만들기
- 27. JavaFX에서 3x3 루빅스 큐브 만들기
- 28. 이미지에서 비디오 만들기
- 29. GDI + 이미지에서 마스크 만들기
- 30. 이미지에서 AR 마커 만들기
큐브 맵 데이터를 붉은 색 대신 파일에서 텍스처로 채우려면 어떻게해야합니까? – PinkTurtle
참고 : http://openil.sourceforge.net/ 또는 http://cimg.eu/와 같은 이미지 로더를 사용하여 텍스처 CPU 측을 초기화하십시오. – PinkTurtle
텍스처 데이터로드 방법 : https://bitbucket.org/Anteru/d3d12sample/src/bf8c36ada43287ef3d786d99bc0d4d4b9eb9f394/inc/ImageIO.h?at=default – Vertexwahn