私は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に割り当てる/転送する方法です。
これを行う前に、メモリバリアが必要です。コンピューティングシェーダは、メモリを使わずにメモリをリードバックしようとする前に、実行が完了するとは限りません。 –
お返事ありがとうございます。これは私の問題を解決しました。 – alpacacapla