2016-11-13 5 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"); 
} 

名= "TriangleBuffer" とインデックス= 9

私は自分のアプリケーションで作成したssboにアクセスする方法を知っています。私が知らないのは、TriangeBufferデータを私のssboに割り当てる/転送する方法です。

答えて

1

は私がSSBO Sからデータをフェッチするとき、私は私が必要glMapBufferRangememcpyものを行う、またglBindBufferBase(GL_SHADER_STORAGE_BUFFER, 9, ssbo);

を追加します。

+0

これを行う前に、メモリバリアが必要です。コンピューティングシェーダは、メモリを使わずにメモリをリードバックしようとする前に、実行が完了するとは限りません。 –

+0

お返事ありがとうございます。これは私の問題を解決しました。 – alpacacapla

関連する問題