gpt4 book ai didi

directx-11 - 一次渲染到完整的 3D 渲染目标

转载 作者:行者123 更新时间:2023-12-04 21:13:47 26 4
gpt4 key购买 nike

使用 DirectX 11,我创建了一个可以绑定(bind)为渲染目标的 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);

我现在想更新整个渲染目标并用像素着色器中生成的程序数据填充它,类似于使用“全屏 channel ”更新 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 中是否可行,或者我是否必须按照 here 的描述渲染到体积纹理的各个切片? ?

最佳答案

这是一些使用管道版本执行的示例代码。您基本上批处理 N 个三角形并使用几何着色器将每个实例路由到一个体积切片。

struct VS_OUTPUT
{
float4 position : SV_Position;
float2 uv: TexCoord;
uint index: SLICEINDEX;
};

VS_OUTPUT main( uint vertexID : SV_VertexID, uint ii : SV_InstanceID )
{
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);
result.index= ii;
return result;
}

现在您需要使用 3 个顶点和 N 个实例调用 DrawInstanced,其中 N 是您的体积切片数

然后将三角形分配给 GS,如下所示:
struct psInput
{
float4 pos : SV_POSITION;
float2 uv: TEXCOORD0;
uint index : SV_RenderTargetArrayIndex; //This will write your vertex to a specific slice, which you can read in pixel shader too
};

[maxvertexcount(3)]
void GS( triangle VS_OUTPUT input[3], inout TriangleStream<psInput> gsout )
{
psInput output;
for (uint i = 0; i < 3; i++)
{
output.pos = input[i].pos;
output.uv = input[i].uv;
output.index= input[0].index; //Use 0 as we need to push a full triangle to the slice
gsout.Append(output);
}
gsout.RestartStrip();
}

现在您可以访问像素着色器中的切片索引:
float4 PS(psInput input) : SV_Target
{
//Do something with uvs, and use slice input as Z
}

计算着色器版本(不要忘记为您的体积创建 UAV),这里的 numthreads 是完全任意的
[numthreads(8,8,8)]
void CS(uint3 tid : SV_DispatchThreadID)
{
//Standard overflow safeguards

//Generate data using tid coordinates
}

现在你需要调用 dispatch with
宽度/8,高度/8,深度/8

关于directx-11 - 一次渲染到完整的 3D 渲染目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29124668/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com