2014-12-19 24 views
6

Zaczynam od OpenGL ES2.0 na Androidzie (5.0.1), poziom interfejsu API 19. Gdzie powinienem przechowywać kod modułu cieniującego? Pierwszy przykład koduje moduł cieniujący bezpośrednio jako ciąg znaków.Gdzie przechowywać kod modułu cieniującego w aplikacji Android

Chciałbym mieć kod modułu cieniującego w oddzielnym pliku dla lepszej użyteczności. Jaka jest najlepsza praktyka do przechowywania i ładowania shaderów wierzchołków i fragmentów?

Odpowiedz

9

Istnieją dwie główne opcje:

  • zapisać je jako pliki tekstowe w folderze assets projektu. Aby załadować moduł cieniujący:

    1. Uzyskaj AssetManager metodą getAssets() kontekstu.
    2. Zadzwoń pod open() na , przekazując nazwę pliku modułu cieniującego. To daje InputStream.
    3. Przeczytaj kod modułu cieniującego z InputStream i zapisz go w postaci String.
    4. Zadzwoń pod close() pod numerem InputStream.
  • Przechowuj je w folderze res/raw swojego projektu. Aby załadować shader:

    1. uzyskać Resources metodą kontekstu getResources().
    2. Zadzwoń pod openRawResource() pod numerem Resources, przekazując identyfikator zasobu (R.raw.<name>). To daje InputStream.
    3. (jak wyżej)
    4. (jak wyżej)

Nie wierzę, że to wielki powód, aby preferować jeden nad drugim. Główną różnicą jest to, że używasz nazwy pliku, aby uzyskać dostęp do zasobów, a do zasobów używasz automatycznie przypisanego identyfikatora zasobu. To kwestia preferencji, którą lubisz lepiej.

+0

Dzięki. Próbowałem sposób "Zasoby" i działa dobrze. Jednak uważam, że raczej trudno jest odczytać zawartość pliku jako ciąg. Nie znalazłem innego sposobu, niż czytanie wszystkich linii i łączenie ich. Ale musiałem ręcznie dodać podział wiersza. A jakie jest najlepsze rozszerzenie plików dla shaderów? – anhoppe

+1

jeśli korzystasz z rozszerzenia plików ".fs", system Android zinterpretuje je jako skrypt filtru Rendercript i podświetli kolorami składni. – HPP

+0

[Te] (https://www.khronos.org/opengles/sdk/tools/Reference-Compiler/) to oficjalne rozszerzenia – elect