Z sekcji 5.8 The OpenGL® ES Shading Language (v1.00, r17) [PDF] (kopalni nacisk):Czy możesz użyć glVertexAttribPointer, aby przypisać mniejszy wektor do większego?
Operator przypisania przechowuje wartość RValue ekspresji do lwartości i zwraca RValue z typem i precyzji lwartości wyrażania . Wyrażenie l wyrażenia i wartość r muszą być tego samego typu. Wszystkie wymagane konwersje typów muszą być określone jawnie za pomocą konstruktora.
Tak brzmi jak robi coś takiego byłoby nie być legalne:
vec3 my_vec3 = vec3(1, 2, 3);
vec4 my_vec4 = my_vec3;
I aby to legalne druga linia musiałaby być coś takiego:
vec4 my_vec4 = vec4(my_vec3, 1); // add 4th component
Założono, że glVertexAttribPointer
ma podobne wymagania. Oznacza to, że jeśli przypisałeś do vec4
, parametr size
musiałby być równy 4.
Potem natknąłem się na GLES20TriangleRenderer sample for Android. Niektóre istotne fragmenty:
attribute vec4 aPosition;
maPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition");
GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false,
TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices);
Więc aPosition
jest vec4
, ale wezwanie do glVertexAttribPointer
, który jest używany, aby ją ustawić ma size
od 3. Jest to kod poprawny, to GLES20TriangleRenderer
powołując się na nieokreślony zachowań, czy jest tam coś innego Brakuje mi?
Interesujące. Czy to zachowanie jest gdzieś udokumentowane? –
@LaurenceGonsalves: Jest to udokumentowane w specyfikacji OpenGL ES. –
Miałem nadzieję na coś bardziej konkretnego. :-) Co do płyty, wydaje się, że jest to udokumentowane w sekcji 2.8 specyfikacji, "Vertex Arrays", pod nagłówkiem "Przesyłanie elementów tablicy". –