.[ ČeskéHry.cz ].
GLSL - 2D efekty, bump, shock, apod?

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Crypton



Založen: 14. 05. 2009
Příspěvky: 306
Bydliště: The Void

PříspěvekZaslal: 25. srpen 2010, 22:43:00    Předmět: GLSL - 2D efekty, bump, shock, apod? Odpovědět s citátem

Zdravím všechny spolubojovníky Smile

včera jsem si začal poprvé "hrát" se shadery, protože jsem si naivně myslel že bych přes ně mohl přidat nějaké super 2d efekty do mé 2D hry, takže jsem zkouknul pár návodů, a implementoval si nějaké ty třídy pro práci se shadery, jako např. ShaderProgram, VertexShader a FragmentShader.

Problem je jednoduchý, našel jsem na netu ukázky různých efektů, jako např. shockwave, ripple, apod, ale nevím sakra jak je použit v mé hře Very Happy (Jde mi o to jen implementovat jednoduché efekty, na shadery zapomenout, a nechat to pak uživatele ať si to upraví/přepíše. (práce až nad hlavu, takže si nemůžu dovolit se to začít učit do hloubky).)

Zatím umím jen shadery načíst, zkompilovat, připojit, slinkovat s programem a pak zavolat use. Taky umím nastavit a zjistit hodnotu uniform proměnných, ale to všechno mi je zatím prd platný.

Zajímalo by mě tedy, jak a kdy ty shadery použit. Tedy jestli by mi někdo mohl doplnit nějaké kroky v následujícím algoritmu:

citace:
Inicializace:
-Načtu shadery, zkompiluju, atd.
-Použiju program, přes glUseProgramObjectARB

Renderovací smyčka:
-Renderuju textury přes quady
-SwapBuffers


Zkoušel jsem třeba tento jednoduchý vertex shader:
citace:
void main(void)
{
gl_Position = ftransform();
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_FrontColor = gl_Color;
}


Vlastně to nic nedělá, ale funguje to, na rozdíl od toho shockwave efektu, kde vidím jen černou obrazovku.

Zde jsou shadery a ukázky pro ten shockwave efekt:
http://www.geeks3d.com/20091116/shader-library-2d-shockwave-post-processing-filter-glsl/

nebo

http://empire-defense.crystalin.fr/blog/2d_shock_wave_texture_with_shader


Třeba ten první příklad, má definované tyto uniformy:

citace:
uniform sampler2D sceneTex; // 0
uniform vec2 center; // Mouse position
uniform float time; // effect elapsed time
uniform vec3 shockParams; // 10.0, 0.8, 0.1


Všechny umím nastavit, jen nevím význam té proměnné sceneTex, kde jí v mém kódu nastavit a jak použít.

Napadlo mě že to je textůra vytvořená z načteného frame bufferu, po dokončení renderování, ale jsem zelenáč, takže jen hádám.

Předem děkuji za případné odpovědi či odkazy.
Mějte se fajn.
Smile

PS: Málem bych zapomněl: myslíte že by přes shadery šly implementovat efekty jako např. 2D bump mapping? nebo pohyb 2D vody či 2D déšť?

Viz tyto linky:
http://www.flipcode.com/archives/The_Art_of_Demomaking-Issue_07_Bump_Mapping.shtml
http://sol.gfxile.net/gp/ch18.html
http://www.gaanza.com/blog/2d-rain-effect/
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 26. srpen 2010, 08:03:00    Předmět: Odpovědět s citátem

sceneTex bude s největší pravděpodobností texture, kde je obraz scény. Buď jí můžeš vytvořit zkopírováním framebufferu do textury, nebo lépe, rovnou do ní rendrovat. V OpenGL je na to několik technik, ale to je jiná pohádka. Tim, že tu texturu namapuješ na quad nějak zdeformovaně pak vytvoříš nějaký efekt.

Pohyb 2D vody, 2D déšť...na to všechno můžeš (a nemusíš) shadery použít.
_________________
Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Crypton



Založen: 14. 05. 2009
Příspěvky: 306
Bydliště: The Void

PříspěvekZaslal: 26. srpen 2010, 08:31:37    Předmět: Odpovědět s citátem

Aha, super, hned to zkusím, díky moc Wink

btw, tím renderováním přímo do textury myslíš přes glCopyTexImage2D a nebo vytvořením kontextu v bitmapě? (myslím tím "vlajku" PFD_DRAW_TO_BITMAP u struktury PIXELFORMATDESCRIPTOR)
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Ladis



Založen: 18. 09. 2007
Příspěvky: 1537
Bydliště: u Prahy

PříspěvekZaslal: 26. srpen 2010, 09:07:58    Předmět: Odpovědět s citátem

