Fri
27
Jul 2007
W kwestii shaderów używanych do rysowania wszelkich obiektów (na czele ze zwykłymi, nieprzezroczystymi powierzchniami o określonych parametrach materiału) można wymyślić trzy rozwiązania różniące się trudnością:
1. Sposób najprostszy to stały, napisany wcześniej zestaw shaderów. Każdy z nich byłby uniwersalny w jakimś zakresie. Dostępny w nowych kartach Static Branching i Dynamic Branching pozwalają włączać i wyłączać poszczególne fragmenty, aczkolwiek mnie i tak szkoda byłoby marnować instrukcje na sprawdzanie warunku zamiast wygenerować osobny shader bez danego fragmentu.
2. Metoda subtraktywna: Można napisać jeden albo kilka wielkich shaderów posiadających wszystkie potrzebne możliwości, w których źródle znajdą się warunki typu if (MAKRO == 1) albo też #if (MAKRO == 1). Taki kod będzie kompilowany na żądanie z odpowiednimi makrami preprocesora jako konkretny shader. Tak mam zrobione obecnie.
3. Metoda addytywna, najtrudniejsza: Przed kompilacją składać kod shadera z fragmentów w postaci definiowanych jakoś w tekstowy albo graficzny sposób bloczków, których wyjścia jednych łączy się z wejściami innych.
Nie wiem, który sposób będzie najlepszy.