2012-07-08 14 views
6

Pracuję nad aplikacją OpenGL na iPhone'a. W moim vertexowym shaderze potrzebuję sposobu na zmianę koloru dużej liczby (ale nie wszystkich) moich wierzchołków naraz, więc zdecydowałem się na indeksowanie kolorów. Pozwoli mi to opuścić statyczny VBO i zmodyfikuje pojedynczą zmienną jednolitą, zamiast przechodzić przez każdy wierzchołek i modyfikować informacje o kolorach między każdą klatką.Podaj liczbę całkowitą dla indeksu tablicy w OpenGL ES 2.0?

Mój plan to stworzenie uniformu z tablicą kolorów, dodanie liczby całkowitej zawierającej indeks w atrybutach. Oto moja vertex shader:

uniform mat4 u_mvp_matrix; 
uniform vec4 u_color_array[]; 

attribute vec4 a_position; 
attribute int a_colorIndex; 

varying lowp vec4 v_color; 

void main() 
{ 
    v_color = u_color_array[a_colorIndex]; 

    gl_Position = u_mvp_matrix * a_position; 
} 

Pojawia się błąd:

int can't be an in in the vertex shader

Zrobiłem rozeznanie. IPhone obsługuje najpóźniej OpenGL ES 2.0, co oznacza, że ​​obsługuje on GLSL 1.2 najpóźniej i najwyraźniej liczby całkowite są obsługiwane tylko w GLSL 1.3 i nowszych wersjach. Próbowałem zmienić a_colorIndex na float. Nie spodziewałem się, że to zadziała, a tak się nie stało.

Jak określić indeks koloru dla każdego wierzchołka?

+0

Może rozważyć wyszukiwanie tekstur, gdzie indeks jest float uv, zamiast wyszukiwania tablicy? Czy możesz rzucić/zaokrąglić float do int? – Tim

+1

"co oznacza, że ​​obsługuje on GLSL 1.2" Nie, nie robi tego. GL ES 2.0 oznacza, że ​​obsługuje język cieniowania GLSL *** ES ***, który jest * inny * od języka GLSL na pulpicie. GLSL ES jest oparty na GLSL 1.2, ale to nie jest to samo. * –

Odpowiedz

4

Określ atrybut jako zmiennoprzecinkowy. Możesz używać pływaków jako wskaźników do tablic.

+0

Otrzymuję ten błąd "Wyrażenie indeksu ma typ 'float', ale powinien mieć integralny typ" jeśli zrobię to, co powiedziałeś. Czy można bezpiecznie wykonać tablicę [int (fIndex)] lub czy wystąpią błędy precyzji? – weezor

+0

Zajmuję się tym samym problemem, co weezor ("... powinien mieć typ integralny") (przynajmniej w niektórych przypadkach). Byłoby miło wyjaśnić. –

+0

Specyfikacja języka ES2 mówi: "Dostęp do elementów szyku odbywa się za pomocą wyrażenia, którego typ jest liczbą całkowitą." Więc tak, rzuć na int (słabe platformy wykonują niejawną obsadę, więc odpowiedź prawdopodobnie działa na komputerze odbierającego). – kiwibonga