Можете ли вы использовать glVertexAttribPointer, чтобы назначить меньший вектор большему?

Из раздела 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 полагается на неопределенное поведение, или мне что-то еще не хватает?

5
задан Laurence Gonsalves 12 October 2011 в 23:00
поделиться