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.