簡體   English   中英

計算着色器不寫入緩沖區嗎?

[英]Compute shader does not write to buffer?

我正在嘗試在計算着色器上進行剔除。 我的問題是我的原子計數器似乎沒有被着色器寫入,或者確實被寫入了,但是隨后被無效了?

Renderdoc表示它沒有數據,但是InstancesOut中有值(請參見底部圖片)

這是我的計算着色器:

#version 450
#extension GL_ARB_separate_shader_objects : enable
#extension GL_ARB_shading_language_420pack : enable

struct Indirect
{
    uint indexCount;
    uint instanceCount;
    uint firstIndex;
    uint vertexOffset;
    uint firstInstance;
};
struct Instance
{
    vec4 position;
};

layout (binding = 0, std430) buffer IndirectDraws
{
    Indirect indirects[];
};

layout (binding = 1) uniform UBO 
{
    vec4 frustum[6];
} ubo;

layout (binding = 2, std140) readonly buffer Instances
{
    Instance instances[];
};

layout (binding = 3, std140) writeonly buffer InstancesOut
{
    Instance instancesOut[];
};
layout (binding = 4) buffer Counter
{
    uint counter;
};

bool checkFrustrum(vec4 position, float radius)
{
    for(uint i = 0; i < 6; i++)
        if(dot(position, ubo.frustum[i]) + radius < 0.0)
            return false;
    return true;
}
layout (local_size_x = 1) in;
void main()
{
    uint i = gl_GlobalInvocationID.x + gl_GlobalInvocationID.y * gl_NumWorkGroups.x * gl_WorkGroupSize.x;

    uint instanceCount = 0;
    if(i == 0)
        atomicExchange(counter, 0);


    for(uint x = 0; x < indirects[i].instanceCount; x++)
    {
        vec4 position = instances[indirects[i].firstInstance + x].position;
        //if(checkFrustrum(position, 1.0))
        //{
            instancesOut[atomicAdd(counter, 1)].position = position;
            instanceCount++; 
        //}
    }
    //indirects[i].instanceCount = instanceCount;
    indirects[i].instanceCount = i; // testing
}

RenderDoc中的緩沖區圖片

謝謝你的幫助!

太多的事情似乎使您誤解了同步和工作組的工作方式。

在計算着色器中,原子可讓您在工作組之間進行同步。 但是,無法保證工作組的執行順序,因此atomicExchange(counter,0); 不保證在其他工作組執行之前發生。 錯誤#1?

工作組大小為1會浪費大量資源,尤其是在您要花費跨工作組同步的情況下。 工作組中的同步總是最快的,它允許您實際使用gpu資源(大多數GPU被組織到包含SIMD處理器的模塊中,這些模塊只能一次處理一個工作組上的執行。如果您僅使用大小為1的工作組, ,這些處理器中的31/32或63/64處於閑置狀態({caveat,這些處理器中的大多數可以同時在內存中保存多個工作組,但執行僅在任何給定時刻進行一次))。 此外,在工作組中,您可以將執行與障礙同步,以確保操作順序。 錯誤2?

如果只添加一個原子數,則CounterCounterIncrement可能是更好的指令。

在您的特定應用程序中,instancesOut的答案為什么錯誤? 在我看來,每個輸入最終都在輸出中,沒有保證的順序(因為不能保證工作組按特定的順序執行,即並行執行的方式),這在我看來似乎是對的。 如果您希望按順序排列它們,請根據調用ID進行計算?

至於為什么renderDoc不顯示計數器值,我不知道,如果映射正確,它應該有一個值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM