2ãæåãç§ã¯GitHubã«WebQuakeã®æåã®ããŒã¿ãã«ããæçš¿ããŸãããããã¯WebGLãä»ããŠãã©ãŠã¶ã§å®è¡ãããæåã®Quakeã®ç§»æ€çã§ãã
ãã®æçš¿ã§ã¯ããšã³ãžã³ã®éçºãšå®è£ ã®è©³çŽ°ã«ã€ããŠèª¬æããŸããã°ã©ãã£ãã¯ã¹ã®äœææ¹æ³ããµãŠã³ãã®åäœæ¹æ³ãªã©ã§ãã
ããããã¹ãŠå§ãŸã£ãæ¹æ³
2012幎9æã«çŸåšã®åœ¢åŒã§WebQuakeã®éçºãéå§ããŸããã ãããããã®ã¢ã€ãã¢ã¯ãã®ãã£ãšåã«ç§ã«äŒãããŸããã
JavaScriptã§äœãèããŠããªã2011幎ã®å€ã«ãç§ãåããŠäŒŒããããªããšãããããšã«æ±ºãããšãã ãããããQuakeã³ãŒããèŠãã«ãç®ã§ãããŒããäœæããã²ãŒã ã¡ãã¥ãŒã®ã»ãã®äžéšãäœæããŸããã ãã®ããŒãžã§ã³ã§ã¯ãæååã䜿çšããŠãã€ããªããŒã¿ãåŠçããŸããïŒæµ®åå°æ°ç¹æ°ã®ããŒãµãŒã§ã¯ãäžè¬ã«Math.powã䜿çšããæåå0ãš1ã«ããããä¿æããŠããŸããïŒã WebGLã§ãããã¡ãšã·ã§ãŒããæäœããæ§è³ªãç解ããŠããªãããšãããã®ãããªååã®æµãããäžçãæã£ãããšã¯éåžžã«è¯ãããšã§ãã
次ã«ããã¡ã€ã«ã«çŽæ¥ã¢ã¯ã»ã¹ããããã«ãWebQuakeããã¹ã¯ãããã¢ããªã±ãŒã·ã§ã³ã«ããããšèããŸããã 圌ã¯HTAãšXULã®éã§éžæãå§ããŸããã ãã ããWebGLããµããŒãããŠãããã®ã¯ãããŸããã ãããã£ãŠãç§ããã®èããæåŠããŸããã
æçµçã«çŽç²ãªHTML5ã«åãæ¿ããŸããã
éçº
éå§ããæåã®ããŒã¿ãŸã§6ãæãçµéããŸããã ç§ã®èšæ¶ãæ£ãããã°ã GWT Quake 2ãäœæããã®ã«Googleã«2ãæããããŸããããGoogleã¯3ã€ã«ããŒããäœããJake2ã®åœ¢ã§ããŒã¹ãæã£ãŠããŸããããã¹ãŠã®ã³ãŒããæåã§ã³ããŒããŸããã
æåæžãæããéžæãããçç±ã¯ããšã³ãžã³å šäœã®äžè¬çãªååã«åãããŠã³ãŒããã«ã¹ã¿ãã€ãºãããã©ãŠã¶ãŠã£ã³ããŠã®ãµã€ãºã«äŸåããã«ãšã³ãžã³ãã«ã¹ã¿ãã€ãºãããã©ãŠã¶ã®äžéšã®é åïŒã°ã©ãã£ãã¯ãªã©ïŒãå ã®Quakeãšã¯å®å šã«ç°ãªãããã§ãã
ãããããã®ã¢ãããŒãã«ã¯æ¬ ç¹ããããŸãã æã ã¿ã€ããã¹ããããééã£ããªãã¬ãŒã¿ãŒã®ããã«2åæã«å ¥ããŸããïŒæåã«||ã§ã¯ãªã&&ã®ããã«å£ã«æ²¿ã£ãŠçã¹ããŒãã§ã¹ã©ã€ãããŠããŸããããããŠ2åç®ã¯===ã®ä»£ããã«ãããã¯ãŒã¯ã²ãŒã ã«ã²ã©ãçæ£ããããŸããïŒïŒ ãã·ã¹ãã å šäœãæãäžããã®ã«3é±éè²»ãããªããã°ãªããŸããã§ããã
ã¿ã€ããã¹ã®ãããããŒã¿çã®ãªãªãŒã¹ã¯éåžžã«ãã°ãå€ãããšãå€æãããªãªãŒã¹ãæ©ãããããšã¯æããã§ããã äžè¬ã«ãç§ã¯ããšããš3æãã4æã«ãªãªãŒã¹ããäºå®ã§ãããããã以éã¯å€ããå°ãªããåçã§ããããã2æã«ããŒããã¬ã€ã¢ãŠãããããšã«ããŸããã
ãµãã·ã¹ãã
ããã§ã¯ããšã³ãžã³èªäœã®è©³çŽ°ã«ç§»ããŸãããã
ã°ã©ãã£ãã¯ã¹
ãã¡ãããã°ã©ãã£ãã¯ã¬ã³ããªã³ã°ã¯WebGLãä»ããŠå®è£ ãããŸãã
ãã ããWebQuakeãGLQuakeããŒããšåŒã¶ããšã¯ã§ããŸããã ã°ã©ãã£ãã¯ãµãã·ã¹ãã ã®ã»ãŒå šäœããŒãããæžãçŽãããŸããã
WebQuakeãšGLQuakeã®äž»ãªéãã¯ãOpenGLé¢æ°ã®åºå®ã»ããã®ä»£ããã«ã·ã§ãŒããŒãšãããã¡ãŒã䜿çšããããšã§ãã WebQuakeã§ã¯ããªããžã§ã¯ãã®åã¿ã€ãïŒBSPã¢ãã«ãããªãŽã³ã¢ãã«ããã¬ãŒã€ãŒãã¹ãã©ã€ããããŒãã£ã¯ã«ã空ïŒã§ã·ã§ãŒããŒãã©ãã§ã䜿çšãããŸã-ç¬èªã®ã·ã§ãŒããŒãäœæãããŸãã
ã·ã§ãŒããŒãéããŠãDOS Quake / WinQuakeã«ååšããå¹æãè¿ãããŸããããOpenGLã®å€ãããŒãžã§ã³ã®å¶éã®ããã«ãGLQuakeããåé€ãããŸãããããšãã°ãç §ããããé åãšæããå ã®ãã¯ã¹ãã£ã§ãã
GLQuakeã§E1M1ãèµ·åããŸãã ã©ã€ãã¯æ¶ç¯ããŠããŸãã
WebQuakeã®åãå Žæã
Quakeãšã³ãžã³ã®ããã€ãã®æ©èœã«ãããã°ã©ãã£ãã¯ã®ããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸããã ããšãã°ãããªãŽã³ã¯4ã€ã®åçå æºã®ã¿ã§åæã«ç §ããããšãã§ããç §æãããã¯çœé»ãªã®ã§ã1ã€ã®ãã¯ã¹ãã£ã®ã«ã©ãŒãã£ã³ãã«ãä»ããŠäžçã®ã¬ã³ããªã³ã°ããã¯ãã«åããããšãã§ããŸããã ããŒãã®äžçã®ãã¯ã»ã«ã·ã§ãŒããŒã¯æ¬¡ã®ããã«ãªããŸãã
precision mediump float; uniform float uGamma; uniform sampler2D tTexture; uniform sampler2D tLightmap; uniform sampler2D tDlight; uniform sampler2D tLightStyle; varying vec4 vTexCoord; varying vec4 vLightStyle; void main(void) { vec4 texture = texture2D(tTexture, vTexCoord.xy); gl_FragColor = vec4(texture.rgb * mix(1.0, dot(texture2D(tLightmap, vTexCoord.zw), vec4( texture2D(tLightStyle, vec2(vLightStyle.x, 0.0)).a, texture2D(tLightStyle, vec2(vLightStyle.y, 0.0)).a, texture2D(tLightStyle, vec2(vLightStyle.z, 0.0)).a, texture2D(tLightStyle, vec2(vLightStyle.w, 0.0)).a) * 43.828125) + texture2D(tDlight, vTexCoord.zw).a, texture.a), 1.0); gl_FragColor.r = pow(gl_FragColor.r, uGamma); gl_FragColor.g = pow(gl_FragColor.g, uGamma); gl_FragColor.b = pow(gl_FragColor.b, uGamma); }
ã芧ã®ãšããããããã¯å°ãå€ãã£ãã¿ã¹ã¯ã®ããã«ããã§äœ¿çšãããŸãã4ã€ã®ã©ã€ããããã«ã0ã25ãŸãã¯0.0ã0.0980392ã®å€ãšããŠ64x1ãã¯ã¹ãã£ã«ããç¹å®ã®å æºã®çŸåšã®èŒåºŠãä¹ç®ããŸãã
GLQuakeã§ã²ã©ãå£ãã空ã¯ã空ã®ãã¯ã¹ãã£ãæã€ããªãŽã³ãå€ãã®å°ããªãã®ã«åå²ããããããå¥åŠãªæ¹æ³ã§æªãŸããGLQuakeãšã¯ç°ãªãã深床ãã¹ãã§ããã¯ãä»ããŠã¬ãã«å šäœã«æãããå¹³ããªçäœã®åœ¢ã§äœãããŠããŸã移åãããšãã®æ³¢ã
GLQuakeã®ç©ºã
2次å ç»åãWebGLãä»ããŠæç»ãããŸãïŒé·ã1ã®ã¯ã¯ãããä»ããŠãé ç¹ã·ã§ãŒããŒã§ä¹ç®ãããŸãïŒã åœåã¯2D Canvasã䜿çšããäºå®ã§ããããé«è§£å床ã§ã¯FPSã¯15ã«äœäžããŸããã
ãŸããå ã®QuakeïŒããã³GWT Quake 2ïŒãšã¯ç°ãªããWebQuakeã¯ãã©ãŠã¶ãŒãŠã£ã³ããŠã®ãµã€ãºã«äŸåããŸããã ãã®ããã«ãããããHor + vert + FOVã䜿çšãããŸããããã«ã€ããŠã¯ã以åã«Habrahabrã§æžãããã®ã§ãã
é³
ãµãŠã³ãã¯2ã€ã®æ¹æ³ã§åæã«å®è£ ãããŸãã
ããã©ã«ãã§ã¯ãWeb Audio APIã䜿çšãããŸããããã¯ãã¹ãã¬ãªãµãŠã³ããšã¹ã ãŒãºãªãµãŠã³ãã®ç¹°ãè¿ãããµããŒãããŸãã
ãã©ãŠã¶ãWeb Audio APIããµããŒãããŠããªãå ŽåãHTML5ãªãŒãã£ãªã¯æå¹ã«ãªããŸããããã®å Žåã®ãµãŠã³ãã¯ã·ã³ã°ã«ãã£ã³ãã«ã§ãããå°ãé ããŠç¹°ãè¿ãããŸãã
åæã®ããŒã¿ãªãªãŒã¹ã§ã¯ãHTML5ãªãŒãã£ãªã®ã¿ã䜿çšãããŠããŸãããããã®ãããChromeã¯æåã«AndroidãLinuxãMacã次ã«Windowsã§ã¯ã©ãã·ã¥ãããããWeb AudioãµããŒããè¿œå ãããŸããã
é³æ¥œãååšããŸããããã£ã¹ã¯ããã§ã¯ãªããHTML5çµç±ã§ãµãŒããŒäžã®OGGãã¡ã€ã«ããåçãããŸãã
ãããã¯ãŒã¯ã²ãŒã
ãã©ãŠã¶ãWebSocketãµãŒããŒã«ããããšã¯ã§ããªãããããªãã¹ã³ãµãŒããŒãäœæããããšã¯ã§ããŸããã§ããã
å°çšãµãŒããŒã¯Node.jsãä»ããŠå®è¡ãããWebQuakeã®ã»ãšãã©ã®ã³ãŒãã䜿çšããŸãã
å°çšãµãŒããŒã¯WebSocketãšUDPã®äž¡æ¹ããµããŒãããŠãããããWebQuakeãµãŒããŒã¯éåžžã®Quakeã¯ã©ã€ã¢ã³ãïŒQuakeWorldã§ã¯ãªãïŒã§åçã§ããŸãã ããããå°æ¥çã«ã¯ãæ¢åã®Quakeéåžžã®ãµãŒããŒã«æ¥ç¶ãããããã·ãäœæããã§ãããã
ãµãŒããŒã«é¢ããæ å ±ã¯ããµãŒããŒãå®è¡ãããŠããã®ãšåãã¢ãã¬ã¹ããã³ããŒããžã®HTTPãªã¯ãšã¹ããšããŠèŠæ±ããããšãã§ããŸãïŒããŒã¿ã¯JSON圢åŒã§è¿ãããŸãïŒã
éå¶ç®¡ç
çŸåšãããŠã¹ã®ãµããŒãã¯Chromeã§ã®ã¿æ©èœããŸãã Firefoxã«ã¯ãã€ã³ã¿ãŒããã¯ããããšããäºå®ã«ããããããããã£ã³ãã¹èªäœã«ãã«ã¹ã¯ãªãŒã³ã¢ãŒããå¿ èŠã§ããããã¬ãŒã€ãŒãšéçºè ã«äžäŸ¿ããããããŸãã
ãã¡ã€ã«ã·ã¹ãã
ãã¡ã€ã«ãžã®ã¢ã¯ã»ã¹ã¯ãåæXMLHttpRequestãä»ããŠè¡ãããŸãã
ã¯ããåæXHRã¯ããã¡ãã·ã§ããã«ã§ã¯ãªãããããããŸããããã³ãŒã«ããã¯å°çã«ã€ãªããããšãªãã¯ããã«ç°¡åã«å®è£ ãããGWT Quakeã§äœ¿çšãããŠãããããªäžæçãªãã¯ã¹ãã£ãèŠãããããŠãŒã¶ãŒã«ãšã£ãŠããã«å¿«é©ã§ã2ã
èªã¿èŸŒã¿äžïŒå°ãªããšãFirefoxã§ã¯ïŒãç»é¢ã®äžå€®ã«ãèªã¿èŸŒã¿äžãã®ç»åã衚瀺ãããããããã¬ãŒã€ãŒã¯ããŠã³ããŒããé²è¡äžã§ããããšãç解ããŸãã
ä¿åãèšå®ãããã³ãã¢ã¯ããŒã«ã«ã¹ãã¬ãŒãžã«èšé²ãããŸãã ããŒã«ã«ã¹ãã¬ãŒãžã«ããä¿åã¯ãããŒã/ä¿åã¡ãã¥ãŒã®[åé€]ãã¿ã³ã§åé€ã§ããŸãã
GWT Quake 2ãšã¯ç°ãªããWebQuakeã¯ãã¡ã€ã«å€æãå¿ èŠãšããã.pakããïŒHTTP 1.1ç¯å²çµç±ã§ïŒãã¡ã€ã«ãçŽæ¥ããŠã³ããŒãã§ããŸããã€ãŸããå®å šãªmodãµããŒãããããŸãã
æ§èœ
ããŸããŸãªããã€ã¹ãšãã©ãŠã¶ãŒã§WebQuakeããã¹ãããŸããã
å°ãé©ããã®ã¯ãå£ãé»ãïŒæ£ç¢ºãªçç±ã¯ããããªãïŒããããŒã¿çã®Chromeã䜿çšããŠé»è©±ïŒLG Optimus L9ïŒã§ã蚱容å¯èœãªããã©ãŒãã³ã¹ïŒFPSã®æ°ã¯ããããŸãããã30以äžïŒãéæã§ããããšã§ããããã«ãããã¯åçãªç §æãæ©èœããŸãïŒã
ç§ã®ä»¥åã®ã³ã³ãã¥ãŒã¿ãŒã§ã¯ãGWT Quake 2ã®5-10 FPSãšã¯ç°ãªããWebQuakeã¯æ倧60 FPSã§åäœããŸãããéçºäžã«ã GWT Quake 2ãšã©ãŒãæé»çã«èæ ®ããŸãããããšãã°ãé«éã
巚倧ãªãã¬ãŒããããã£ãŠããã®ã¯ãNVIDIA GeForce 5200ãæèŒããå€ãã³ã³ãã¥ãŒã¿ãŒãšSamsung N130ãããããã¯ã§ããã ASUSãã©ã³ã¹ãããã§ã¯ãTF300Tã¯éåžžã«ã¹ã ãŒãºã«åäœããŸãã