1
私はOpenGLを使用している小粒子システムで作業しています。
問題は、計算シェーダの位置を更新しても動作しないように見えることです。SSBOの書き込みが見えない
は、ここでは、コードです:
バッファ
struct ParticleInfo { Vec4f position; // w: s coordinate Vec4f normal; // w: t coordinate float materialIndex; Vec3f oldPosition; };
初期バッファコンピュートシェーダ
とglGenVertexArrays(1, &mParticleVAO); glBindVertexArray(mParticleVAO); glGenBuffers(1, &mParticleVBO); glBindBuffer(GL_ARRAY_BUFFER, mParticleVBO); glBufferData(GL_ARRAY_BUFFER, sizeof(ParticleInfo) * mNumParticles, particleData.data(), GL_STATIC_DRAW); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, sizeof(ParticleInfo), (void*)NULL); glEnableVertexAttribArray(1); glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, sizeof(ParticleInfo), (void*)(NULL + sizeof(Vec4f))); glEnableVertexAttribArray(2); glVertexAttribPointer(2, 1, GL_FLOAT, GL_FALSE, sizeof(ParticleInfo), (void*)(NULL + 2*sizeof(Vec4f))); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0);
更新バッファ
シェーダコード
#version 450 layout(local_size_x = 64) in; struct ParticleInfo { vec4 position; // modify only the position; vec4 normal; float materialIndex; vec3 oldPosition; }; struct Attractor { vec3 position; float mass; }; layout(binding = 0, std430) buffer ParticleArray { ParticleInfo particles[]; }; layout(binding = 1, std430) buffer AttractorArray { Attractor attractors[]; }; uniform int numParticles; vec3 verlet(in vec3 a, in vec3 x, in vec3 xOld, in float dt) { return 2.0 * x - xOld + a * dt*dt; } void main() { const int PARTICLES_PER_THREAD = 8; int index = int(gl_LocalInvocationIndex)*PARTICLES_PER_THREAD; if (index >= numParticles) return; Attractor attr = attractors[0]; const float G = 9.8; for (int i = 0; i < PARTICLES_PER_THREAD; ++i) { particles[i+index].position = vec4(0.0); particles[i+index].normal = vec4(0.0); particles[i+index].oldPosition = vec3(0.0); } }
作業していない:私は、パーティクルがすべて0になるように設定したい同じ初期位置にとどまっていることを意味します。 –
同じ位置にいることをどのように知っていますか?レンダリングしていて、移動しているのを見ていませんか? –
粒子は特定の形状に似ています。それらはすべてメッシュの三角形からサンプリングされます。 –