Можете ли вы использовать glVertexAttribPointer, чтобы назначить меньший вектор большему? - PullRequest
5 голосов
/ 13 октября 2011

Из раздела 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 полагаясь на неопределенное поведение, или я что-то упускаю?

1 Ответ

11 голосов
/ 13 октября 2011

Размер данных атрибута, передаваемых в шейдер, не должен соответствовать размеру атрибута в этом шейдере. Вы можете передать 2 значения (от glVertexAttribPointer) атрибуту, определенному как vec4; оставшиеся два значения равны нулю, за исключением компонента W, который равен 1. И аналогично, вы можете передать 4 значения атрибуту vec2; дополнительные значения отбрасываются.

Таким образом, вы можете смешивать и сопоставлять атрибуты вершин с загруженными значениями сколько хотите.

...