glDrawArraysInstanced не выполняет несколько вызовов отрисовки в OpenGL?

Я пытаюсь нарисовать два пятна прямоугольника (для тесселяции), и я хочу нарисовать их от 0,0 до 1,1 и другие от 1,0 до 2,1

Я использую GL_PATCHES, чтобы отправить квад в мой графический конвейер

Мои данные вершин в однородных координатах

float vertices[32] = {
0.0, 0.0, 0.0, 1.0, //1st rec
1.0, 0.0, 0.0, 1.0,
1.0, 1.0, 0.0, 1.0,
0.0, 1.0, 0.0, 1.0,
  1.0, 0.0, 0.0, 1.0, //2nd rec
  2.0, 0.0, 0.0, 1.0,
  2.0, 1.0, 0.0, 1.0,
  1.0, 1.0, 0.0, 1.0
   };

И в коде C++

glPatchParameteri(GL_PATCH_VERTICES, 4);
glDrawArraysInstanced(GL_PATCHES, 0, 4, 2);

Но я получаю только один прямоугольный патч от 0,0 до 1,1 на моем экране. Я не понимаю, почему он не рисует второй прямоугольник

Мой шейдер оценки тесселяции

vec4 vert= vec4(0.0, 0.0, 0.0, 1.0);
vert.x = gl_in[0].gl_Position.x + gl_TessCoord.x;
vert.y = gl_in[0].gl_Position.y + gl_TessCoord.y;

Я конвертирую этот vert в vec4 и передаю его gl_Position

1 ответ

Решение

glDrawArraysInstanced рисует несколько экземпляров указанных данных. В вашем случае он дважды рисует вершины от 0 до 4, что дает вам два квадра, лежащих в одной и той же позиции.

Я бы посоветовал вам просто использовать glDrawArrays(GL_PATCHES, 0, 8) вместо этого, но вы также можете сохранить свой вызов отрисовки и выполнить перевод в вершинный шейдер в соответствии с gl_InstanceID.

Другие вопросы по тегам