Těch technik je víc, jsou i novější a rychlejší.

http://www.google.cz/search?q=opengl+render+to+texture
_________________
Award-winning game developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



Založen: 28. 07. 2007
Příspěvky: 1050

PříspěvekZaslal: 26. srpen 2010, 09:13:46    Předmět: Odpovědět s citátem

glCopyTexImage2D() je prvy sposob. druhy je vyuzitie P-buffer ktory je ale dnes uz zastaraly a nakoniec FBO co je priame renderovanie do textury.

odporucam ist cestou FBO kedze je to moderne a dobre podporovane rozsirenie.

http://www.songho.ca/opengl/gl_fbo.html
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
pet



Založen: 11. 08. 2010
Příspěvky: 10

PříspěvekZaslal: 26. srpen 2010, 09:35:00    Předmět: Odpovědět s citátem

Sampler (ať už 2d, 3d či jiný) v podstatě určuje odkud a jak se bude načítat textura. Odkud říká z které texturovací jednotky a jak říká ta přípona. Typický kód tedy vypadá tak, že si zjistíš adresu sampleru v shaderu:
kód:
g_sceneTex = glGetUniformLocation(program, "sceneTex");


Následně vybereš aktivní texturovací jednotku a připojíš texturu:
kód:
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, sceneTexture);


A do shaderu pak pošleš číslo jednotky, kde se nachází ta správná textura:
kód:
glUniform1i(g_sceneTex, 0);


V shaderu pak už přistupuješ přímo k textuře pomocí odpovídající funkce (tedy v případě sampler2D -> texture2D):
kód:
fragColor = texture2D(sceneTex, texCoord);
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Crypton



Založen: 14. 05. 2009
Příspěvky: 306
Bydliště: The Void

PříspěvekZaslal: 26. srpen 2010, 11:09:00    Předmět: Odpovědět s citátem

pet:
Tak už jsem to zprovoznil, díky moc za vysvětlení, moc mi to pomohlo. (Měl jsem problém v tom že jsem používal sampler2D a texture2D místo Rect verze, tedy sampler2DRect a texture2DRect.)
Wink

nou:
Vyřešil jsem to pomocí glCopyTexImage2D, ale kouknul jsem se na ty FBO, a určitě to taky zkusím, vypadá to že to nevyžaduje nějaké drastické změny, takže taky velice díky Wink

------------------------

Ještě bych se chtěl zeptat, jestli neví někdo o nějaké kolekci či sbírce shaderů pro GLSL.

Já jsem našel docela dobrou sbírku ve Visualization Library:
http://www.visualizationlibrary.com/jetcms/node/4

Přímo odkaz na stažení, shadery jsou ve složce data/glsl/
http://www.visualizationlibrary.com/downloads/data-2009.08.804.tar.bz2

Dále pak jsou nějaké shadery zde:
http://www.geeks3d.com/category/geeks3d/shader-library-geeks3d/
http://www.facewound.com/tutorials/shader1/
http://igortrindade.wordpress.com/2010/04/23/fun-with-opengl-and-shaders/

Možná by někdo věděl i o jiných zdrojích? Wink

PS: Další zdroje co jsem našel:
http://arunan.50webs.com/cs594final.html - Vytvoření bilboardu, včetně zdrojáků a obrázků.

http://opengl-doc.com/Sams-OpenGL.SuperBible.Third/0672326019/ch23lev1sec2.html - efekty, jako např. blur, sharpen, edge detect, apod.

http://machinesdontcare.wordpress.com/2008/03/12/supershape-2d-glsl-rewrite/ - Superformula 2D effect

http://www.curious-creature.org/2007/02/20/fast-image-processing-with-jogl/ - Bright pass filter, testováno, funkční.

http://www.foliativ.net/book/index.php?post/2006/07/10/118-fun-nor-not-with-shaders - bloom, glow, dynamic cube mapping a další, včetně zdrojáků a dema

http://www.swiftless.com/tag/glsl - docela hodně příkladů, včetně zdrojáků

http://www.quakeworld.nu/forum/viewtopic.php?id=3642 - toon shading (zdroják, až úplně dole)

http://myheroics.wordpress.com/2009/07/09/glsl-blinn-phong-gouraud-shader/ - Blinn Phong / Gouraud Shader

http://www.geeks3d.com/20100423/ruin-island-opengl-glsl-demo-with-full-source-code/ - motion blur, depth of field, parallax occlusion mapping, apod, včetně zdrojáků, video a dema

http://www.irrlicht3d.org/wiki/index.php?n=Main.Shaders - sbirka různý shaderů, glsl a hlsl

http://www.ozone3d.net/tutorials/image_filtering_p2.php - convolution kernels, jako např. gaussian blur apod.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna