如何解决每次调用 GLSL 计算着色器都会在没有竞争条件的情况下写入 SSBO 变量
我正在尝试编写一个简单的计算着色器,它将接收一组点以及定义一条线的两个点。我想为数组中的每个点调用着色器,并行计算所有距离,然后让每次调用等待它在繁忙循环中更新最远点数据。我的计算着色器看起来像这样
#version 430 core
layout(std430,binding = 0) buffer BufferObjectIn {
vec3 data[];
} pointData;
layout(std430,binding = 1) buffer BufferObjectOut{
uint inLeftIndex;
uint inRightIndex;
uint inPointCount;
int outFarthestIndex;
float outFarthestDist;
int mutex;
} ssbo;
layout(local_size_x = 64) in;
float signedDistance(vec3 linePoint1,vec3 linePoint2,vec3 p) {
return (linePoint2.x - linePoint1.x) * (linePoint1.y - p.y) - (linePoint2.y - linePoint1.y) * (linePoint1.x - p.x);
}
void main(void) {
uint threadIndex = gl_GlobalInvocationID.x;
if (threadIndex >= ssbo.inPointCount) {
return;
}
vec3 leftPoint = pointData.data[ssbo.inLeftIndex];
vec3 rightPoint = pointData.data[ssbo.inRightIndex];
vec3 thisPoint = pointData.data[threadIndex];
float dist = signedDistance(leftPoint,rightPoint,thisPoint);
if (dist < 0){
return;
}
do {
lock = atomicCompSwap(ssbo.mutex,1);
} while (lock == 0);
barrier();
if (dist > ssbo.outFarthestDist) {
ssbo.outFarthestDist = dist;
ssbo.outFarthestIndex = int(threadIndex);
}
ssbo.mutex = 0;
}
我发现即使我在同一组数据上运行我的应用程序也会显示不同的结果。我做错了什么吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。