Directx 如何重置标记为D3D11\u buffer\u UAV\u flag\u计数器的缓冲区
我试图使用一个无人机缓冲区,其标志是像素着色器中的D3D11\u buffer\u UAV\u flag\u COUNTER。对于发送到管道的每个像素,缓冲区将使用Directx 如何重置标记为D3D11\u buffer\u UAV\u flag\u计数器的缓冲区,directx,hlsl,directx-11,Directx,Hlsl,Directx 11,我试图使用一个无人机缓冲区,其标志是像素着色器中的D3D11\u buffer\u UAV\u flag\u COUNTER。对于发送到管道的每个像素,缓冲区将使用IncrementCounter()增加计数器,这在第一帧中效果良好 然而,在第二帧中,计数器是在第一帧的基础上添加的。很明显,它将在几帧之后溢出。 我曾尝试使用ClearUnorderedAccessViewUint()函数(无用)或在计算着色器中执行以下操作: [numthreads(1,1,1)] void ResetCS(
IncrementCounter()
增加计数器,这在第一帧中效果良好
然而,在第二帧中,计数器是在第一帧的基础上添加的。很明显,它将在几帧之后溢出。
我曾尝试使用ClearUnorderedAccessViewUint()
函数(无用)或在计算着色器中执行以下操作:
[numthreads(1,1,1)]
void ResetCS()
{
while(FLBufferUAV.DecrementCounter());
}
但是,对于每一帧,计数器的总和将超过10^6,这是缓慢的。
顺便问一下,有人用过effect11Frame吗?我还有一个问题
答案:
我已经找到重置计数器的方法。OMSetRenderTargetsAndUnorderedAccessViews()的最后一个参数用于初始化计数器值。
我没有发现这个问题,因为我使用effect11Frame来简化代码。
但是,OMSetRenderTargetsAndUnorderedAccessViews()
函数隐藏在effect11Frame中。我不知道是应该重写它还是放弃effect11Frame。在我看来,这些信息很有用。也许你应该考虑加强你自己的编辑和回答,而不是把答案放在问题上。谢谢你的建议。这是我第一次问这个问题。如果你使用fx framework,你可以使用D3D11的“保持”、“渲染”、“目标”和“深度”模具选项调用OMSEtrenderTargetsandUnorderedAccessView,然后在计数器中使用0重新应用你的uav(你需要在ApplyPass之后执行)。另一个选择,因为您有effects11源代码,是在UAV变量类型中添加计数器支持(如果您愿意的话,可以随时使用)。谢谢。这是一个有效的方法!但是如果我使用fx框架,当我使用PIXWin调试模式时会出现一些问题。也许我的fx框架版本太低了。