OpenGL Compute着色器原子操作

时间:2013-12-13 12:30:55

标签: opengl glsl atomic compute-shader deferred-rendering

我正在尝试编写一个延迟平铺渲染器,与用于BF3的一个DICE一致,我要么不理解我在做什么,要么GLSL在我身上拉快速。

内核的第一部分是计算每个tile的最大和最小深度,我正在使用此代码。

#version 430

#define MAX_LIGHTS_PER_TILE 1024
#define WORK_GROUP_SIZE 16

struct PointLight
{
    vec3 position;
    float radius;
    vec3 color;
    float intensity;
};

layout (binding = 0, rgba32f) uniform writeonly image2D outTexture;
layout (binding = 1, rgba32f) uniform readonly image2D normalDepth;
layout (binding = 2, rgba32f) uniform readonly image2D diffuse;
layout (binding = 3, rgba32f) uniform readonly image2D specular;
layout (binding = 4, rgba32f) uniform readonly image2D glowMatID;

layout (std430, binding = 5) buffer BufferObject
{
    PointLight pointLights[];
};

uniform mat4 inv_proj_view_mat;

layout (local_size_x = WORK_GROUP_SIZE, local_size_y = WORK_GROUP_SIZE) in;

shared uint minDepth = 0xFFFFFFFF;
shared uint maxDepth = 0;


void main()
{
        ivec2 pixel = ivec2(gl_GlobalInvocationID.xy);

        //SAMPLE ALL SHIT
        vec4 normalColor = imageLoad(normalDepth, pixel);

        float d = (normalColor.w + 1) / 2.0f;

        uint depth = uint(d * 0xFFFFFFFF);

        atomicMin(minDepth, depth);
        atomicMax(maxDepth, depth);

        groupMemoryBarrier();

        imageStore(outTexture, pixel, vec4(float(float(minDepth) / float(0xFFFFFFFF))));
}

如果我为每个片段绘制深度,场景看起来像这样。

enter image description here

尝试绘制minDepth会产生纯白色屏幕,并且绘制maxDepth会产生黑屏。我的内存管理/原子功能是否有问题,或者我的驱动程序/ GPU / Unicorn是否被剔除了?

作为一个说明,我试过了

atomicMin(minDepth, 0)

这也产生了一个完全白色的图像,这使我对实际发生的事情非常怀疑。

1 个答案:

答案 0 :(得分:1)

结果使用barrier()而不是groupMemoryBarrier()解决了这个问题。为什么,我不知道如果有人能够启发我,那将非常感激。