Tworzenie gry w C# z użyciem silnika Ogre - cz.7
21.07.2011 - Mateusz Osowski
Dotychczas zajmowaliśmy się techniczną stroną silnika, mechaniką całego systemu. Przyszedł czas na poznanie sposobów poprawiania graficznej strony gry. Przyjrzymy się systemowi materiałów silnika renderującego Ogre, a także napiszemy podstawowe programy cieniujące (shadery).
[Część 7]
Materiały
Silnik Ogre posiada moduł renderujący, który możemy bardzo swobodnie konfigurować za pomocą specjalnych skryptów. Składnia, konstrukcja tych plików została inspirowana jest najprawdopodobniej formatem efektów DirectX (FX), lecz posiadają one znacznie szerszy zakres możliwości. Najważniejsze elementy materiału to:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | material MaterialTestowy { technique Domyslna { ... // fajne shadery } technique Awaryjna { ... // fixed-pipeline } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | technique { pass Przebieg0 { ... // renderujemy tekstury } pass Przebieg1 { ... // renderujemy cienie scene_blend modulate } } |
scene_blend
, blending modes) to:
add
- wartości kolorów pikseli przebiegu są dodawane do poprzednich. Operacja znajduje szerokie zastosowanie, np. w sumowaniu natężenia oświetlenia.modulate
- mnożenie. Ta operacja może tylko ściemnić scenę, można użyć jej do aplikowania cieni za pomocą statycznych map oświetlenia (lightmaps).colour_blend
- koloruje nowy przebieg na podstawie kolorów wejściowych, tworzy wrażenie przezroczystości.alpha_blend
- używa wartości kanału alfa tekstury do określenia stopnia przezroczystości.scene_blend
dający większą kontrolę nad sposobem łączenia przebiegów:
scene_blend src dst
one
- wartość 1 na wszystkich kanałachzero
- wartość 0 na wszystkich kanałachdest_colour
- kolor docelowego przebiegusrc_colour
- dotychczasowy kolor w buforzeone_minus_dest_colour
- 1 - dest_colourone_minus_src_colour
- 1 - src_colourdest_alpha
- wartość kanału alfa docelowego przebiegusrc_alpha
- wartość kanału alfa poprzednich przebiegówone_minus_dest_alpha
- 1 - dest_alphaone_minus_src_alpha
- 1 - src_alphascene_blend
są odpowiednikami pewnych kombinacji argumentów wersji dwuargumentowej, np.
scene_blend add
to scene_blend one one
,wynik = (żródło * 1) + (nowy_przebieg * 1) = źródło + nowy_przebieg.
scene_blend_op
(manual).
iteration
, przykładowo:
1 2 3 4 5 6 7 8 9 10 | technique { pass { iteration once_per_light scene_blend add ... } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | struct FragmentIn { float2 TexCoord : TEXCOORD0; }; struct FragmentOut { float4 Color : COLOR; }; FragmentOut fragment_func(FragmentIn In) { FragmentOut Out; Out.Color.r = 1; Out.Color.g = 0.7; return Out; } |
float2, float3, float4
, będących po prostu wektorami typu float
o odpowiedniej długości. Do składowych można się odnosić poprzez pola r, g, b, a
, lub też x, y, z, w
. Istnieją również typy macierzowe float3x3, float4x4, float4x3, ...
.
TEXCOORD0, COLOR
. Ich głównym zadaniem jest usprawnienie wymiany danych między aplikacją i programem cieniującym. Twórca aplikacji lub silnika może odgórnie ustalić, jakie wejściowe będą zawierały określone semantyki. W przypadku Ogre dokumentacja dobrze opisuje używane semantyki. W przypadku powyższego programu oczekujemy, że pod semantyką TEXCOORD0
zapisane będą współrzędne mapowania tekstury wysłane przez vertex-program (w tym przypadku zastąpiony przez fixed-pipeline, który tam właśnie zapisuje współrzędne mapowania tekstur).
1 2 3 4 5 6 | fragment_program FragmentProgram/Orange cg { source OrangeFP.cg entry_point fragment_func profiles ps_1_1 arbfp1 } |
FragmentProgram/Orange
. Parametr entry_point
określa nazwę funkcji głównej programu. W jednym pliku .cg może być zapisanych wiele programów. Parametr profiles
ustala profile wymagane do kompilacji programu. W tym przypadku korzystamy z profilu Pixel Shader 1.1 dla DirectX i ARB Fragment Program 1 dla OpenGL. Lista wszystkich dostępnych profili i obsługujących je kart graficznych znajduje się pod adresem http://www.ogre3d.org/docs/manual/manual_18.html. Kompilacja programu z wyższym profilem zmniejsza ograniczenia nałożone na nas podczas pisania programu cieniującego, lecz zwiększa wymagania sprzętowe. Zalecane jest używanie najniższego profilu niezbędnego do napisania danego programu cieniującego.
1 2 3 4 5 6 7 8 9 10 11 12 | material Vase/TEXFACE/vase.jpg { technique { pass { fragment_program_ref FragmentProgram/Orange { } } } } |
fragment_program_ref
. Konieczne jest wstawień klamer, ponieważ składnia materiałów dopuszcza przekazywanie programom cieniującym dodatkowych parametrów, czym będziemy zajmować się za chwilę. Nazwa materiału Vase/TEXFACE/vase.jpg
została wygenerowana przez Blendera podczas eksportowania modelu wazy.
Copyright © 2008-2010 Wrocławski Portal Informatyczny
design: rafalpolito.com