Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl GLD未写入缓冲区_Opengl_Transform Feedback - Fatal编程技术网

Opengl GLD未写入缓冲区

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

我尝试使用变换功能创建一个粒子系统,因此有2个变换缓冲区和2个阵列缓冲区,使用乒乓球切换

我的着色器很简单,只需保持“添加源位置”

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