首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何有效地计算一个颜色在整个像素着色阶段的使用时间?

如何有效地计算一个颜色在整个像素着色阶段的使用时间?
EN

Stack Overflow用户
提问于 2017-10-29 08:20:37
回答 1查看 213关注 0票数 2

我正在考虑在像素shader.Here中实现它,这是我代码的一部分:

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

代码语言:javascript
复制
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;

然后我把它传给像素着色器

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

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

代码语言:javascript
复制
Texture1D RandomTex : register(t0);

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

我想使用该颜色表中每种颜色的alpha通道来计算整个像素着色阶段所用颜色的次数.

我想修改像素着色器中的颜色表,就像代码below.But一样,这似乎是不可行的。

代码语言:javascript
复制
RandomTex[Index].a = RandomTex[Index].a + 1;

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

我想过的所有方法都需要在cpu上做一些额外的计数工作,因为我发现很难像x++这样的操作(可能是gpu上的一些并行问题),除了那些我认为需要将纹理渲染两次的方法,这可能比直接在cpu上计算要慢。

我正在深入研究这个长期的time.But,没有use.Please的帮助,或者试图给出一些如何实现这一点的想法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-16 16:20:45

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

以下是修改后的HLSL代码

代码语言:javascript
复制
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 Values4,因此只有值将用作明确的值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46998180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档