OpenGL 使用动态几何变换反馈
OpenGL Transform Feedback with dynamic Geometry
我目前正在尝试使用几何着色器变换反馈。几何着色器采用一个三角形,用它制作一个棱镜,并在它上面放一个四边形(把它想象成一个方尖碑,但只有 3 个而不是 4 个边)。
我使用一次变换反馈得到了正确的结果。但是我想用变换反馈创建额外的几何体。我想为 Tetraeder 的每个三角形执行几何着色器处理。
第一次通过后的结果
第二次通过后的结果
因此,在第二遍中黑色部分不会变成无穷大,应该有另一个你可以左右看到的分支,但那个分支朝向相机。
我在这里做错了什么?我不确定如何处理两个顶点缓冲区对象不断增加的数据大小,我可能在那里做错了什么。帮助将不胜感激。
在主要 window 循环之前转换反馈:
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);
在主要 window 循环中转换反馈:
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);
}
可以在您从中读取顶点数据的同一缓冲区中执行变换反馈操作。 不可以在您正在读取的顶点数据的顶部执行变换反馈操作。
这基本上就是您在第二次操作中所做的。
您需要做的是在第二次 TF 操作中使用 glBindBufferBase
偏移反馈缓冲区,以便它写入新的顶点数据。
您做错的另一件事是您将错误的三角形传递给反馈操作。根据您对所需内容的描述,您只想在方尖碑的 topmost 三角形上执行该过程。但是你在你的 TF 渲染代码中传递了整个东西。您需要隔离要扩展的特定三角形并仅渲染它们。
变换反馈会写三角形in the order that you output them。所以你需要隔离那些特定的三角形,只对它们进行反馈操作。
我目前正在尝试使用几何着色器变换反馈。几何着色器采用一个三角形,用它制作一个棱镜,并在它上面放一个四边形(把它想象成一个方尖碑,但只有 3 个而不是 4 个边)。
我使用一次变换反馈得到了正确的结果。但是我想用变换反馈创建额外的几何体。我想为 Tetraeder 的每个三角形执行几何着色器处理。
第一次通过后的结果
第二次通过后的结果
我在这里做错了什么?我不确定如何处理两个顶点缓冲区对象不断增加的数据大小,我可能在那里做错了什么。帮助将不胜感激。
在主要 window 循环之前转换反馈:
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);
在主要 window 循环中转换反馈:
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);
}
可以在您从中读取顶点数据的同一缓冲区中执行变换反馈操作。 不可以在您正在读取的顶点数据的顶部执行变换反馈操作。
这基本上就是您在第二次操作中所做的。
您需要做的是在第二次 TF 操作中使用 glBindBufferBase
偏移反馈缓冲区,以便它写入新的顶点数据。
您做错的另一件事是您将错误的三角形传递给反馈操作。根据您对所需内容的描述,您只想在方尖碑的 topmost 三角形上执行该过程。但是你在你的 TF 渲染代码中传递了整个东西。您需要隔离要扩展的特定三角形并仅渲染它们。
变换反馈会写三角形in the order that you output them。所以你需要隔离那些特定的三角形,只对它们进行反馈操作。