Opengl GLD未写入缓冲区
我尝试使用变换功能创建一个粒子系统,因此有2个变换缓冲区和2个阵列缓冲区,使用乒乓球切换 我的着色器很简单,只需保持“添加源位置”Opengl GLD未写入缓冲区,opengl,transform-feedback,Opengl,Transform Feedback,我尝试使用变换功能创建一个粒子系统,因此有2个变换缓冲区和2个阵列缓冲区,使用乒乓球切换 我的着色器很简单,只需保持“添加源位置” gs_Position = vs_Position[0] + vec3(1, 0, 1); 如果使用glDrawTransformFeedback(),2缓冲区将保留原始数据,而不是更改。但如果切换到glDrawArrays(),则乒乓球有效,位置值保持增加 初始代码 shader.setupShaderFromFile(GL_VERTEX_SHADER, "fe
gs_Position = vs_Position[0] + vec3(1, 0, 1);
如果使用glDrawTransformFeedback(),2缓冲区将保留原始数据,而不是更改。但如果切换到glDrawArrays(),则乒乓球有效,位置值保持增加
初始代码
shader.setupShaderFromFile(GL_VERTEX_SHADER, "feedback.vert");
shader.setupShaderFromFile(GL_GEOMETRY_SHADER, "feedback.geom");
const GLchar* feedbackVaryings[] = { "gs_Position", "gs_Velocity" };
glTransformFeedbackVaryings(shader.getProgram(), 2, feedbackVaryings, GL_INTERLEAVED_ATTRIBS);
shader.linkProgram();
glGenTransformFeedbacks(2, tfo);
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
Particle* p = new Particle[2];
p[0].position = glm::vec3(1, 2, 3);
p[1].position = glm::vec3(2, 3, 4);
glGenBuffers(2, bfo);
glBindBuffer(GL_ARRAY_BUFFER, bfo[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(Particle)*2, p, GL_STATIC_DRAW);
glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfo[0]);
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, bfo[0]);
glBindBuffer(GL_ARRAY_BUFFER, bfo[1]);
glBufferData(GL_ARRAY_BUFFER, sizeof(Particle)*2, nullptr, GL_STATIC_READ);
glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfo[1]);
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, bfo[1]);
执行变换
int from = pid;
int to = (pid + 1) % 2;
glEnable(GL_RASTERIZER_DISCARD);
glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfo[to]);
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, bfo[to]);
shader.begin();
glBindBuffer(GL_ARRAY_BUFFER, bfo[from]);
{
GLint inputAttrib = shader.getAttributeLocation("a_Position");
glEnableVertexAttribArray(inputAttrib);
glVertexAttribPointer(inputAttrib, 3, GL_FLOAT, GL_FALSE, sizeof(Particle), (void*)offsetof(Particle, position));
}
{
GLint inputAttrib = shader.getAttributeLocation("a_Velocity");
glEnableVertexAttribArray(inputAttrib);
glVertexAttribPointer(inputAttrib, 3, GL_FLOAT, GL_FALSE, sizeof(Particle), (void*)offsetof(Particle, velocity));
}
glBeginTransformFeedback(GL_POINTS);
//glDrawArrays(GL_POINTS, 0, 2);
glDrawTransformFeedback(GL_POINTS, tfo[from]);
glEndTransformFeedback();
shader.end();
glDisable(GL_RASTERIZER_DISCARD);
glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);
“我尝试使用变换功能创建粒子系统”请不要对粒子系统使用变换反馈,除非您无法使用计算着色器。变换反馈可以更轻松地发射和破坏粒子@Nicolabolas