В настоящее время я пробую Transform Feedback с помощью Geometry Shader. Геометрический шейдер берет треугольник, делает из него призму, а также помещает на нее тетрадер (думайте об этом как обелиск, но только с 3 вместо 4 сторон).
Я получаю правильный результат, используя Transform Feedback один раз. Однако я хотел создать дополнительную геометрию с Transform Feedback. Я хотел сделать Геометрический Шейдерный Процесс для каждого из Треугольников Тетрадера.
Результат после первого прохода
Результат после второго прохода
Таким образом, вместо того, чтобы черная часть уходила в бесконечность во втором проходе, должна была быть другая из этих ветвей, которую вы можете видеть слева и справа, но та, которая направлена в сторону камеры.
Что я здесь не так делаю? Я не уверен, как справиться с постоянно увеличивающимся размером данных для двух объектов буфера вершин, и я, вероятно, что-то там делаю не так. Помощь будет оценена.
Преобразование обратной связи перед циклом главного окна:
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);
Преобразование обратной связи во время главного окна Loop:
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);
}
Можно выполнить операцию обратной связи преобразования в тот же буфер, из которого вы читаете данные вершин. Это не ОК, чтобы выполнить операцию обратной связи преобразования наверху данных вершин, из которых вы читаете.
И это по сути то, что вы делаете во второй операции.
Что вам нужно сделать, это использовать glBindBufferBase
чтобы сместить буфер обратной связи во второй операции TF, чтобы он записывал свежие данные вершин.
Другая вещь, которую вы делаете неправильно, заключается в том, что вы передаете неправильные треугольники в операцию обратной связи. Из вашего описания того, что вы хотите, вы только хотите выполнить процесс на самый верхний треугольники обелиска. Но вы передаете все это в своем коде рендеринга TF. Вам нужно выделить конкретные треугольники, которые вы хотите расширить, и только визуализировать их.
Преобразование обратной связи напишет треугольники в том порядке, в котором вы выводите их. Поэтому вам нужно выделить эти конкретные треугольники и выполнять только операции обратной связи с ними.
Других решений пока нет …