5

現在、計算シェーダーを使用してパーティクル システムに取り組んでいます。すべてのパーティクルをシェーダー ストレージ バッファーに入れます。パーティクルには、現在の位置と前の位置の 2 つの頂点が含まれます。

struct Particle{
    glm::vec4   _currPosition;
    glm::vec4   _prevPosition;
};

コンピューティング シェーダーをディスパッチした後、すべてのパーティクルをシェーダー ストレージ バッファーから直接描画したいと考えています。だからこれは私がすることです:

glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, shaderStorageBufferID);
_shaderManager->useProgram("computeProg");
glDispatchCompute((_numParticles/WORK_GROUP_SIZE)+1, 1, 1);
glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT);
_shaderManager->useProgram("shaderProg");
glBindBuffer(GL_ARRAY_BUFFER, shaderStorageBufferID);
glVertexPointer(4,GL_FLOAT, sizeof(glm::vec4), (GLvoid*)0);
glEnableClientState(GL_VERTEX_ARRAY);
glDrawArrays(GL_POINTS, 0, _numParticles);
glDisableClientState(GL_VERTEX_ARRAY);

問題は、画面に _numParticles が表示されているのに、半分がパーティクル構造の _prevPosition 属性でレンダリングされることです。つまり、1 つのパーティクルが画面上に描画される 2 つの頂点として解釈されます。しかし、すべてのパーティクル構造で _prevPosition 属性をスキップしてもらいたいのです。私の間違いはどこですか?

おそらく、shader-storage-buffer を初期化する方法が重要です。

GLuint shaderStorageBufferID;

glGenBuffers(1, &shaderStorageBufferID);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, shaderStorageBufferID);
glBufferData(GL_SHADER_STORAGE_BUFFER, numParticles*sizeof(Particle), NULL ,GL_STATIC_DRAW);
struct Particle* particles = (struct Particle*) glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, numParticles*sizeof(Particle), GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT);
for(int i = 0; i < numParticles; ++i){
    particles[i]._currPosition = glm::vec4(i, 0, 0.0, 1.0f);
    particles[i]._prevPosition = glm::vec4(i, 0, 1.0, 1.0f);
}
4

1 に答える 1

8

構造Particle体には 2 つvec4の が含まれています。計算シェーダーvec4、配列要素ごとに 2 つの を書き込みます。

しかし、この行:

glVertexPointer(4,GL_FLOAT, sizeof(glm::vec4), (GLvoid*)0);

vec4s の配列を渡すことを OpenGL に伝えます。あなたではない。すべての要素が2 つ vec4の s である配列を渡しています。そして、あなたは2番目のものをスキップしたい.

したがって、適切なストライドを提供することにより、OpenGL に次のように伝えます。

glVertexPointer(4, GL_FLOAT, sizeof(Particle), (GLvoid*)0);

ああ、ところで: あなたはまだ間違ったバリアを使用しています。コードがたまたま機能するからといって、それが保証されているわけではありません。すべてを正しく行っていない限り、非同期のロード/ストア操作は扱いにくい場合があります。

于 2012-10-05T20:36:44.973 に答える