从计算着色器取回数据
Getting data back from compute shader
我是 opengl 的新手,我发现自己处于需要从计算着色器获取数据的情况,但由于我错过了一些关键知识,所以我无法让它工作。所以我就来了,也许你可以给我一些提示。
假设我有一个这样的计算着色器:
#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");
}
其中姓名 = "TriangleBuffer"
和索引 = 9
我知道如何访问我在应用程序中创建的 ssbo。我不知道的是如何 assign/transfer TriangeBuffer 数据进入我的 ssbo。
添加glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 9, ssbo);
此外,当我从 SSBO
获取数据时,我会做 glMapBufferRange
和 memcpy
我需要的东西。
我是 opengl 的新手,我发现自己处于需要从计算着色器获取数据的情况,但由于我错过了一些关键知识,所以我无法让它工作。所以我就来了,也许你可以给我一些提示。
假设我有一个这样的计算着色器:
#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");
}
其中姓名 = "TriangleBuffer" 和索引 = 9
我知道如何访问我在应用程序中创建的 ssbo。我不知道的是如何 assign/transfer TriangeBuffer 数据进入我的 ssbo。
添加glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 9, ssbo);
此外,当我从 SSBO
获取数据时,我会做 glMapBufferRange
和 memcpy
我需要的东西。