如何有效计算整个像素着色器阶段使用一种颜色的次数?

蓝天

我正在考虑在像素着色器中实现它。这是我的代码的一部分:

首先,我创建一个Texture1D作为颜色表

D3D11_TEXTURE1D_DESC t1d;
t1d.Width = ModelInfo::ColorCount;
t1d.ArraySize = 1;
t1d.MipLevels = 1;
t1d.CPUAccessFlags = 0;
t1d.MiscFlags = 0;
t1d.Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
t1d.Usage = D3D11_USAGE_DEFAULT;
t1d.BindFlags = D3D11_BIND_SHADER_RESOURCE;

ZeroMemory(&InitData, sizeof(InitData));
InitData.pSysMem = ModelInfo::Colors;

hr = m_D3DDevice->CreateTexture1D(&t1d, &InitData, &m_ColorTable);
if (FAILED(hr))
    return hr;

D3D11_SHADER_RESOURCE_VIEW_DESC viewDesc;
viewDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
viewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE1D;
viewDesc.Texture1D.MostDetailedMip = 0;
viewDesc.Texture1D.MipLevels = 1;
hr = m_D3DDevice->CreateShaderResourceView(m_ColorTable, &viewDesc, &m_ColorResView);
if (FAILED(hr))
    return hr;

然后将其传递给Pixel着色器

m_ImmediateContext->PSSetShaderResources(0, 1, &m_ColorResView);

在像素着色器中,我使用此颜色表,如下所示:

Texture1D RandomTex : register(t0);

float4 PS(VS_OUTPUT Input, uint Primitive : SV_PrimitiveID) : SV_Target
{
    uint Index = Primitive % ColorCount.x;
    return RandomTex[Index];
}

我想使用此颜色表中每种颜色的Alpha通道来计算整个Pixel Shader Stage期间使用的颜色多少次...

我想像下面的代码一样修改像素着色器中的颜色表,但这似乎不可行。

RandomTex[Index].a = RandomTex[Index].a + 1;

我一直在寻找一种有效计数颜色的方法,而不是在纹理上渲染颜色并使用c ++在cpu上计数。

我认为所有的方法都必须对cpu进行额外的计数工作,因为我发现很难执行x ++之类的操作(可能对gpu可能存在一些并行问题),除了那些我认为需要两次渲染纹理的方法外,这可能是较慢地直接计算在CPU上。

我已经研究了很长时间,但是没有用,请帮忙或尝试给出一些想法来实现这一目标。

卡特彼勒

您可以将较小的写缓冲区附加到像素着色器(具有无序视图),并在像素着色器中使用原子操作。

这是修改后的HLSL代码

Texture1D RandomTex : register(t0);

RWStructuredBuffer<uint> RWColorCountData : register(u1);

float4 PS(VS_OUTPUT Input, uint Primitive : SV_PrimitiveID) : SV_Target
{
    uint Index = Primitive % ColorCount.x;
    InterlockedAdd(RWColorCountData[Index], 1);
    return RandomTex[Index];
}

在这里,我使用StructuredBuffer,但如果愿意,也可以使用ByteAddressBuffer。另请注意,资源已附加到寄存器u1,因为第一个插槽仍由渲染目标占用。

您的写缓冲区应该与1d纹理具有相同的元素计数,并且需要使用OMSetRenderTargetsAndUnorderedAccessViews附加到管道(在渲染目标的顶部)

每帧,您还需要将缓冲区清除为0(如果需要),否则值将随着时间增加,为此,您可以使用ClearUnorderedAccessViewUint

请注意,由于您使用的是uint缓冲区,并且该函数需要UINT Values [4],因此仅将Values [0]用作清除值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从一种颜色到另一种百分比

计算片段着色器中一行的平均值(OpenGL ES 2.0)

TableView每隔一个单元格一种颜色

我应该如何在 Selenium 中以一种方法检查 5 个有效登录?

D3 热图 - 色标仅显示一种颜色

如何在python中打印形状?寻找一种不同的、更有效的方式

有没有一种有效的方法来计算比特流中 1 的密度?

使用一种方法的结果以另一种方法计算价格

如何在Javascript中编写一种有效的方式来处理匹配模式?

如何有效且非破坏性地为地理执行着色器分配?

有没有一种有效的方法可以在 VBA 集合中存储表头?

如果 json 代码在 Visual Studio 代码中很长,为什么它有另一种颜色?

在 Pandas 中使用 iterrows 的有效方法(另一种方式)

我的程序不断将整个数组的颜色更改为一种颜色,而不是每个颜色都不同

是否有一种有效的方法可以在 JavaFX 中的多个阶段刷新多个 TableView?

如何仅使用一种方法制作此计算器?

“错误:必须从色调调色板中请求至少一种颜色”当颜色已经说明时

寻找一种有效的方法来返回字符串的一部分

如何在 ALBEDO 上传递着色器颜色

改变统一同心圆着色器的颜色

ImageMagick - 将图像的白色转换为另一种颜色,保持透明度并排除黑色

如何计算一种颜色与多少白色混合以创建另一种颜色?

使用一种有效的方式,根据给定顺序的参数调用 python 函数,以最大限度地减少 if-else 语句的使用

是否有一种 O(n) 方法可以在不使用计数器的情况下找到列表中重复次数最多的项目

如何从 JSON 文件中检查“Process”:false 那么数据数组行应该是 angular 11 中的另一种颜色

OpenGL - 如何通过着色器以像素化方式为对象着色?

CSS 类 last-of-type 子级为另一种颜色

我正在制作一个由内而外的东西。但只有最后一种颜色有效。有什么解决办法吗?

收到此错误错误:必须从色调调色板中请求至少一种颜色

Julia 仅用一种颜色显示烛台图