2016-11-13 121 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