å»å¹Žã®å€ã«Nvidia RTXã°ã©ãã£ãã¯ã«ãŒããç»å ŽããåŸãã¬ã€ãã¬ãŒã·ã³ã°ã¯ä»¥åã®äººæ°ãåãæ»ããŸããã éå»æ°ãæã«ããã£ãŠãç§ã®Twitterãã£ãŒãã¯ãRTXãæå¹ãŸãã¯ç¡å¹ã«ããã°ã©ãã£ãã¯æ¯èŒã®ç¡éã®ã¹ããªãŒã ã§ãã£ã±ãã«ãªããŸããã
éåžžã«å€ãã®çŸããç»åãè³è³ããåŸãç§ã¯ã¯ã©ã·ãã¯ãã©ã¯ãŒãã¬ã³ãã©ãŒãšã¬ã€ãã¬ãŒãµãŒãèªåã§çµã¿åãããããšãè©Šã¿ãŸããã
ä»ã®äººã®éçºãæåŠããããšããçå矀ã«èŠããã§ããçµæãç§ã¯WebGL1ã«åºã¥ããŠç¬èªã®ãã€ããªããã¬ã³ããªã³ã°ãšã³ãžã³ãäœæããŸããã ããã§ã¯ãçäœã䜿çšããWolfenstein 3Dã®ãã¢ã¬ãã«ã¬ã³ããªã³ã°ïŒã¬ã€ãã¬ãŒã·ã³ã°ã®ããã«äœ¿çšããïŒ ã§éã¶ããšãã§ããŸã ã
è©Šäœæ©
ãã®ãããžã§ã¯ãã¯ããããã¿ã€ããäœæããããšããå§ããŸãããMetroExodusã®ã¬ã€ãã¬ãŒã·ã³ã°ã䜿çšããŠã°ããŒãã«ã©ã€ãã£ã³ã°ãåäœæããããšããŠããŸãã
æ¡æ£ã°ããŒãã«ç §æã衚瀺ããæåã®ãããã¿ã€ãïŒDiffuse GIïŒ
ãããã¿ã€ãã¯ãã©ã¯ãŒãã¬ã³ãã©ãŒã«åºã¥ããŠãããã·ãŒã³ã®ãã¹ãŠã®ãžãªã¡ããªãã¬ã³ããªã³ã°ããŸãã ãžãªã¡ããªã®ã©ã¹ã¿ã©ã€ãºã«äœ¿çšãããã·ã§ãŒããŒã¯ãçŽæ¥ç §æãèšç®ããã ãã§ãªããã¬ã³ããªã³ã°ããããžãªã¡ããªã®è¡šé¢ããã©ã³ãã ãªå ç·ãæŸåºããŠãå æ²¢ã®ãªãè¡šé¢ããçºçããå ã®ã¬ã€ãã¬ãŒãµãŒã®éæ¥åå°ã䜿çšããŠèç©ããŸãïŒæ¡æ£GIïŒã
äžã®ç»åã§ã¯ãéæ¥ç §æã«ãã£ãŠã®ã¿ãã¹ãŠã®çäœãæ£ããç §ããããŠããããšãããããŸãïŒå ç·ã¯ã«ã¡ã©ã®åŸãã®å£ããåå°ãããŸãïŒã å æºèªäœã¯ãç»åã®å·ŠåŽã«ããè¶è²ã®å£ã§èŠãããŠããŸãã
ãŠã«ãã§ã³ã·ã¥ã¿ã€ã³3D
ãããã¿ã€ãã¯éåžžã«ã·ã³ãã«ãªã·ãŒã³ã䜿çšããŠããŸãã å æºã¯1ã€ã ãã§ãã¬ã³ããªã³ã°ãããçäœãšãã¥ãŒãã¯ãããã§ãã ããã«ãããã·ã§ãŒããŒã®ã¬ã€ãã¬ãŒã·ã³ã°ã³ãŒãã¯éåžžã«ç°¡åã§ãã ããŒã ãã·ãŒã³å ã®ãã¹ãŠã®ãã¥ãŒãããã³çãšã®äº€å·®ã«ã€ããŠãã¹ãããããã«ãŒããã©ãŒã¹ãµã€ã¯ã«ããã§ãã¯ãã亀差ã¯ãããã°ã©ã ããªã¢ã«ã¿ã€ã ã§å®è¡ããã®ã«ååãªéãã§ãã
ãã®ãããã¿ã€ããäœæããåŸãããå€ãã®ãžãªã¡ããªãšå€ãã®å æºãã·ãŒã³ã«è¿œå ããããšã§ãããè€éãªããšããããã£ãã®ã§ãã
ããè€éãªç°å¢ã®åé¡ã¯ãã·ãŒã³å ã®å ç·ããªã¢ã«ã¿ã€ã ã§è¿œè·¡ã§ããå¿ èŠãããããšã§ãã éåžžã ããŠã³ãã£ã³ã°ããªã¥ãŒã éå±€ ïŒBVHïŒæ§é ã¯ãã¬ã€ãã¬ãŒã·ã³ã°ããã»ã¹ãé«éåããããã«äœ¿çšãããŸãããWebGL1ã§ãã®ãããžã§ã¯ããäœæãããšããç§ã®æ±ºå®ã¯ãããèš±å¯ããŸããã§ããïŒWebGL1ã®ãã¯ã¹ãã£ã«16ãããããŒã¿ãããŒãããããšã¯äžå¯èœã§ãããã·ã§ãŒããŒã§ã¯ãã€ããªæäœã䜿çšã§ããŸããã ããã«ãããWebGL1ã·ã§ãŒããŒã§ã®BVHã®äºåèšç®ãšé©çšãè€éã«ãªããŸãã
ããããç§ããã®ããã«Wolfenstein 3Dãã¢ã¬ãã«ã䜿çšããããšã«ããçç±ã§ãã 2013幎ã«ã Shadertoyã§1ã€ã®æçåãããWebGLã·ã§ãŒããŒãäœæããŸãããããã¯ãWolfensteinã®ãããªã¬ãã«ãã¬ã³ããªã³ã°ããã ãã§ãªããå¿ èŠãªãã¯ã¹ãã£ããã¹ãŠæç¶ãçã«äœæããŸãã ãã®ã·ã§ãŒããŒã®çµéšãããWolfensteinã®ã°ãªããããŒã¹ã®ã¬ãã«èšèšã¯ãè¿ éãã€ç°¡åãªå éæ§é ãšããŠã䜿çšã§ãããã®æ§é ã§ã®ã¬ã€ãã¬ãŒã·ã³ã°ã¯éåžžã«é«éã§ããããšãããããŸããã
以äžã¯ãã¢ã®ã¹ã¯ãªãŒã³ã·ã§ããã§ãããã«ã¹ã¯ãªãŒã³ã¢ãŒãã§ã¯ã https ïŒ //reindernijhoff.net/wolfrtã§åçã§ããŸã ã
ç°¡åãªèª¬æ
ãã¢ã§ã¯ããã€ããªããã¬ã³ããªã³ã°ãšã³ãžã³ã䜿çšããŸãã ãã¬ãŒã å ã®ãã¹ãŠã®ããªãŽã³ãã¬ã³ããªã³ã°ããããã«ãåŸæ¥ã®ã©ã¹ã¿ã©ã€ãºã䜿çšããçµæãã·ã£ããŠãæ¡æ£GIãããã³ã¬ã€ãã¬ãŒã·ã³ã°ã«ãã£ãŠäœæãããåå°ãšçµã¿åãããŸãã
圱
ã³ãŸãæ§
åå°
ããã¢ã¯ãã£ããªã¬ã³ããªã³ã°
Wolfensteinã«ãŒãã¯ã64Ã64ã®2次å ã°ãªããã«å®å šã«ãšã³ã³ãŒãã§ããŸãã ãã¢ã§äœ¿çšããããããã¯ã Wolfenstein 3Dã®ãšããœãŒã1ã®æåã®ã¬ãã«ã«åºã¥ããŠããŸã ã
èµ·åæã«ãããã¢ã¯ãã£ãã¬ã³ããªã³ã°ãæž¡ãããã«å¿ èŠãªãã¹ãŠã®ãžãªã¡ããªãäœæãããŸãã å£ã®ã¡ãã·ã¥ã¯ããããããŒã¿ããçæãããŸãã ãŸããåºé¢ãšå€©äºé¢ãã©ã€ãããã¢ãã©ã³ãã ãªçäœçšã®åå¥ã®ã¡ãã·ã¥ãäœæããŸãã
å£ãšãã¢ã«äœ¿çšããããã¹ãŠã®ãã¯ã¹ãã£ã¯ãåäžã®ãã¯ã¹ãã£ã¢ãã©ã¹ã«ããã±ãŒãžåãããŠããããããã¹ãŠã®å£ã1åã®æç»åŒã³åºãã§æç»ã§ããŸãã
圱ãšç §æ
çŽæ¥ç §æã¯ããã©ã¯ãŒãã¬ã³ããªã³ã°ãã¹ã«äœ¿çšãããã·ã§ãŒããŒã§èšç®ãããŸãã åãã©ã°ã¡ã³ãã¯ã4ã€ã®ç°ãªãå æºã§ç §ããããšãã§ããŸãïŒæ倧ïŒã ã©ã®ãœãŒã¹ãã·ã§ãŒããŒã®ãã©ã°ã¡ã³ãã«åœ±é¿ãäžããããšãã§ããããç¥ãããã«ããã¢ã®éå§æã«æ€çŽ¢ãã¯ã¹ãã£ãäºåã«èšç®ãããŸãã ãã®æ€çŽ¢ãã¯ã¹ãã£ã®ãµã€ãºã¯64 x 128ã§ããããã°ãªããå ã®åäœçœ®ã®4ã€ã®æãè¿ãå æºã®äœçœ®ããšã³ã³ãŒãããŸãã
varying vec3 vWorldPos; varying vec3 vNormal; void main(void) { vec3 ro = vWorldPos; vec3 normal = normalize(vNormal); vec3 light = vec3(0); for (int i=0; i<LIGHTS_ENCODED_IN_MAP; i++) { light += sampleLight(i, ro, normal); }
åãã©ã°ã¡ã³ããšå æºã®ãœããã·ã£ããŠãååŸããããã«ãå æºã®ã©ã³ãã ãªäœçœ®ããµã³ããªã³ã°ãããŸãã ã·ã§ãŒããŒã®ã¬ã€ãã¬ãŒã·ã³ã°ã³ãŒãã䜿çšãããšïŒä»¥äžã®ã¬ã€ãã¬ãŒã·ã³ã°ã»ã¯ã·ã§ã³ãåç §ïŒãã·ã£ããŠã¬ã€ããµã³ããªã³ã°ãã€ã³ãã«æŸåºãããå æºã®å¯èŠæ§ã決å®ãããŸãã
ïŒè£å©ïŒåå°ãè¿œå ããåŸïŒä»¥äžã®ãåå°ãã»ã¯ã·ã§ã³ãåç §ïŒãæ¡æ£GIã¯ãæ¡æ£GIã¬ã³ããŒã¿ãŒã²ããïŒä»¥äžãåç §ïŒã§æ€çŽ¢ãå®è¡ããããšã«ãããèšç®ããããã©ã°ã¡ã³ãã®è²ã«è¿œå ãããŸãã
ã¬ã€ãã¬ãŒã·ã³ã°
ãããã¿ã€ãã§ã¯æ¡æ£GIã®ã¬ã€ãã¬ãŒã·ã³ã°ã³ãŒããããªãšã³ããã£ãã·ã§ãŒããŒãšçµã¿åããããŠããŸãããããã¢ã§ã¯ããããåé¢ããããšã«ããŸããã
æ¡æ£GIãåéããããã«ã©ã³ãã ã¬ã€ã®ã¿ãæŸå°ããå¥ã®ã·ã§ãŒããŒã䜿çšããŠããã¹ãŠã®ãžãªã¡ããªã®2çªç®ã®ã¬ã³ããªã³ã°ãåå¥ã®ã¬ã³ããŒã¿ãŒã²ããïŒæ¡æ£GIã¬ã³ããŒã¿ãŒã²ããïŒã«å®äºããããšã§ããããåé¢ããŸããïŒä»¥äžã®ãæ¡æ£GIãã»ã¯ã·ã§ã³ãåç §ïŒã ãã®ã¬ã³ããŒã¿ãŒã²ããã§åéãããç §æã¯ãåæ¹ã®ã¬ã³ããªã³ã°ããã»ãŒãžã§èšç®ãããçŽæ¥ç §æã«è¿œå ãããŸãã
ããã¢ã¯ãã£ããªéè·¯ãšæ¡æ£GIãåé¢ããããšã«ãããã¹ã¯ãªãŒã³ãã¯ã»ã«ããã1ã€æªæºã®æ¡æ£GIããŒã ãæŸåºã§ããŸãã ãããè¡ãã«ã¯ããããã¡ã¹ã±ãŒã«ãå°ããããŸãïŒç»é¢ã®å³äžé ã«ãããªãã·ã§ã³ã®ã¹ã©ã€ããŒã移åããŸãïŒã
ããšãã°ããããã¡ã¹ã±ãŒã«ã0.5ã®å Žåã4ç»é¢ãã¯ã»ã«ããšã«1ã€ã®ã¬ã€ã®ã¿ãæŸåºãããŸãã ããã«ãããçç£æ§ãå€§å¹ ã«åäžããŸãã ç»é¢ã®å³äžé ã«ããåãUIã䜿çšããŠãã¬ã³ããŒã¿ãŒã²ããïŒSPPïŒã®ãã¯ã»ã«ãããã®ãµã³ãã«æ°ãšããŒã åå°ã®æ°ãå€æŽããããšãã§ããŸãã
ããŒã ãæŸã€
ã¬ã€ãã·ãŒã³ã«æŸåºã§ããããã«ããã«ã¯ããã¹ãŠã®ã¬ãã«ãžãªã¡ããªã«ã·ã§ãŒããŒã®ã¬ã€ãã¬ãŒãµãŒã䜿çšã§ãã圢åŒãå¿ èŠã§ãã Wolfensteinã¬ã€ã€ãŒã¯64Ã64ã°ãªããããšã³ã³ãŒãããããããã¹ãŠã®ããŒã¿ãåäžã®64Ã64ãã¯ã¹ãã£ã«ãšã³ã³ãŒãããã®ã¯ç°¡åã§ãã
- ãã¯ã¹ãã£ã«ã©ãŒã®èµ€ãã£ãã«ã§ã¯ ããããã°ãªããã®å¯Ÿå¿ããã»ã«xãyã«ãããã¹ãŠã®ãªããžã§ã¯ãããšã³ã³ãŒããããŸãã èµ€ãã£ãã«ã®å€ããŒãã®å Žåãã»ã«å ã«ãªããžã§ã¯ãã¯ãããŸããããã以å€ã®å Žåãå£ïŒ1ã64ã®å€ïŒããã¢ãå æºããŸãã¯äº€å·®ã確èªããå¿ èŠã®ããçäœã§å ããããŠããŸãã
- çäœãã¬ãã«ã°ãªããã»ã«ãå ããå Žåãç·ãéãããã³ã¢ã«ãã¡ãã£ãã«ã䜿çšããŠãã°ãªããã»ã«å ã®çäœã®ååŸãšçžå¯Ÿxããã³y座æšããšã³ã³ãŒãããŸãã
ã¬ã€ã¯ã次ã®ã³ãŒãã䜿çšããŠãã¯ã¹ãã£ãèµ°æ»ããããšã«ããã·ãŒã³ã§æŸåºãããŸãã
bool worldHit(n vec3 ro,in vec3 rd,in float t_min, in float t_max, inout vec3 recPos, inout vec3 recNormal, inout vec3 recColor) { vec3 pos = floor(ro); vec3 ri = 1.0/rd; vec3 rs = sign(rd); vec3 dis = (pos-ro + 0.5 + rs*0.5) * ri; for( int i=0; i<MAXSTEPS; i++ ) { vec3 mm = step(dis.xyz, dis.zyx); dis += mm * rs * ri; pos += mm * rs; vec4 mapType = texture2D(_MapTexture, pos.xz * (1. / 64.)); if (isWall(mapType)) { ... return true; } } return false; }
åæ§ã®ã¡ãã·ã¥ã¬ã€ãã¬ãŒã·ã³ã°ã³ãŒãã¯ãShadertoyã®ãã®Wolfensteinã·ã§ãŒããŒã«ãããŸãã
å£ãŸãã¯ãã¢ãšã®äº€ç¹ãèšç®ããåŸïŒ å¹³è¡å蟺圢ãšã®äº€ç¹ãã¹ãã䜿çšïŒãããã¢ã¯ãã£ãã¬ã³ããªã³ã°ãæž¡ãããã«äœ¿çšãããåããã¯ã¹ãã£ã¢ãã©ã¹ã§æ€çŽ¢ãããšãã¢ã«ãã亀ç¹ãåŸãããŸãã çäœã«ã¯è²ããããã°ãªããå ã®xãy座æšãšè²åŸé é¢æ°ã«åºã¥ããŠæç¶ãçã«æ±ºå®ãããŸã ã
ãã¢ã¯åããŠãããããããå°ãè€éã§ãã CPUã®ã·ãŒã³è¡šçŸïŒãã©ã¯ãŒãã¬ã³ããªã³ã°ãã¹ã®ã¡ãã·ã¥ã®ã¬ã³ããªã³ã°ã«äœ¿çšïŒãGPUã®ã·ãŒã³è¡šçŸïŒã¬ã€ãã¬ãŒã·ã³ã°ã«äœ¿çšïŒãšåãã«ãªãããã«ããã¹ãŠã®ãã¢ã¯ã«ã¡ã©ãããã¢ãŸã§ã®è·é¢ã«åºã¥ããŠèªåçã«æ±ºå®è«çã«ç§»åããŸãã
ã³ãŸãæ§
æ£ä¹±ã°ããŒãã«ã©ã€ãã£ã³ã°ïŒæ¡æ£GIïŒã¯ãã·ã§ãŒããŒã§å ç·ãæŸåºããããšã«ãã£ãŠèšç®ãããŸããããã¯ãæ¡æ£GIã¬ã³ããŒã¿ãŒã²ããã®ãã¹ãŠã®ãžãªã¡ããªãæç»ããããã«äœ¿çšãããŸãã ãããã®å ç·ã®æ¹åã¯ãã³ãµã€ã³å éãããåçããµã³ããªã³ã°ããããšã«ãã決å®ããããè¡šé¢ã®æ³ç·ã«äŸåããŸãã
ããŒã æ¹åãrdã§éå§ç¹ãroã®å Žåãåå°å ã¯æ¬¡ã®ãµã€ã¯ã«ã䜿çšããŠèšç®ã§ããŸãã
vec3 getBounceCol(in vec3 ro, in vec3 rd, in vec3 col) { vec3 emitted = vec3(0); vec3 recPos, recNormal, recColor; for (int i=0; i<MAX_RECURSION; i++) { if (worldHit(ro, rd, 0.001, 20., recPos, recNormal, recColor)) { // if (isLightHit) { // direct light sampling code // return vec3(0); // } col *= recColor; for (int i=0; i<2; i++) { emitted += col * sampleLight(i, recPos, recNormal); } } else { return emitted; } rd = cosWeightedRandomHemisphereDirection(recNormal); ro = recPos; } return emitted; }
ãã€ãºãæžããããã«ãçŽæ¥ç §æãµã³ããªã³ã°ãã«ãŒãã«è¿œå ãããŸãã ããã¯ãShadertoyã®å¥ã®Cornell Boxã·ã§ãŒããŒã§äœ¿çšãããŠããææ³ã«äŒŒãŠããŸãã
ãªãã¬ã¯ã·ã§ã³
ã·ã§ãŒããŒã§å ç·ã䜿çšããŠã·ãŒã³ããã¬ãŒã¹ã§ãããããåå°ãè¿œå ããã®ã¯éåžžã«ç°¡åã§ãã ç§ã®ãã¢ã§ã¯ãã«ã¡ã©ã®åå°ããŒã ã䜿çšããŠäžèšãšåãgetBounceColã¡ãœãããåŒã³åºãããšã«ãããåå°ãè¿œå ãããŸãã
#ifdef REFLECTION col = mix(col, getReflectionCol(ro, reflect(normalize(vWorldPos - _CamPos), normal), albedo), .15); #endif
åå°ã¯åæ¹ã¬ã³ããªã³ã°ãã¹ã§è¿œå ãããããã1ã€ã®åå°å ç·ã¯åžžã«1ã€ã®åå°å ç·ãæŸåºããŸãã
æéçãªã¢ã³ããšã€ãªã¢ã¹
ãã©ã¯ãŒãã¬ã³ããªã³ã°ãã¹ã®ãœããã·ã£ããŠãšæ¡æ£GIè¿äŒŒã¯ã©ã¡ãããã¯ã»ã«ãããçŽ1ã€ã®ãµã³ãã«ã䜿çšãããããæçµçµæã¯éåžžã«ãã€ãºãå€ããªããŸãã ãã€ãºã®éãæžããããã«ãPlaydeadã®TAAïŒ INSIDEã®Temporal Reprojection Anti-Aliasingã«åºã¥ããŠãæéçã¢ã³ããšã€ãªã¢ã¹ïŒTAAïŒã䜿çšãããŸãã ã
åæ圱
TAAã®èåŸã«ããèãæ¹ã¯éåžžã«åçŽã§ããTAAã¯ãã¬ãŒã ããšã«1ã€ã®ãµããã¯ã»ã«ãèšç®ãããã®å€ãåã®ãã¬ãŒã ã®çžé¢ãã¯ã»ã«ãšå¹³åããŸãã
çŸåšã®ãã¯ã»ã«ãåã®ãã¬ãŒã ã®ã©ãã«ãã£ãããç¥ãããã«ãåã®ãã¬ãŒã ã®ãããªãã¯ã¹model-view-projectionã䜿çšããŠãã©ã°ã¡ã³ãã®äœçœ®ãåæ圱ããŸãã
ãµã³ãã«ãããããããŠè¿åãå¶éãã
å Žåã«ãã£ãŠã¯ãããšãã°ãåã®ãã¬ãŒã ã®çŸåšã®ãã¬ãŒã ã®ãã©ã°ã¡ã³ãããžãªã¡ããªã«ãã£ãŠéããããããã«ã«ã¡ã©ã移åããå Žåãªã©ãéå»ããä¿åããããµã³ãã«ã¯ç¡å¹ã§ãã ãã®ãããªç¡å¹ãªãµã³ãã«ãç Žæ£ããã«ã¯ãè¿é£å¶éã䜿çšãããŸãã æãåçŽãªã¿ã€ãã®å¶éãéžæããŸããã
vec3 history = texture2D(_History, uvOld ).rgb; for (float x = -1.; x <= 1.; x+=1.) { for (float y = -1.; y <= 1.; y+=1.) { vec3 n = texture2D(_New, vUV + vec2(x,y) / _Resolution).rgb; mx = max(n, mx); mn = min(n, mn); } } vec3 history_clamped = clamp(history, mn, mx);
ãŸããå¢çå¹³è¡å蟺圢ã«åºã¥ããå¶éæ¹æ³ã䜿çšããããšããŸããããç§ã®ãœãªã¥ãŒã·ã§ã³ãšã®å€§ããªéãã¯èŠãããŸããã§ããã ããã¯ããããããã¢ã®ã·ãŒã³ã«å€ãã®åäžã®æãè²ããããã»ãšãã©åããŠãããªããžã§ã¯ãããªãããã«èµ·ãããŸããã
ã«ã¡ã©ã®æ¯å
ã¢ã³ããšã€ãªã¢ã¹ãåŸãããã«ãåãã¬ãŒã ã®ã«ã¡ã©ã¯ãïŒæ¬äŒŒïŒã©ã³ãã ãªãµããã¯ã»ã«å€äœã®äœ¿çšã«ããæ¯åããŸãã ããã¯ãå°åœ±è¡åãå€æŽããããšã«ããå®è£ ãããŸãã
this._projectionMatrix[2 * 4 + 0] += (this.getHaltonSequence(frame % 51, 2) - .5) / renderWidth; this._projectionMatrix[2 * 4 + 1] += (this.getHaltonSequence(frame % 41, 3) - .5) / renderHeight;
ãã€ãº
ãã€ãºã¯ãæ¡æ£GIããã³ãœããã·ã£ããŠã®èšç®ã«äœ¿çšãããã¢ã«ãŽãªãºã ã®åºç€ã§ãã è¯ããã€ãºã䜿çšãããšç»è³ªã«å€§ãã圱é¿ããæªããã€ãºã䜿çšãããšã¢ãŒãã£ãã¡ã¯ããçºçããããç»åã®åæãé ããªããŸãã
ãã®ãã¢ã§äœ¿çšããããã¯ã€ããã€ãºã¯ããŸãè¯ããªãã®ã§ã¯ãªãããšå¿é ããŠããŸãã
è¯ããã€ãºã䜿çšããããšã¯ããããããã®ãã¢ã§ç»è³ªãæ¹åããæãéèŠãªåŽé¢ã§ãã ããšãã°ã ãã«ãŒãã€ãºã䜿çšã§ããŸãã
é»éæ¯ã«åºã¥ããŠãã€ãºã䜿çšããŠå®éšãè¡ããŸãããã倱æããŸããã ãããŸã§ã Save of Dave Hoskinsã®ãªãæªåé«ãããã·ã¥ã䜿çšãããŠããŸãã
vec2 hash2() { vec3 p3 = fract(vec3(g_seed += 0.1) * HASHSCALE3); p3 += dot(p3, p3.yzx + 19.19); return fract((p3.xx+p3.yz)*p3.zy); }
ãã€ãºãªãã¯ã·ã§ã³
TAAãæå¹ã«ããŠãããã¢ã«ã¯å€ãã®ãã€ãºã衚瀺ãããŸãã 倩äºã¯éæ¥ç §æã«ãã£ãŠã®ã¿ç §ãããããããã¬ã³ããªã³ã°ã¯ç¹ã«å°é£ã§ãã ç¶æ³ã¯ã倩äºãåè²ã§æºãããã倧ããªå¹³ããªè¡šé¢ã§ãããšããäºå®ã«ãã£ãŠåçŽåãããŠããŸããããã¯ã¹ãã£ãŸãã¯å¹ŸäœåŠçãªãã£ããŒã«ãããå Žåããã€ãºã¯ç®ç«ããªããªããŸãã
ãã¢ã®ãã®éšåã«ããŸãæéããããããªãã£ãã®ã§ã1ã€ã®ãã€ãºé€å»ãã£ã«ã¿ãŒã®ã¿ãé©çšããããšããŸãããMorganMcGuire ãšKyle Witsonã®Median3x3ã§ãã æ®å¿µãªããããã®ãã£ã«ã¿ãŒã¯å£ã®ãã¯ã¹ãã£ã®ããã¯ã»ã«ã¢ãŒããã°ã©ãã£ãã¯ã¹ãšã¯ããŸãæ©èœããŸãããè·é¢ã®ãã¹ãŠã®è©³çŽ°ãåé€ããè¿ãã®å£ã®ãã¯ã»ã«ã®è§ãäžžããŸãã
å¥ã®å®éšã§ã¯ãåããã£ã«ã¿ãŒãæ¡æ£GIã¬ã³ããŒã¿ãŒã²ããã«é©çšããŸããã 圌ã¯ãã€ãºããããã«æžãããŸããããåæã«å£ã®ãã¯ã¹ãã£ã®è©³çŽ°ãã»ãšãã©å€æŽããã«ããã®æ¹åã¯äœåãªããªç§ãè²»ãã䟡å€ã¯ãªããšå€æããŸããã
ãã¢
ããã§ãã¢ãåçã§ããŸã ã