現在、ジオメトリ シェーダーでトランスフォーム フィードバックを試しています。Geometry Shader は Triangle を取り、そこから Prism を作成し、その上に Tetraeder を配置します (オベリスクのように考えてください。ただし、4 つの側面ではなく 3 つの側面しかありません)。
トランスフォーム フィードバックを 1 回使用すると、正しい結果が得られます。ただし、トランスフォーム フィードバックを使用して追加のジオメトリを作成したいと考えていました。Tetraeder の三角形ごとにジオメトリ シェーダー プロセスを実行したいと考えました。
2 番目のパスの後の結果
したがって、2 番目のパスで黒い部分が無限大になる代わりに、左右に見える別の枝がカメラに向かっているはずです。
ここで何が間違っていますか?2 つの Vertex Buffer オブジェクトの常に増加するデータ サイズを処理する方法がわかりません。おそらくそこで何か間違ったことをしているのでしょう。助けていただければ幸いです。
メイン ウィンドウ ループの前にフィードバックを変換します。
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);
}