0

BF3 に使用される DICE に合わせて遅延タイル レンダラーを作成しようとしていますが、自分が何をしているのか理解していないか、GLSL が高速なレンダラーを引っ張っています。

カーネルの最初の部分は、タイルごとの最大深度と最小深度を計算することです。これは、このコードで行っています。

#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))));
}

断片ごとに奥行きを描くとこんな感じ。

ここに画像の説明を入力

minDepth を描画しようとすると真っ白な画面になり、maxDepth を描画すると黒い画面が生成されます。メモリ管理/アトミック関数が間違っていますか、それともドライバー/GPU/ユニコーンが壊れていますか?

参考までに、試してみました

atomicMin(minDepth, 0)

また、完全に白い画像が生成されるため、実際に何が起こっているのか非常に疑わしくなります.

4

1 に答える 1