我正在尝试编写一个与用于 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/Unicorn 有问题?
作为说明,我已经尝试过
atomicMin(minDepth, 0)
这也产生了一个完全白色的图像,这让我非常怀疑到底发生了什么。