我想要一个在输出缓冲区中写入 1 的计算着色器。我编译着色器并将其附加到程序中,然后调用 glDispatchCompute() 函数并等待计算着色器结束。我现在唯一的问题是我不确定如何将输出的 SSBO 转换为浮点数组。
检索代码
public float[] useProgram(int x_size, int y_size, int z_size){
this.group_x_size = (int)Math.ceil(x_size/100);
this.group_y_size = (int)Math.ceil(y_size/100);
this.group_z_size = (int)Math.ceil(z_size/100);
float[] data = new float[x_size];
FloatBuffer buffer = BufferUtils.createFloatBuffer(x_size);
buffer.put(data);
int ssbo = GL15.glGenBuffers();// creates empty VBO as an object and stores it in OpenGl memory
GL15.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, ssbo);
GL43.glBindBufferBase(GL43.GL_SHADER_STORAGE_BUFFER, 0, ssbo);
GL15.glBufferData(GL43.GL_SHADER_STORAGE_BUFFER,buffer,GL15.GL_DYNAMIC_DRAW);
GL15.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, 0);
GL20.glUseProgram(computeProgram);//start the shader program
GL43.glDispatchCompute(group_x_size, 1, 1);
GL43.glMemoryBarrier(GL43.GL_BUFFER_UPDATE_BARRIER_BIT );
GL43.glBindBufferBase(GL43.GL_SHADER_STORAGE_BUFFER, 0, 0);
GL15.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, ssbo);
float[] values;
//Convert SSBO to a float array here
System.out.println(Arrays.toString(values));
GL15.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, 0);
return values;
}
计算着色器
#version 430 core
layout (local_size_x = 100) in;
layout(std430, binding=0) buffer Pos{
float Position[];
};
void main(){
Position[gl_GlobalInvocationID.x] = 1.0;
}
我已经尝试解决这个问题好几个小时了,但我仍然找不到任何线程来回答如何将 glMapBuffer 转换为 float []。我不确定是因为我的代码错误还是有更好的方法来做到这一点。这是使用 LWJGL 用 java 编写的。