ã¢ã€ãã¢
ç°¡åã«èšãã°ããã¹ããšãã§ã¯ãã¯ç»é¢å šäœãèŠãé·æ¹åœ¢ã®ããªãŽã³ã§ãã ãããŠãç§ãã¡ã®ä»äºã¯ãã®åãç«ãŠå°ãçè²ããããšã§ãã
ã泚æ
æé©ãªæ¹æ³ã§å¹æãå®çŸãããšããç®æšãèªåèªèº«ã«èšå®ããªãã£ãããšãçŽã¡ã«äºçŽããŠãã ããã ãŸããåŸåŠçã䜿çšããŠãããæãç°¡åã§ç解ããããæ¹æ³ã§è¡ãæ¹æ³ã瀺ãããã£ãã®ã§ãã ãã ãããã®å¹æãå®è£
ããããã®ãããšã¬ã¬ã³ããªã¢ãããŒããç¥ã£ãŠããå Žåã¯ãã³ã¡ã³ãã§å
±æããŠãã ãã:)
å¿ èŠãªã®ã¯ïŒ
- ã·ãŒã³ãã¬ã³ããªã³ã°ããŸãã
- ãã£ã©ã¯ã¿ãŒã®äžå¯èŠéšåã®ãã¹ã¯ãååŸããŸãã
- ãã¹ã¯ãããè²ã§ãã€ã³ãããã·ãŒã³ã¬ã³ããŒã«é©çšããŸãã
äžå¯èŠéšåã®ãã¹ã¯ãååŸããã«ã¯ã次ã®ããšãã§ããŸãã
- 深床ãã¹ãããªã³ã«ããŠãçœããã¯ã»ã«ã衚瀺ããã·ã³ãã«ãªã·ã§ãŒããŒã䜿çšããŠãã£ã©ã¯ã¿ãŒãåã¬ã³ããªã³ã°ããŸãïŒãã®ããã«ããŠããã£ã©ã¯ã¿ãŒã®å¯èŠéšåã®çœé»ãã¯ã¹ãã£ãŒãååŸããŸãïŒã
- åãã·ã§ãŒããŒã䜿çšããŠãã£ã©ã¯ã¿ãŒãåã¬ã³ããªã³ã°ããŸããã深床ãããã¡ãŒã¯ãã§ã«ç¡èŠããŠããŸãïŒãã®ããã«ããŠããã£ã©ã¯ã¿ãŒå šäœã®çœé»ãã¹ã¯ãååŸããŸãïŒã
- ããå Žæã§ãã¹ã¯å šäœãçœã§ãå¯èŠéšåã®ãã¹ã¯ãé»ã®å Žåãããã¯ãã£ã©ã¯ã¿ãŒã®æãŸããéå¯èŠéšåã§ãã
åèšã§ã3ã€ã®ãã¯ã¹ãã£ãååŸããŠçµã¿åãããå¿ èŠããããŸãã
å®è£
å®æãããã¢ã¯ãã¡ã ïŒOpenGLïŒã éå§ããã«ã¯ãSTART_DEMO.batã䜿çšããŸãã Dataããã³CoreDataãã©ã«ããŒã«ã¯æšæºã®ãšã³ãžã³ãªãœãŒã¹ãå«ãŸãããã¹ãŠã®æ°èŠ/å€æŽããããã¡ã€ã«ã¯MyDataã«é 眮ãããŸãã ãŸããäŒçµ±ã«ãããšããšã³ãžã³ã®äœ¿çšããŒãžã§ã³ ã ãããŠä»ããã詳现ã«:)
ã©ã³ãããŒã®èªã¿èŸŒã¿
以åã¯ããããªã¢ã«ã®ãã¹ã®é åºãèšå®ããæ¹æ³ãšããŠããã»ãŒãžã®ã¬ã³ããªã³ã°ãæ€èšããŠããŸããïŒã»ã¯ã·ã§ã³ãã¬ã³ããªã³ã°ããã»ã¹ãïŒã ããããã¬ã³ããŒãããã¯ä»ã®æ©èœãå®è¡ããŸã ã
æšæºã¬ã³ããŒã¯CoreData / RenderPathsãã©ã«ããŒã«ãããŸã ã ããã©ã«ãã§ã¯ã Forward.xmlã䜿çšãããŸãã ã¬ã³ããªã³ã°ãå€æŽããã«ã¯ãããã€ãã®æ¹æ³ããããŸãã
- ãã¥ãŒããŒããäœæããåã« ãRenderer :: SetDefaultRenderPathïŒïŒé¢æ°ãåŒã³åºããŸãã ãã®å ŽåãåŸç¶ã®äœæããããã¥ãŒããŒãã¯æå®ãããã©ã³ãããŒã䜿çšããŸãã ãã®ã¡ãœããã¯ãã¢ã§äœ¿çšãããŸãã
- ãšã³ãžã³ãã©ã¡ãŒã¿ãŒã§ã¬ã³ããŒãã©ã¡ãŒã¿ãŒãæå®ããŸãïŒã¢ããªã±ãŒã·ã§ã³ã®èµ·åæã«ã³ãã³ãã©ã€ã³ãã©ã¡ãŒã¿ãŒã䜿çšããããããã°ã©ã ããã¹ãã®engineParameters_ã䜿çšïŒã ãã®å Žåãåãé¢æ°Renderer :: SetDefaultRenderPathïŒïŒãåŒã³åºãããŸãã
- ãã¥ãŒããŒããäœæããåŸ ããã¥ãŒããŒã:: SetRenderPathïŒïŒé¢æ°ã䜿çšããŸãã
- ãšãã£ã¿ãŒã§ã¯ã衚瀺>ãšãã£ã¿ãŒèšå®ãŠã£ã³ããŠã§ã¬ã³ããªã³ã°ãæå®ã§ããŸãã
ã©ã³ãããŒã¯ãã¡ã€ã«ããããŒãã§ããã ãã§ãªããã¢ããªã±ãŒã·ã§ã³äžã«åçã«å€æŽããããšãã§ããŸãã ããšãã°ãData / PostProcessãã©ã«ããŒãããã¹ããšãã§ã¯ããé©çšããå ŽåãçŸåšã®ã¬ã³ããŒã«ã³ãã³ããè¿œå ããã ãã§ãã ã€ãŸããããã€ãã®ãã¡ã€ã«ïŒãŸãã¯ãã¡ã€ã«ïŒã®å 容ãData / PostProcessããCoreData / RenderPathsã®ããã€ãã®ãã¡ã€ã«ã®æåŸã«åçŽã«ã³ããŒã§ããŸãã
https://github.com/1vanK/Urho3DHabrahabr06/blob/master/MyData/Scripts/Main.as
void Start() { ... renderer.SetDefaultRenderPath(cache.GetResource("XMLFile", "RenderPaths/MyForward.xml")); Viewport@ viewport = Viewport(scene_, cameraNode.GetComponent("Camera")); viewport.renderPath.Append(cache.GetResource("XMLFile", "PostProcess/FXAA3.xml")); renderer.viewports[0] = viewport; }
ããã§MyForward.xmlã¬ã³ãã©ãŒãããŒããã ïŒForward.xmlã«åºã¥ããŠããŸãïŒããã«ã¹ã¯ãªãŒã³ã¢ã³ããšã€ãªã¢ã¹FXAA3.xmlã®å¹æãè¿œå ãããŸãã
ã¬ã³ããŒã¿ãŒã²ãã
ã¬ã³ããŒãã¹ã¯ãrendertargetãšã³ãã³ãã§æ§æãããŸãã
倧ãŸãã«èšããšãã¬ã³ãã¬ãã¿ãŒã¯ãå ¥åãšããŠã³ãã³ãã«è»¢éã§ãããã¯ã¹ãã£ã§ãããéããŸãåæ§ã§ããããŒã ã¯èªåã®äœæ¥ã®çµæã衚瀺ã§ããŸãã
https://github.com/1vanK/Urho3DHabrahabr06/blob/master/MyData/RenderPaths/MyForward.xml
<renderpath> <rendertarget name="visiblemask" tag="WallHack" sizedivisor="1 1" format="a" /> <rendertarget name="fullmask" tag="WallHack" sizedivisor="1 1" format="a" /> ... </renderpath>
ããã§ã¯2ã€ã®ãã¹ã¯ã宣èšãããŠããŸãïŒvisiblemaskã¯æåã®å¯èŠéšåã®ãã¹ã¯ã§ãããfullmaskã¯æåå šäœã®ãã¹ã¯ã§ãïŒã
nameãã©ã¡ãŒã¿ãŒã¯ãã¢ã¯ã»ã¹å¯èœãªã¬ã³ããŒã¿ãŒã²ããã®ååãå®çŸ©ããŸãã
tagãã©ã¡ãŒã¿ãŒã䜿çšãããšãRenderPath :: SetEnabledïŒïŒããã³RenderPath :: ToggleEnabledïŒïŒé¢æ°ã䜿çšããŠãã²ãŒã å ã§åçã«ãªã³ããã³ãªãã«ã§ããã°ã«ãŒãå ã®ã¬ã³ããŒã¿ãŒã²ãããšããŒã ãå®çŸ©ã§ããŸãã ãã¹ãŠã®æšæºçãªãã¹ããšãã§ã¯ãã«ã¯ç¬èªã®ã¿ã°ãããããšã«æ³šæããŠãã ããã ãããã£ãŠãããšãã°ãã¡ãã¥ãŒãéãããšãã«ã®ã¿ç»é¢ããŒããããšãã§ããŸãã ããŠããã¢ã§ã¯ãã¹ããŒã¹ããŒãæŒããšãåéæã®å¹æãåãæ¿ãããŸãã
https://github.com/1vanK/Urho3DHabrahabr06/blob/master/MyData/Scripts/Main.as
void HandleUpdate(StringHash eventType, VariantMap& eventData) { ... if (input.keyPress[KEY_SPACE]) renderer.viewports[0].renderPath.ToggleEnabled("WallHack"); ... }
sizeivisorãã©ã¡ãŒã¿ãŒã䜿çšãããšããã¥ãŒããŒãã®ãµã€ãºãšã¯ç°ãªããµã€ãºã®ã¬ã³ããŒã¿ãŒã²ãããäœæã§ããŸã ã ãã¢ã§ã¯ããã¹ã¯ã®ãµã€ãºã¯ãŠã£ã³ããŠã®ãµã€ãºãšåãã§ãïŒãã¥ãŒããŒããã²ãŒã ã®ãŠã£ã³ããŠå šäœãå ããããïŒã ãã ããããšãã°ã Bloom.xmlã®ãã¹ããšãã§ã¯ãã§ã¯ãããã©ãŒãã³ã¹äžã®çç±ããã ã¬ã³ããªã³ã°ã¿ãŒã²ããã®ãµã€ãºã¯ãã¥ãŒããŒãã®ãµã€ãºã®4åå°ãããªã£ãŠããŸãïŒéãåãããã°ããŒã«ã¯é«è§£å床ã¯å¿ èŠãããŸããïŒã
å®éã formatãã©ã¡ãŒã¿ãŒã¯ã¬ã³ããŒã¿ãŒã²ããã®åœ¢åŒãå®çŸ©ããŸãã ãrgbãããã³ãrgbaã圢åŒãæããã䜿çšãããŸããããã®å Žåã1ã€ã®ãã£ãã«ã§ãã¹ã¯ãä¿åããã®ã«ååã§ãããããåäžãã£ãã«ã®ãaã圢åŒã䜿çšãããŸãã ãã¥ã¢ã³ã¹ããããŸãã OpenGL 2ã§ã¯ããã©ãŒããããaãã¯GL_ALPHAïŒã¢ã«ãã¡ãã£ãã«ã§äœæ¥ããå¿ èŠãããããšãæå³ããŸãïŒã«å¯Ÿå¿ããOpenGL 3ã§ã¯ãGL_R8ã䜿çšããŸãïŒã¬ãããã£ãã«ã§äœæ¥ããå¿ èŠããããŸãïŒã ã·ã§ãŒããŒãæ€èšãããšãã«ããã«æ»ããŸãã
ã¬ã³ããŒã¿ãŒã²ããã¯ããã¡ã€ã«ã®å é ã§å®£èšããå¿ èŠããªãããšã«æ³šæããŠãã ããã ãã¡ã€ã«ã®çµããã§ããã©ãã«ã§ã眮ãããšãã§ããŸãã ã³ãã³ããå®è¡ããåã«ããã¹ãŠã®ã¬ã³ããŒã¿ãŒã²ãããäœæãããããšãä¿èšŒãããŠããŸãã
ãããŠããã«å¿ èŠãªæåã®ããŒã ã«ã€ããŠ- æ確㫠ã
https://github.com/1vanK/Urho3DHabrahabr06/blob/master/MyData/RenderPaths/MyForward.xml
<renderpath> ... <command type="clear" tag="WallHack" color="0 0 0 0" output="visiblemask" /> <command type="clear" tag="WallHack" color="0 0 0 0" output="fullmask" /> ... </renderpath>
ããã§ã¯ãã¹ãŠãç°¡åã§ã-ã¬ã³ããŒã¿ãŒã²ããã¯é»ã§å¡ãã€ã¶ãããŠããŸãã åãã¬ãŒã ã§ãã£ã©ã¯ã¿ãŒã®çœããã¹ã¯ãæ°ããäœçœ®ã«æç»ããããããã¯ãªã¢ããã®ãå¿ãããšãçœãã«ãŒããçºçããŸãã
åºåãã©ã¡ãŒã¿ãŒãååšããªãå Žåããã¥ãŒããŒãã¯ã¯ãªã¢ãããŸãã éæãªãã¥ãŒããŒãã®èæ¯ãå¿ èŠãªå Žåãªã©ãã¯ãªãŒã³ã¢ãããæå³çã«çç¥ãããå ŽåããããŸã ã
ã·ãŒã³ãã¹ããŒã
ãããã¯ã ååã®èšäºã§èšåããããã®ãšåãã¬ã³ããŒããã»ãŒãžã§ãã
https://github.com/1vanK/Urho3DHabrahabr06/blob/master/MyData/RenderPaths/MyForward.xml
<renderpath> ... <command type="scenepass" tag="WallHack" pass="visiblemask" output="visiblemask" /> <command type="scenepass" tag="WallHack" pass="fullmask" output="fullmask" /> ... </renderpath>
ããã«2ã€ã®ãã¹ãè¿œå ãããŸãã ããã»ãŒãžãå®æãããã«ã¯ ããã£ã©ã¯ã¿ãŒã®ãããªã¢ã«ã䜿çšãããã¯ããã¯ã«ãå«ãŸããŠããå¿ èŠããããŸãã
https://github.com/1vanK/Urho3DHabrahabr06/blob/master/MyData/Techniques/DiffNormalWallHack.xml
<technique ...> ... <pass name="visiblemask" vs="Mask" ps="Mask" depthwrite="false" depthtest="equal" psexcludes="PACKEDNORMAL" /> <pass name="fullmask" vs="Mask" ps="Mask" depthwrite="false" depthtest="always" psexcludes="PACKEDNORMAL" /> </technique
ã¬ã³ããŒãã¹ã§ãã¹ã宣èšãããšããããã®ãã¹ã®é åºã決ãŸãããã¯ããã¯ã®ãã¹ã«ããã䜿çšãããç¹å®ã®ã·ã§ãŒããŒã決ãŸããŸãã ãã®å Žåãããã¯çœããã¯ã»ã«ãåºåããæå°ã®ãã¹ã¯ã·ã§ãŒããŒã§ãã
visiblemaskããã³fullmaskãæž¡ããããŸã§ã«ã深床ãããã¡ã¯ãã§ã«ãã£ã±ãã§ãã ããã«äœããæžãå¿ èŠã¯ãããŸããããããã䜿ãã ãã§ãã ãããã£ãŠãäž¡æ¹ã®ãã¹ã§ã depthwriteãã©ã¡ãŒã¿ãŒã¯ falseã«èšå®ãããŸã ã ãã ãã depthtestãã©ã¡ãŒã¿ãŒã¯ç°ãªããŸãã depthtest =â alwaysâã®å Žåã深床ãããã¡ã¯ç¡èŠãããå®å šãªæåãã¹ã¯ãæç»ãããŸãã depthtest =â equalâã®å€ã§ã深床ãã¹ãã¯ãZãããã¡ã®å€ã衚瀺ããããžãªã¡ããªã®æ·±åºŠãšäžèŽããå Žåãã€ãŸãåããžãªã¡ããªãå床ã¬ã³ããªã³ã°ãããå Žåã«ã®ã¿æž¡ãããŸãã
ã¯ã¯ããããŒã
ç»é¢ãéããé·æ¹åœ¢ã®ããªãŽã³ã衚瀺ããã®ã¯ãã®ã³ãã³ãã§ããã¹ããšãã§ã¯ãïŒããããç»é¢ã¯ã¯ããïŒãå®è£ ããããã«èšèšãããŠããŸãã
https://github.com/1vanK/Urho3DHabrahabr06/blob/master/MyData/RenderPaths/MyForward.xml
<renderpath> ... <command type="quad" tag="WallHack" vs="WallHack" ps="WallHack" output="viewport"> <texture unit="diffuse" name="viewport" /> <texture unit="normal" name="fullmask" /> <texture unit="specular" name="visiblemask" /> </command> </renderpath>
ããã§ã¯ãã¯ã¯ããã®æç»ã«WallHackã·ã§ãŒããŒã䜿çšããã3ã€ã®ãã¯ã¹ãã£ããã®ã·ã§ãŒããŒã®å ¥åã«éä¿¡ãããŸãïŒãã¥ãŒããŒãã¯ã¬ã³ããªã³ã°ãããã·ãŒã³ãfullmaskã¯ãã£ã©ã¯ã¿ãŒã®ãã«ãã¹ã¯ãvisiblemaskã¯ãã£ã©ã¯ã¿ãŒã®å¯èŠéšåã®ãã¹ã¯ã§ãïŒã ãã¯ã¹ãã£ãŠãããã®ååïŒæ¡æ£ãéåžžãããã³é¡é¢åå°ïŒãšæ··åããªãã§ãã ããã ããããä»ããŠäœã§ãèªç±ã«è»¢éããã·ã§ãŒããŒã§å¥œããªãã®ã䜿çšã§ããŸãã
WallHackã·ã§ãŒããŒã¯éåžžã«ã·ã³ãã«ã§ãã
1ïŒã¬ã³ããªã³ã°ãããã·ãŒã³ã®ãã¯ã»ã«è²ãååŸããŸãïŒ ã¬ã³ããªã³ã°ãã¹ã§ã¯ãæ¡æ£ãã¯ã¹ãã£ãŠããããä»ããŠã·ãŒã³ã¬ã³ããªã³ã°ãã¬ã³ããªã³ã°ããããšãæãåºããŸã ïŒã
https://github.com/1vanK/Urho3DHabrahabr06/blob/master/MyData/Shaders/GLSL/WallHack.glsl
void PS() { vec3 viewport = texture2D(sDiffMap, vTexCoord).rgb; ... }
2ïŒäž¡æ¹ã®ãã¹ã¯ãååŸããŸãã
https://github.com/1vanK/Urho3DHabrahabr06/blob/master/MyData/Shaders/GLSL/WallHack.glsl
void PS() { ... #ifdef GL3 float fullmask = texture2D(sNormalMap, vTexCoord).r; float visiblemask = texture2D(sSpecMap, vTexCoord).r; #else float fullmask = texture2D(sNormalMap, vTexCoord).a; float visiblemask = texture2D(sSpecMap, vTexCoord).a; #endif ... }
äžèšã®ãã¥ã¢ã³ã¹ã«æ»ããšãOpenGLã®ããŒãžã§ã³ã«å¿ããŠãã·ã³ã°ã«ãã£ã³ãã«ãã¯ã¹ãã£ã䜿çšããå Žåãç°ãªããã£ã³ãã«ã䜿çšããããšãããããŸãã
ãœãŒã¹/ Urho3D /ã°ã©ãã£ãã¯ã¹/ OpenGL / OGLGraphics.cpp
unsigned Graphics::GetAlphaFormat() { #ifndef GL_ES_VERSION_2_0 // Alpha format is deprecated on OpenGL 3+ if (gl3Support) return GL_R8; #endif return GL_ALPHA; }
ããŒããŠã§ã¢ãOpenGL 3ããµããŒãããŠããå Žåããã®ããŒãžã§ã³ãããã©ã«ãã§äœ¿çšãããŸãã ãã¹ãã®ç®çã§ã-gl2ã³ãã³ãã©ã€ã³ãªãã·ã§ã³ã䜿çšããŠãšã³ãžã³ã«OpenGL 2ã䜿çšãããããšãã§ããŸãã
3ïŒæåŸã«ã3ã€ã®ãã¯ã¹ãã£ãã¹ãŠãçµåãããŸãã
https://github.com/1vanK/Urho3DHabrahabr06/blob/master/MyData/Shaders/GLSL/WallHack.glsl
void PS() { ... if (fullmask == 0.0 || visiblemask > 0.0) gl_FragColor = vec4(viewport, 1.0); else gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); }
ãã®å Žæã§ãã¹ã¯å šäœãé»ã®å ŽåïŒã€ãŸãããã©ã°ã¡ã³ãããã£ã©ã¯ã¿ãŒã«å±ããŠããªãå ŽåïŒãã¬ã³ããªã³ã°ãããã·ãŒã³ã®ãã¯ã»ã«ã衚瀺ããŸãã ããã§ãªããã°ã å¯èŠãã¹ã¯ãé»ã§ãªãå ŽåïŒã€ãŸãããã©ã°ã¡ã³ãããã£ã©ã¯ã¿ãŒã®å¯èŠéšåã«å±ããŠããå ŽåïŒãã¬ã³ããªã³ã°ãããã·ãŒã³ïŒãã¹ãŠã®æ å ã®ãã£ã©ã¯ã¿ãŒã®å¯èŠéšåãæ³ç·ããããªã©ïŒãã¬ã³ããªã³ã°ããŸãã ããã§ãªãå Žåã3çªç®ã®æåŸã®ãªãã·ã§ã³ãæ®ããŸã-ãã©ã°ã¡ã³ãã¯ãã£ã©ã¯ã¿ãŒã®äžå¯èŠéšåã«å±ããŸãã ããã§ã¯èµ€ã§æç»ããŸãã
åºåäžéãã¯ã¹ãã£
ãããã°ã®ç®çã§ãäžéã¬ã³ããŒã¿ãŒã²ãããç»é¢ã«è¡šç€ºãããå ŽåããããŸãã æšæºã®CopyFramebufferã·ã§ãŒããŒã䜿çšãããšäŸ¿å©ã§ãã ã¬ã³ããªã³ã°ã®æåŸã«è¿œå ããã ãã§ãïŒ
<renderpath> ... <command type="quad" vs="CopyFramebuffer" ps="CopyFramebuffer" output="viewport"> <texture unit="diffuse" name=" " /> </command> </renderpath>
ãã®ã·ã§ãŒããŒã¯ãæ¡æ£ãã¯ã¹ãã£ãŠããããä»ããŠãrgbïŒaïŒåœ¢åŒã§ç®çã®ãã¯ã¹ãã£ãäžããããšãæåŸ ããŠããŸãã åäžãã£ãã«ãã¹ã¯ã®åºåã«ã¯é©ããŠããŸããã ãããã£ãŠãå ¥åã§ãaã圢åŒã®ãã¯ã¹ãã£ãå¿ èŠã«ãªãããã«ããã®ã·ã§ãŒããŒãå°ãå€æŽããŸããïŒ ShowATexture.glslã·ã§ãŒããŒãåç §ïŒã 圌ã®å©ããåããŠããã®èšäºã®ã¹ã¯ãªãŒã³ã·ã§ãããäœæãããŸããã
<renderpath> ... <command type="quad" vs="ShowATexture" ps="ShowATexture" output="viewport"> <texture unit="diffuse" name="fullmask" /> </command> </renderpath>
ãã®ä»ã®äŸ
ã«ã¡ã©ãåããšãã«ãŒããïŒã¢ãŒã·ã§ã³ãã©ãŒïŒïŒ
Left 4 DeadãšDota 2ã®ã¹ãããŒã¯ ïŒ
Doom 3ã®ããã«ãªããžã§ã¯ããå解ããŸã ã
Soft Particles ã æ¹è¯ããããŠã©ãŒã¿ãŒã·ã§ãŒã㌠ã SSAOãªã©ã å ¬åŒãã©ãŒã©ã ãã芧ãã ãã ã