使用 DirectX 11,我创建了一个可以绑定为渲染目标的 3D 体积纹理:
D3D11_TEXTURE3D_DESC texDesc3d;
// ...
texDesc3d.Usage = D3D11_USAGE_DEFAULT;
texDesc3d.BindFlags = D3D11_BIND_RENDER_TARGET;
// Create volume texture and views
m_dxDevice->CreateTexture3D(&texDesc3d, nullptr, &m_tex3d);
m_dxDevice->CreateRenderTargetView(m_tex3d, nullptr, &m_tex3dRTView);
我现在想更新整个渲染目标并用像素着色器中生成的程序数据填充它,类似于使用“全屏通道”更新 2D 渲染目标。生成数据所需的一切都是相关像素的 UVW 坐标。
对于 2D,可以构建一个简单的渲染全屏三角形的顶点着色器:
struct VS_OUTPUT
{
float4 position : SV_Position;
float2 uv: TexCoord;
};
// input: three empty vertices
VS_OUTPUT main( uint vertexID : SV_VertexID )
{
VS_OUTPUT result;
result.uv = float2((vertexID << 1) & 2, vertexID & 2);
result.position = float4(result.uv * float2(2.0f, -2.0f) + float2(-1.0f, 1.0f), 0.0f, 1.0f);
return result;
}
我很难思考如何将这一原则用于 3D。这在 DirectX 11 中是否可行,或者我是否必须按照此处所述渲染到体积纹理的各个切片?