【问题标题】:OpenGL Transform Feedback with dynamic Geometry具有动态几何的 OpenGL 变换反馈
【发布时间】:2017-02-25 17:04:30
【问题描述】:

我目前正在尝试使用几何着色器进行变换反馈。几何着色器取一个三角形,用它制作一个棱镜,并在它上面放一个四棱柱(把它想象成一个方尖碑,但只有 3 个而不是 4 个边)。

我使用一次变换反馈得到了正确的结果。但是我想用变换反馈创建额外的几何。我想为 Tetraeder 的每个三角形执行几何着色器过程。

第一次通过后的结果

第二次通过后的结果 因此,在第二遍中,黑色部分不是无限远,而是应该有另一个分支,你可以左右看到,但那个朝向相机。

我在这里做错了什么?我不确定如何处理两个顶点缓冲区对象不断增加的数据大小,我可能在那里做错了什么。帮助将不胜感激。

在主窗口循环之前转换反馈:

glUseProgram(transformShaderProgram);

glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, TBO);
glBindVertexArray(transformVAO);
glEnable(GL_RASTERIZER_DISCARD);

glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, tfQuery);
glBeginTransformFeedback(GL_TRIANGLES);
glDrawArrays(GL_TRIANGLES, 0, 3);
glEndTransformFeedback();
glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);
glDisable(GL_RASTERIZER_DISCARD);

GLuint numPrimitivesWritten = 0;
glGetQueryObjectuiv(tfQuery, GL_QUERY_RESULT, &numPrimitivesWritten);
printf("Number of PrimitivesWritten %i\n", numPrimitivesWritten);

在主窗口循环期间转换反馈:

glUseProgram(feedbackShaderProgram);
while (!glfwWindowShouldClose(window))
{
    glfwPollEvents();
    CalcDeltaTime();
    doMovement();

    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    if (doTransformFeedback && (currentNumberOfTransformFeedback < maxNumberOfTransformFeedback)) {
        glUseProgram(transformShaderProgram);

        glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, TBO);
        glBindVertexArray(feedbackVAO);
        glEnable(GL_RASTERIZER_DISCARD);

        glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, tfQuery);
        glBeginTransformFeedback(GL_TRIANGLES);
        glDrawArrays(GL_TRIANGLES, 0, numPrimitivesWritten * 5);
        glEndTransformFeedback();
        glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);
        glDisable(GL_RASTERIZER_DISCARD);

        GLuint numPrimitivesWritten2 = 0;
        glGetQueryObjectuiv(tfQuery, GL_QUERY_RESULT, &numPrimitivesWritten2);
        numPrimitivesWritten += numPrimitivesWritten2;

        doTransformFeedback = false;
        currentNumberOfTransformFeedback++;
        glUseProgram(feedbackShaderProgram);
    }
    glBindVertexArray(feedbackVAO);
    glDrawArrays(GL_TRIANGLES, 0, numPrimitivesWritten * 5 );
    glBindVertexArray(0);

    glfwSwapBuffers(window);
}

【问题讨论】:

    标签: c++ opengl geometry-shader transform-feedback


    【解决方案1】:

    可以在您从中读取顶点数据的同一个缓冲区中执行变换反馈操作。 可以在您正在读取的顶点数据的顶部执行变换反馈操作。

    这就是你在第二次手术中所做的。

    你需要做的是使用glBindBufferBase在第二个TF操作中偏移反馈缓冲区,以便它写入新的顶点数据。

    您做错的另一件事是您将错误的三角形传递给您的反馈操作。根据您对所需内容的描述,您只想在方尖碑的 topmost 三角形上执行该过程。但是您在 TF 渲染代码中传递了整个内容。您需要隔离要扩展的特定三角形并仅渲染它们。

    转换反馈将写入三角形in the order that you output them。所以你需要隔离那些特定的三角形,只对它们进行反馈操作。

    【讨论】:

    • 感谢您的回复。我应该知道我的三角形有一个长度参数,几何着色器计算并为所有不需要扩展的三角形设置为 0。如果我使用 glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, numPrimitivesWritten, TBO); 我仍然得到相同的结果如果我理解正确,这就是我应该做的?
    • @LeoldeWire:偏移量以字节为单位,而不是写入的原语。您还需要确保缓冲区中有足够的空间容纳所有这些数据。
    • 好吧,我的原语基本上是一个 vec4 和浮点长度参数。所以我尝试使用 glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, sizeof(GLFloat) * 5 * numPrimitivesWritten);不幸的是还是一样的结果
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    相关资源
    最近更新 更多