2016-11-13 81 views
0

我对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"); 
} 

其中name = “TriangleBuffer” 和指数= 9

我知道如何访问我在应用程序中创建的ssbo。我不知道如何将TriangeBuffer数据分配/传输到我的ssbo中。

回答

1

添加glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 9, ssbo);

此外,当我从SSBO小号获取数据,然后我做glMapBufferRangememcpy的东西,我需要的。

+0

对于它的价值,在做这件事之前还需要一个记忆障碍。在您尝试无内存地读回内存之前,计算着色器不保证运行完成。 –

+0

谢谢你们的回答。这解决了我的问题。 – alpacacapla