Из раздела 5.8 Язык шейдинга OpenGL® ES (v1.00, r17) [PDF] ( акцент мой):
Оператор присваивания сохраняет значение rvalue-выражения в l-значении и возвращает r-значение с типом и точностью lvalue-выражения. lvalue-выражение и rvalue-выражение должны иметь один и тот же тип. Все желаемые преобразования типов должны быть явно указаны через конструктор.
Похоже, выполнение чего-то вроде этого не было бы законным:
vec3 my_vec3 = vec3(1, 2, 3);
vec4 my_vec4 = my_vec3;
И чтобы сделать это законным, вторая строка должна быть примерно такой:
vec4 my_vec4 = vec4(my_vec3, 1); // add 4th component
Я предположил, что glVertexAttribPointer
предъявляли аналогичные требования. То есть, если вы назначаете vec4
, что параметр size
должен быть равен 4.
Затем я наткнулся на пример GLES20TriangleRenderer для Android . Некоторые соответствующие фрагменты:
attribute vec4 aPosition;
maPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition");
GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false,
TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices);
Итак aPosition
- это vec4
, но вызов glVertexAttribPointer
, который используется для его установки, имеет размер
из 3.Правильно ли этот код, GLES20TriangleRenderer
полагается на неопределенное поведение, или мне что-то еще не хватает?