2012-05-05 15 views
5

Skrót:GLSL wielokrotnego użytku/wspólne funkcje, wspólne stałe (OpenGL ES 2.0)?

Czy mogę zdefiniować funkcję, której może używać każdy moduł cieniujący? Czy muszę zdefiniować to na moduł cieniujący?


Cała historia:

  • Chcę utworzyć wiele shaderów przeznaczony do kolorowania fragmentów wejściowe z predefiniowanymi rampy gradientu (coś takiego - http://www.thinkboxsoftware.com/storage/krakatoa-support-images/krakatoa15_kcm_densitybyage_gradientrampmap.png).

  • Chcę zdefiniować rampy gradientu stała dla każdego cieniującego (tablicę kolorów próbek vec4, gdzie wartość alfa posiada pozycję gradientu, patrz Pos na zdjęciu powyżej)

  • I potrzebuję funkcja, która może zwrócić próbkę koloru z danej rampy gradientowej dla określonej pozycji współrzędnych tekstury.

Więc pochylnie muszą być zdefiniowany RAZ za cieniującego, a funkcja powinna być zdefiniowane naraz że każdy shader można używać bezpiecznie.

mam algorytmów, pytanie jest dla funkcji udostępniania i definiowania stałych w GLSL.

Czy to możliwe? Czy muszę skopiować funkcję do każdego modułu cieniującego? Czy istnieje przynajmniej opcja prekompilacji?

Odpowiedz

9

Możesz to zrobić podobnie jak w C - deklarujesz funkcje w nagłówkach i definiujesz je we wspólnym pliku C.

W GLSL musisz zrobić następujące:

  1. w pewnym shaderów (string) funkcji można zdefiniować (pozwala wywołać wspólny):

    float getCommonValue() { return 42; } 
    
  2. we wszystkich shaderów chcesz aby użyć tej funkcji, deklarujesz ją tylko i używasz (możesz nazwać to SHADER1):

    float getCommonValue(); 
    void main() { gl_Color = vec4(getCommonValue(), 0, 0, 0); } 
    
  3. podczas kompilowania shaderów z glCompileShader kompilacji WSPÓLNE shader tylko raz i sklep cieniowania GLuint gdzieś

  4. kiedy odwołuje się program z glLinkProgram dla SHADER1 dołączyć do programowania z glAttachShader obu shaderów - wspólne i SHADER1. Dzięki temu będziesz mógł wywoływać funkcję getCommonValue z jednego modułu cieniującego na inny.

  5. Możesz wielokrotnie używać wielokrotnego GLONTAJ WSPÓLNEGO modułu cieniującego dla różnych programów sahder (SHADER1, SHADER2, ...).

+0

Whoa, brzmi nieźle, spróbuję. – Geri