【发布时间】:2018-07-26 03:42:38
【问题描述】:
我正在尝试对计算着色器进行剔除。 我的问题是我的原子计数器似乎没有被着色器写入,或者它确实被写入但随后被无效?
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
}
Picture of buffers in RenderDoc
感谢您的帮助!
【问题讨论】:
-
您是否尝试在 atomicExchange 之后设置屏障。我担心在正确初始化计数器之前,着色器的其他调用会继续进行。
-
我现在尝试使用障碍但得到相同的结果:(
-
屏障();只在一个工作组内同步,因为他的工作组大小为 1,它什么也不做(local_size_x = 1)。
标签: c++ graphics glsl shader vulkan