找到数组中的最大浮点数

时间:2018-05-19 18:40:30

标签: opengl glsl shader opengl-4 compute-shader

我有一个计算着色器程序,用于查找float数组中的最大值。它使用简化(比较两个值并将较大的值保存到输出缓冲区)。 现在我不太确定如何从Java代码(使用jogamp)运行该程序。在display()方法中,我运行程序一次(每次使用输入SSBO中的减半数组=上一次迭代的结果)并在具有结果的数组只有一个项目 - 最大值时完成此操作。

这是正确的方法吗?每次在display()方法创建和绑定输入和输出SSBO时,运行着色器程序然后检查返回了多少项?

Java代码:

    FloatBuffer inBuffer = Buffers.newDirectFloatBuffer(array);
    gl.glBindBuffer(GL3ES3.GL_SHADER_STORAGE_BUFFER, buffersNames.get(1));
    gl.glBufferData(GL3ES3.GL_SHADER_STORAGE_BUFFER, itemsCount * Buffers.SIZEOF_FLOAT, inBuffer,
            GL3ES3.GL_STREAM_DRAW);
    gl.glBindBufferBase(GL3ES3.GL_SHADER_STORAGE_BUFFER, 1, buffersNames.get(1));

    gl.glDispatchComputeGroupSizeARB(groupsCount, 1, 1, groupSize, 1, 1);

    gl.glMemoryBarrier(GL3ES3.GL_SHADER_STORAGE_BARRIER_BIT);

    ByteBuffer output = gl.glMapNamedBuffer(buffersNames.get(1), GL3ES3.GL_READ_ONLY);

着色器代码:

#version 430
#extension GL_ARB_compute_variable_group_size : enable
layout (local_size_variable) in;

layout(std430, binding = 1) buffer MyData {
    vec4 elements[];
} data;

void main() {
    uint index = gl_GlobalInvocationID.x;

    float n1 = data.elements[index].x;
    float n2 = data.elements[index].y;
    float n3 = data.elements[index].z;
    float n4 = data.elements[index].w;

    data.elements[index].x = max(max(n1, n2), max(n3, n4));
}

0 个答案:

没有答案