micha_i
Użytkownicy-
Postów
92 -
Dołączył
-
Ostatnia wizyta
O micha_i
- Urodziny 15.06.1996
O mnie
-
Skąd
nie pytajcie się mnie.
-
Płeć
Male
- Adres www
-
Hobby
komputer,GM,HTML,Java,fizyka,matematyka
Osiągnięcia micha_i
Smart Newbie (2/13)
0
Reputacja
-
Witam, Dzisiaj zacząłem sobie pisać shader, który miał mi świecić naokoło kursora. Wszystko pięknie działało. Ale postanowiłem pójść o krok dalej i dodać cienie. Postanowiłem zrobić to lekko topornym ray-tracing'iem (Od pixela do źródła światła sprawdzasz, czy jest wolna droga). Po wielu próbach i przekleństwach, wreszcie zaczęło działać. Ale były 2 szkopuły: 1. Tło musiało mieć jednolity kolor z którym porównywałem. 2. Mój kod nie wydala nawet 30fps. Na razie zostawiłem problem nr 2 i zacząłem bawić się problemem 1. Okazało się, że po dodaniu samplera od tła, połowa ekranu(dolna) pozostaje czarna. Uznałem, że to coś z normalizacją sampla czy czymś tam. Ale po zmianie wielkości view'a znów pojawiły się problemy, gdyż światło nie podąża za kursorem. A fps'y dalej się nie podnoszą. Dlatego proszę was o pomoc, ponieważ nie mam pojęcia gdzie może być błąd. Vertex Shader: GML attribute vec3 in_Position; // (x,y,z) attribute vec4 in_Colour; // (r,g,b,a) attribute vec2 in_TextureCoord; // (u,v) varying vec2 v_vTexcoord; varying vec4 v_vColour; varying vec2 v_vPosition; void main() { vec4 object_space_pos = vec4( in_Position.x, in_Position.y, in_Position.z, 1.0); gl_Position = gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION] * object_space_pos; v_vPosition = (gm_Matrices[MATRIX_WORLD] * object_space_pos).xy; v_vColour = in_Colour; v_vTexcoord = in_TextureCoord; } Fragment Shader: GML varying vec2 v_vTexcoord; varying vec4 v_vColour; varying vec2 v_vPosition; uniform sampler2D worldTexture; uniform sampler2D backTexture; uniform float TextureSizeX; uniform float TextureSizeY; uniform float BackgroundSizeX; uniform float BackgroundSizeY; uniform float light_x; uniform float light_y; uniform float light_r; uniform float light_g; uniform float light_b; uniform float light_pow; vec4 addColor(vec4 colour,vec3 co){ co=normalize(co); colour=normalize(colour); return normalize(vec4(co-colour.rgb,colour.a)); } void main() { vec4 colour=v_vColour; vec2 coord=v_vTexcoord; vec2 Position=v_vPosition; vec2 Texture=vec2(TextureSizeX,TextureSizeY); vec2 Light=vec2(light_x,light_y); vec2 ray=Position-Light; colour=addColor(colour,vec3(light_r,light_g,light_b));//Tu jest dodawanie światła colour*=light_pow/distance(Position,Light);//A tu przyciemnianie wraz z dystansem for (float i=0.01;i<1.0;i+=0.02){//Tu jest pętla od promieni. Aktualnie jest 1/0.2=5 punktów sprawdzania vec2 pomoc=(ray*i)+Light; vec4 col=texture2D(worldTexture,vec2(pomoc/Texture)); vec4 col2=texture2D(backTexture,vec2(pomoc/Texture)); if (int(col.r*255.0)!=int(col2.r*255.0) || int(col.g*255.0)!=int(col2.g*255.0) || int(col.b*255.0)!=int(col2.b*255.0)){//Porównanie koloru pixela z kolorem tła. colour.rgb=vec3(0.0,0.0,0.0); break; } } gl_FragColor =colour*texture2D(gm_BaseTexture,coord); } Obiekt Controller: GML Information about object: Controller Create Event: execute code: global.viewsurface=surface_create(view_wview[0],view_hview[0]); view_surface_id[0]=global.viewsurface; Other Event: Game End: execute code: surface_free(global.viewsurface); Draw Event: execute code: draw_self(); draw_text(100,100,fps); Draw GUI Event: execute code: if (!surface_exists(global.viewsurface)){ global.viewsurface=surface_create(view_wview[0],view_hview[0]); view_surface_id[0]=global.viewsurface; } time1=shader_get_uniform(LightShader,"game_time1"); time2=shader_get_uniform(LightShader,"game_time2"); msx=shader_get_uniform(LightShader,"light_x"); msy=shader_get_uniform(LightShader,"light_y"); tex=shader_get_uniform(LightShader,"TextureSizeX"); tey=shader_get_uniform(LightShader,"TextureSizeY"); bex=shader_get_uniform(LightShader,"BackgroundSizeX"); bey=shader_get_uniform(LightShader,"BackgroundSizeY"); pow=shader_get_uniform(LightShader,"light_pow"); lr=shader_get_uniform(LightShader,"light_r"); lg=shader_get_uniform(LightShader,"light_g"); lb=shader_get_uniform(LightShader,"light_b"); gamma=shader_get_uniform(LightShader,"gamma"); world = shader_get_sampler_index(LightShader, "worldTexture"); back = shader_get_sampler_index(LightShader, "backTexture"); shader_set(LightShader); texture_set_stage(world, surface_get_texture(view_surface_id[0])); texture_set_stage(back, background_get_texture(background0)); shader_set_uniform_f(tex,view_wview[0]); shader_set_uniform_f(tey,view_hview[0]); shader_set_uniform_f(bex,view_wview[0]); shader_set_uniform_f(bey,view_hview[0]); shader_set_uniform_f(msx,mouse_x); shader_set_uniform_f(msy,mouse_y); shader_set_uniform_f(pow,100); shader_set_uniform_f(lr,55.0); shader_set_uniform_f(lg,55.0); shader_set_uniform_f(lb,55.0); draw_surface(global.viewsurface,view_xview[0],view_yview[0]); shader_reset(); Key Release Event for Key: end the game Btw. Room ma view0 1024x1024(rozmiary room'a), background0 jest cały biały.
-
Wyostrzanie obrazu jak w edytorze grafik
micha_i odpowiedział(a) na micha_i temat w Pytania zaawansowanych
Dzięki wielkie za pomoc. -
Witam wszystkich po długiej przerwie. Chciałbym się zapytać, czy istnieje jakiś DLL, dzięki któremu mogę na przykład narysować obraz, ale wyostrzony? (W edytorze grafiki zakładka Image>>Sharpen , chodzi o to, że będę wczytywał obraz z pliku, i muszę mieć nad nim 100% kontroli) Z góry dziękuję.
-
Witam. Mam taki oto problem: napisałem sobie podstawowy serwer i klient do gierki(na razie nic w niej nie ma). Klient działa normalnie,jak należy. Jednak z serwerem jest problem. Po włączeniu go, od razu jest zwieszony, ale klient może się do niego połączyć, wtedy klient też się zwiesza.(Przekazywanie lagów netem? Szczyt technologii...) Wrzucam paczkę z serwerem i klientem: Projekt Za nic nie mogę znaleźć miejsca, w którym zrobiłem błąd. Z góry dzięki za pomoc. Ps. Używałem artykułu: Art.
-
micha_i obserwuje zawartość Zwieszanie się serwera 39DLL
-
Fakt, mój błąd. Dzięki za pomoc.
-
Teraz to mi żadnego nie wypisuje: te kropki powinny być połączone w wielokąt. W tej niepołączonej na dole pisze mi, że zmienna pierwszy to jej własne Id. Projekcik: projekt
-
Jest z tym mały problem. Chcę to wykorzystać do robienia "wielokątów", z tworzeniem linii między tym obiektem, a dwoma najbliższymi. Ale jeśli ustawie te obiekty w room'ie, to po starcie wyrzuca mi w jednym z nich błędy, i nie rysuje linii. Myślę, że jest to spowodowane tym, że 2 obiekty wyłączyły obiekty, które są obiektami pierwszym i drugim dla tego wybranego obiektu. E: chyba użyje tego z GMLscripts... E2: niet, ten sam błąd :(
-
XD o tym nie pomyślałem. Dzieki wielkie.
-
Witam. Potrzebuję kodu, który zwracałby mi Id DRUGIEGO obiektu danego typu w stosunku do obiektu, w którym go włączam. Coś jak instance_nearest , tylko że zwraca drugi obiekt z kolei. Z góry dziękuję.
-
@Compi : Raczej nie, bo to ma być minecraft. Topic: Mam lekki generator,ale coś nie działa, gdy generuje mapę o szerokości 4k.
-
Nie zaczynaj od klocków,bo skończysz jak dyzmek(z góry sry) np. ja od razu zacząłem od skryptów.
-
Kingsajz Constantine Pamięć Absolutna Leon Zawodowiec(ostatnia scenka :rolleyes: ) Edward Nożycoręki Jestem Bogiem Jestem Legendą(również ostatnia scenka :rolleyes: )
-
View_object[numer view'a]
-
1:Edytor graficzny game maker'a działa w systemie klatek. 2:Poucz się czegoś takiego jak kolizje 3:Kolizje! Człowieku,zanim będziesz chciał robić gry, pościągaj se kilka przykładów,wkuj dokumentację na pamięć, a nie będziesz się wszystkiego pytał. E:lub pisz skrypt z użyciem jakiejś funkcji,której nie znasz,i sprawdź, co ci wyrzuci ^_^ (ja sie tak uczyłem)