Przekazywanie zmiennej do shadera OpenGL GLSL

Piszę aplikację na iPhone ' a, która używa shaderów GLSL do wykonywania przekształceń na teksturach, ale jeden punkt, który mam trochę trudności z przekazywaniem zmiennych do mojego shadera GLSL.

Czytałem, że możliwe jest, aby shader odczytał część stanu OpenGL (i potrzebowałbym tylko dostępu do tej zmiennej tylko do odczytu), ale nie jestem pewien, jak taka wymiana mogłaby się stać.

Krótko mówiąc, próbuję uzyskać wartość float utworzoną poza shaderem fragmentu, aby była dostępna dla fragment shader (niezależnie od tego, czy jest przekazywany, czy odczytywany z wnętrza shader).

Dzięki za wszelką pomoc/wskazówki, które możesz zapewnić, to bardzo doceniane!

Author: Greg S, 2010-07-12

1 answers

Jedną z opcji jest przekazywanie informacji za pomocą jednolitych zmiennych.

Po

glUseProgram(myShaderProgram);

Możesz użyć

GLint myUniformLocation = glGetUniformLocation(myShaderProgram, "myUniform");

I na przykład

glUniform1f(myUniformLocation, /* some floating point value here */);

W Twoim vertex lub fragment shader, musisz dodać następującą deklarację:

uniform float myUniform;

To wszystko, w Twoim shaderze możesz teraz uzyskać dostęp (tylko do odczytu) do wartości przekazanej wcześniej przez glUniform1f.

Oczywiście jednolitymi zmiennymi mogą być dowolne ważne typy GLSL włączając w to typy złożone takie jako tablice, struktury lub matryce. OpenGL dostarcza glUniform funkcji ze zwykłymi przyrostkami, odpowiednie dla każdego typu. Na przykład, aby przypisać do zmiennej typu vec3, można użyj glUniform3f lub glUniform3fv.

Uwaga: wartość nie może być modyfikowana podczas wykonywania shadera, tzn. w glBegin/glEnd blok. Jest tylko do odczytu i taki sam dla każdego przetwarzanego fragmentu / wierzchołka.

Istnieje również kilka samouczków używających mundurów, można je znaleźć w googlach "GLSL uniform variable".

Mam nadzieję, że pomaga.

 58
Author: Greg S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-28 19:35:45