Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 从计算着色器获取数据_Opengl_Opengl 4_Compute Shader_Shader Storage Buffer - Fatal编程技术网

Opengl 从计算着色器获取数据

Opengl 从计算着色器获取数据,opengl,opengl-4,compute-shader,shader-storage-buffer,Opengl,Opengl 4,Compute Shader,Shader Storage Buffer,我是opengl的新手,我发现自己需要从compute shader中获取数据,但由于缺少一些关键知识,我无法让它工作。所以我来这里,也许你能给我一些提示 假设我有这样一个计算着色器: #version 430 core struct rmTriangle { vec4 probeCenter; vec4 triangles[3]; }; layout(std430, binding=9) buffer TriangleBuffer { rmTriangle triangles[]

我是opengl的新手,我发现自己需要从compute shader中获取数据,但由于缺少一些关键知识,我无法让它工作。所以我来这里,也许你能给我一些提示

假设我有这样一个计算着色器:

#version 430 core
struct rmTriangle
{
  vec4 probeCenter;
  vec4 triangles[3];
};

layout(std430, binding=9) buffer TriangleBuffer {
  rmTriangle triangles[];
}trBuffer;

//other uniforms, variables and stuff

void main()
{
  //here I make some computations and assign values to the
  //trBuffer's triangles array
}
现在我想在我的应用程序中使用trBuffer的数据。 我被告知要制作一个着色器存储缓冲区 这就是我所做的:

private int ssbo;
gl.glGenBuffers(1, &ssbo);
gl.glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo);
//just allocate enough amount of memory
gl.glBufferData(GL_SHADER_STORAGE_BUFFER, MAX_TRIANGLES * SIZEOF_TRIANGLE, null, GL_DYNAMIC_READ);
那么这个,

int blockIndex = gl.glGetProgramResourceIndex(program,GL_SHADER_STORAGE_BLOCK, name.getBytes(), 0);
if (blockIndex != GL_INVALID_INDEX) {
    gl.glShaderStorageBlockBinding(program, blockIndex, index);
} else {
    System.err.println("Warning: binding " + name + " not found");
}
其中name=“TriangleBuffer” 指数=9

我知道如何访问我在应用程序中创建的ssbo。我不知道的是如何将三角形缓冲区数据分配/传输到我的ssbo中。

添加
glBindBufferBase(GL\u SHADER\u STORAGE\u BUFFER,9,ssbo)


另外,当我从
SSBO
s获取数据时,我会执行
glMapBufferRange
memcpy
我需要的东西。

为了实现它的价值,在执行此操作之前,您还需要一个内存屏障。在您尝试在没有计算着色器的情况下读取内存之前,不能保证计算着色器能够运行到完成。谢谢大家的回答。这解决了我的问题。