2011-10-12 7 views
5

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?

Odpowiedz

10

Rozmiar danych atrybutów przekazywanych do modułu cieniującego nie musi odpowiadać rozmiarowi atrybutu w tym module cieniującym. Możesz przekazać 2 wartości (od glVertexAttribPointer) do atrybutu zdefiniowanego jako vec4; pozostałe dwie wartości są zerowe, z wyjątkiem składnika W, który wynosi 1. Podobnie można przekazać 4 wartości do atrybutu vec2; dodatkowe wartości są odrzucane.

Dzięki temu możesz mieszać i dopasowywać atrybuty wierzchołków z przesłanymi wartościami, które chcesz.

+0

Interesujące. Czy to zachowanie jest gdzieś udokumentowane? –

+0

@LaurenceGonsalves: Jest to udokumentowane w specyfikacji OpenGL ES. –

+6

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". –