Directx 如何将RTV输出复制到立方体贴图的侧面?

Directx 如何将RTV输出复制到立方体贴图的侧面?,directx,directx-11,hlsl,Directx,Directx 11,Hlsl,我目前正在我的电脑中实现漫反射irridance(PBR的基于图像的lightning的一部分)。我必须拍摄一张HDR图像,并将其转换为立方体贴图。我目前使用的是一个等角度的立方体贴图着色器,它工作得很好。我能够将HDR图像投影到一个(单位)立方体上。现在是我被卡住的部分,我无法将这个立方体变成立方体贴图。我尝试使用1 TextureCube、6 RenderTargetView和ShaderResourceView。我的计划是从不同的视图投影渲染(单位)立方体6次,视野为90,以捕获每个渲染目

我目前正在我的电脑中实现漫反射irridance(PBR的基于图像的lightning的一部分)。我必须拍摄一张HDR图像,并将其转换为立方体贴图。我目前使用的是一个等角度的立方体贴图着色器,它工作得很好。我能够将HDR图像投影到一个(单位)立方体上。现在是我被卡住的部分,我无法将这个立方体变成立方体贴图。我尝试使用1 TextureCube6 RenderTargetViewShaderResourceView。我的计划是从不同的视图投影渲染(单位)立方体6次,视野为90,以捕获每个渲染目标的整个侧面,最后将渲染目标的每个输出复制到纹理立方体的相应侧面。 我不知道怎么做^。
注意:我使用DirextX11作为渲染后端。 这是关于我的问题的伪代码(不起作用)

glm::mat4 captureProjection=glm::perspective(glm::弧度(90.0f)、1.0f、0.1f、10.0f);
glm::mat4 CaptureView[]=
{
glm::lookAt(glm::vec3(0.0f,0.0f,0.0f),glm::vec3(1.0f,0.0f,0.0f),glm::vec3(0.0f,-1.0f,0.0f)),
glm::lookAt(glm::vec3(0.0f,0.0f,0.0f),glm::vec3(-1.0f,0.0f,0.0f),glm::vec3(0.0f,-1.0f,0.0f)),
glm::lookAt(glm::vec3(0.0f,0.0f,0.0f),glm::vec3(0.0f,1.0f,0.0f),glm::vec3(0.0f,0.0f,1.0f)),
glm::lookAt(glm::vec3(0.0f,0.0f,0.0f),glm::vec3(0.0f,-1.0f,0.0f),glm::vec3(0.0f,0.0f,-1.0f)),
glm::lookAt(glm::vec3(0.0f,0.0f,0.0f),glm::vec3(0.0f,0.0f,1.0f),glm::vec3(0.0f,-1.0f,0.0f)),
glm::lookAt(glm::vec3(0.0f,0.0f,0.0f),glm::vec3(0.0f,0.0f,-1.0f),glm::vec3(0.0f,-1.0f,0.0f))
};
//创建纹理
D3D11_TEXTURE2D_DESC textureDesc={};
textureDesc.Width=512;
织物高度=512;
textureDesc.MipLevels=1;
textureDesc.ArraySize=6;
textureDesc.Format=DXGI_Format_R32G32B32A32_FLOAT;
textureDesc.CPUAccessFlags=0;
textureDesc.SampleDesc.Count=1;
textureDesc.SampleDesc.Quality=0;
textureDesc.Usage=D3D11\u Usage\u默认值;
textureDesc.BindFlags=D3D11_BIND_SHADER_RESOURCE|D3D11_BIND_RENDER_TARGET;
textureDesc.miscsflags=D3D11_资源_MISC_TEXTURECUBE;
ID3D11Texture2D*tex=nullptr;
DX_调用(DX11Internal::GetDevice()->CreateTexture2D(&textureDesc,nullptr,&tex));
//为纹理立方体创建着色器资源视图
D3D11_着色器_资源_视图_DESC srvDesc={};
srvDesc.Format=textureDesc.Format;
srvDesc.ViewDimension=D3D11_SRV_DIMENSION_TEXTURECUBE;
srvDesc.Texture2D.mostdetaildmip=0;
srvDesc.Texture2D.MipLevels=1;
DX_调用(DX11Internal::GetDevice()->CreateShaderResourceView(tex,&srvDesc,&mSRV));
//创建渲染目标视图
载体RTV;
对于(Uint i=0;i<6;i++)
{
D3D11_RENDER_TARGET_VIEW_DESC renderTargetViewDesc={};
renderTargetViewDesc.Format=textureDesc.Format;
renderTargetViewDesc.ViewDimension=D3D11\u RTV\u DIMENSION\u TEXTURE2D;
renderTargetViewDesc.Texture2D.MipSlice=0;
ID3D11RenderTargetView*view=nullptr;
DX11Internal::GetDevice()->CreateRenderTargetView(tex、&renderTargetViewDesc、&view);
RTV.推回(视图);
}
tex->Release();
auto deviceContext=DX11Internal::GetDeviceContext();
对于(Uint i=0;i<6;++i)
{
float clearColor[4]={1.0f,0.1f,0.1f,1.0f};
deviceContext->ClearRenderTargetView(rtvs[i],clearColor);
Vault::Get(“equirectangulartosubemap.hlsl”)->Bind();
自动数据=captureProjection*CaptureView[i];
cbuffer->Bind();
cbuffer->SetData(&data);
纹理->绑定(0);
tempPipeline->Bind();
deviceContext->OMSetRenderTargets(1,&rtvs[i],nullptr);
//我在这里从不同的视图投影渲染立方体以捕捉面,但我不知道在何处将数据复制到TextureCube的//侧:([注意,我只做了一次]
RenderCommand::DrawIndexed(tempPipeline,36);
}

提前感谢!

在创建渲染视图时,您没有指定要写入的切片。 切片的正确描述为:

D3D11_RENDER_TARGET_VIEW_DESC renderTargetViewDesc = {};
renderTargetViewDesc.Format = textureDesc.Format;
renderTargetViewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
renderTargetViewDesc.Texture2DArray.MipSlice = 0;
renderTargetViewDesc.Texture2DArray.FirstArraySlice =i;
renderTargetViewDesc.Texture2DArray.ArraySize = 1;
(注意:如果使用MSAA,ViewDimension将变成D3D11\u RTV\u DIMENSION\u Texture2DMSA数组)

另外,要为资源创建着色器视图,由于要创建默认视图,因此可以传递NULL而不是自制的D3D11\u shader\u resource\u view\u DESC

DX_CALL(DX11Internal::GetDevice()->CreateShaderResourceView(tex, NULL, &mSRV));
还可以创建另一个渲染视图,该视图一次性映射整个立方体贴图:

DX11Internal::GetDevice()->CreateRenderTargetView(tex, NULL, &cubeMapFullView);

但在这种情况下,需要使用几何体着色器跨切片复制几何体(使用SV_RenderTargetArrayIndex),或使用提供同类功能的特定于供应商的扩展。

您可能会发现,查看使用Direct3D 10进行cubemap渲染的传统示例非常有用。Direct3D 10非常直接地映射到DX11。