Skocz do zawartości

Wypalanie global illumination w 2d.


Exigo

Rekomendowane odpowiedzi

Piszę toola (edytor map 2d, non-grid) do swoich projektów, i jestem na etapie wprowadzania funkcji wypalania lightmap. Początkowo myślałem o zwykłym scencilu z penumbrą (na community roi się od rozszerzeń tego typu), ale wypalanie ma się dziać w edytorze, stąd można szaleć z wszelakimi metodami, nawet takimi które nie są osiągalne choć częściowo real-time w gm. Stąd pomyślałem sobie, czemu tego nie renderować metodą oświetlenia globalnego? Pomysł trochę dziwaczny, bo w 2d, stąd mało materiałów jak coś takiego napisać, ale wydaje mi się jak najbardziej sensowny. Jakieś pomysły, wskazówki, być może źródła?

Odnośnik do komentarza
Udostępnij na innych stronach

Możesz castować cienie na surface i stworzyć z niego tilesy które będą zapisane w pliku mapy. W ten sam sposób jest wypalany multitexturing w tym 3D edytorze terenów: http://gmc.yoyogames.com/index.php?showtopic=526631

 

Edit:

W podobny sposób tutaj wypaliłem textury i globalne światło: https://forum.gmclan.org/index.php?showtopic=29616

Odnośnik do komentarza
Udostępnij na innych stronach

Właśnie dokładnie o tym napisałem w tytułowym poście. Interesuje mnie metoda wyłącznie wypalania, nie technika rysowania wypalonych świateł w grze, bo to już mam od dawna napisane. Ale i tak dzięki. :)

 

@Edit:

Prawie idealny gif znaleziony na jakimś blogu pokazujący o co mi biega (wyobraźcie sobie lepszą jakość i jednorazowe wypalanie tego w edytorze z wielkim buttonem "bake lights" z paskiem postępu. :D):

radiositynoiselow.gif

Szkoda że autor nie pokazał źródeł/metody.

 

@Edit (18:02):

Napisałem sobie prostą implementację, operując różnymi wartościami, wychodzą fajne rzeczy (2k fotonów, 3 sec. renderingu): Source

Odnośnik do komentarza
Udostępnij na innych stronach

Nie byłem w stanie znaleźć nic takiego związanego z 2d, więc zacząłem implementować własnym sposobem. Efekty były fajne, ale zrobił się problem gdy chciałem zrobić odbicia (kombinowałem z getpixel, ale przy tylu samplach komp mi się zawiesił, więc odpuściłem). Dosłownie moment temu wpadłem na użycie silnika fizycznego i zrobienie fotonów jako ciała. ; D

photon_powoli_sa_efekty.jpg

(ok. 8 sec. spawania) To po lewej to skrzynka. Obija się światło od niej, jea. :D

 

Nie wiem czy metoda jest "poprawna", ale w każdym razie powyższy efekt został zrobiony tym kodem:

GML
if keyboard_check_pressed(ord("B")) {

show_message("bake");

 

w = ep_world_create();

ep_world_set_settings(w, 1, 20, 40, .1, .5, .1, .6, 1);

ep_world_set_sleeping(w, true, 30, 0, .01, .001);

 

body = ep_body_create_static(w);

shape = ep_shape_create_box(w, body, 32, 32, 128 - 48, 128, 0, 1);

ep_shape_set_collision(w, body, shape, 1, 1, 0);

 

repeat (4096) {

i = obj_add(def_photon);

with (i) {

w = main.w;

xx = 128;

yy = 128;

life = 1;

body = ep_body_create_dynamic(w, true);

shape = ep_shape_create_box(w, body, 1, 1, 0, 0, 0, 1);

ep_body_set_position(w, body, xx, yy, 0);

ep_shape_set_collision(w, body, shape, 1, 0, 0);

//ep_shape_set_material(w, body, shape, 1, .1, 0, 0);

len = 1;

dir = random(360);

ep_body_apply_impulse(w, body, 0, 0, ldx(len, dir), ldy(len, dir), 0, 0, 1, 1);

}

}

 

surface_set_target(sf_ray);

draw_clear(0);

draw_set_blend_mode(bm_add);

repeat (128) {

ep_world_update_contacts(w);

ep_world_simulate_step(w);

with (def_photon){

//ep_body_apply_impulse(w, body, 0, 0, (-1 + random(2)) * 1, (-1 + random(2)) * 1, 0, 0, 1, 1);

xx = ep_body_get_x(w, body) + ((-1 + random(2)) * (1 - life)) * 16;

yy = ep_body_get_y(w, body) + ((-1 + random(2)) * (1 - life)) * 16;

draw_set_alpha(life * .025)// + (-1 + random(2)) * .0125);

draw_point(xx, yy);

life -= .0078125;

}

}

draw_set_alpha(1);

draw_set_blend_mode(bm_normal);

surface_reset_target();

ep_world_destroy(w);

}

 

texture_set_interpolation(false);

draw_surface_ext(sf_ray, 0, 0, 2, 2, 0, c_white, 1);

texture_set_interpolation(true);

 

Tymczasem będę dalej próbował uzyskiwać coraz lepsze efekty mniejszym kosztem.

Jak ktoś ma pomysły, pisać. Szczególnie te związane z optymalizacją.

Odnośnik do komentarza
Udostępnij na innych stronach

Tak, to prawda. Gdzieś nawet widziałem zestawienie poruszające tą tematykę, i EP było poza konkurencją. Nie dość że był szybszy, to posiadał szerszy zakres funkcjonalności od większości silników tego typu.

 

Co do samego wypalania, cel prawie osiągnięty - od tego momentu jest to wbudowane do edytora i reaguje z innymi obiektami. Prezentowane światła wypalały się mniej-więcej 8 sec., i wydaje mi się że nie jest to zły wynik. No i jest ten "Bake lights" który sobie obiecałem. ;D

 

Próbuje się też uporać w międzyczasie z wciskaniem fotonów pomiędzy trójkąty. Na obrazku jest to widoczne jeśli ktoś spróbuje się przyjrzeć.

photon_implementacja_edytor.jpg

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...