Из раздела 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
, который используется для его установки, имеет size
из 3. Является ли этот код правильным, это GLES20TriangleRenderer
полагаясь на неопределенное поведение, или я что-то упускаю?