1

現在、ジオメトリ シェーダーでトランスフォーム フィードバックを試しています。Geometry Shader は Triangle を取り、そこから Prism を作成し、その上に Tetraeder を配置します (オベリスクのように考えてください。ただし、4 つの側面ではなく 3 つの側面しかありません)。

トランスフォーム フィードバックを 1 回使用すると、正しい結果が得られます。ただし、トランスフォーム フィードバックを使用して追加のジオメトリを作成したいと考えていました。Tetraeder の三角形ごとにジオメトリ シェーダー プロセスを実行したいと考えました。

最初の合格後の結果 最初の合格後の結果

2 番目のパスの後の結果 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);
}
4

1 に答える 1

3

頂点データの読み取り元と同じバッファーに変換フィードバック操作を実行しても問題ありません。読み込んでいる頂点データので変換フィードバック操作を実行することは問題です

そして、それは基本的に、2 番目の操作で行っていることです。

行う必要があるglBindBufferBaseのは、2 番目の TF 操作でフィードバック バッファーをオフセットするために使用することで、新しい頂点データに書き込むようにすることです。

あなたが間違っているもう1つのことは、間違った三角形をフィードバック操作に渡していることです。必要なものの説明から、オベリスクの一番上の三角形でのみプロセスを実行したいと考えています。ただし、すべてを TF レンダリング コードで渡します。展開したい特定の三角形を分離し、それらのみをレンダリングする必要があります。

変換フィードバックは、出力した順序で三角形を書き込みます。したがって、これらの特定の三角形を分離し、それらに対してのみフィードバック操作を実行する必要があります。

于 2017-02-25T18:24:18.280 に答える