OpenGL ES 2.0: glVertexAttribPointer vs vec3

Я пытаюсь нарисовать некоторые точки с помощью GL_POINTS, и заставить его работать как можно быстрее. У меня есть две переменные, которые необходимо передать шейдеру - позиция (vec2), а также размер точки (float) - и я не уверен в самом быстром способе их передачи.

Прежде чем я использовал glVertexAttribPointer два раза, первый раз, чтобы передать позицию и второй, чтобы передать размер. Это позволяет мне написать код вершинного шейдера следующим образом:

attribute mediump vec4 Position;
attribute lowp float Size;

void main(void) {
  gl_PointSize = Size;
  gl_Position = Position;
}

Я думал, что это было хорошо, так как это работало и выглядело хорошо, но потом я где-то читал, что вы должны попытаться свести к минимуму вызовы glVertexAttribPointer. Это заставило меня принять решение передать позицию и размер в одном vec3, поэтому мне нужно сделать только один вызов glVertexAttribPointer.

Однако это означает, что мне нужно переписать вершинный шейдер так:

attribute mediump vec3 Position;

void main(void) {
  gl_PointSize = Position.z;
  gl_Position = vec4(Position.x, Position.y, 0.0, 1.0);
}

Для меня это выглядит ужаснее, но это делает вызовы glVertexAttribPointer намного проще.

Мой вопрос: действительно ли передача его как vec3 влияет на производительность, и если да, то есть ли способ переписать его, чтобы он выглядел менее уродливо? Я надеялся сделать что-то вроде

gl_Position = vec4(vec2(Position));

Но это не работает, к сожалению.

1 ответ

Решение

Я попытался его профилировать, и он дал довольно похожие результаты, однако он дал мне несколько странных ошибок, связанных с перекрытием данных и выходом за их пределы. Я думаю, что я буду придерживаться этого без vec3.

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