![ç»å](https://habrastorage.org/getpro/habr/post_images/399/fa1/1b8/399fa11b8f514403ab6f5344d54defea.png)
ãŸããDirect3Dã¢ãŒããã¯ãã£ã«ã€ããŠèª¬æããŸãã
Direct3D APIã¯ãææ°ã®ãããªã«ãŒãã®ã¢ãŒããã¯ãã£ãçŽæ¥åæ ãããã®ã§ããã次ã®åœ¢åŒã®ã°ã©ãã£ãã¯ãã€ãã©ã€ã³ãã«ãã»ã«åããŸãã
![ç»å](https://habrastorage.org/getpro/habr/comment_images/705/087/618/7050876188b7159d6cbdc5fff1a64a0d.jpg)
å³ã§ã¯ãå®å šã«ããã°ã©ã å¯èœãªã³ã³ãã¢ã®ã¹ããŒãžã¯äžžãé·æ¹åœ¢ã§ç€ºãããæ§æå¯èœãªã¹ããŒãžã¯éåžžã®é·æ¹åœ¢ã§ç€ºãããŠããŸãã
次ã«ãå段éãåå¥ã«èª¬æããŸãã
å ¥åã¢ã»ã³ãã©ãŒïŒIAãšçç¥ïŒ -ã·ã¹ãã ã¡ã¢ãªã«ãããããã¡ãŒããé ç¹ããŒã¿ãåãåãããã€ãã©ã€ã³ã®åŸç¶ã®ã¹ããŒãžã§äœ¿çšãããããªããã£ããåéããŸãã ãŸããIAã¯ãé ç¹çªå·ãªã©ãD3Dã©ã³ã¿ã€ã ã«ãã£ãŠçæãããããã€ãã®ã¡ã¿ããŒã¿ãé ç¹ã«ä»å ããŸãã
é ç¹ã·ã§ãŒããŒïŒé ç¹ã·ã§ãŒããŒãVSïŒã¯ãå¿ é ã®å®å šã«ããã°ã©ã å¯èœãªãã€ãã©ã€ã³ã¹ããŒãžã§ãã ãæ³åã®ãšãããåé ç¹ïŒè±èªã®é ç¹ ïŒã«å¯ŸããŠèµ·åãããå ¥åã¢ã»ã³ãã©ãŒããå ¥åããŒã¿ãåãåããŸãã é ç¹ã®ããŸããŸãªå€æããã座æšç³»ããå¥ã®åº§æšç³»ãžã®åº§æšã®å€æãæ³ç·ããã¯ã¹ãã£åº§æšãå ã®èšç®ãªã©ã®çæã«äœ¿çšãããŸãã é ç¹ã·ã§ãŒããŒããã®ããŒã¿ã¯ãã©ã¹ã¿ã©ã€ã¶ãŒããŸãã¯ã¹ããªãŒã åºåïŒãã€ãã©ã€ã³ã®ãã®ã¹ããŒãžãã€ã³ã¹ããŒã«ãããŠãããããžãªã¡ããªã·ã§ãŒããŒãã€ã³ã¹ããŒã«ãããŠããªãå ŽåïŒããžãªã¡ããªã·ã§ãŒããŒããŸãã¯ãµãŒãã§ã¹ã·ã§ãŒããŒã«çŽæ¥éä¿¡ãããŸãã
ãã«ã·ã§ãŒããŒïŒãµãŒãã§ã¹ã·ã§ãŒããŒãHSïŒããã¡ã€ã³ã·ã§ãŒããŒïŒãã¡ã€ã³ã·ã§ãŒããŒãDSïŒããã³ããã»ã¬ãŒã¿ãŒïŒããã»ã¬ãŒã¿ãŒïŒã¯ãã·ã§ãŒããŒã¢ãã«5.0ïŒããã³ããããD3D11ïŒã«è¿œå ãããããã»ã¬ãŒã·ã§ã³ããã»ã¹ã§äœ¿çšãããïŒããªããã£ããããå°ãããã®ã«åå²ããïŒç»åã®è©³çŽ°ãå¢ããïŒã ã³ã³ãã¢ã®ãããã®ã¹ããŒãžã¯ãªãã·ã§ã³ã§ãããç§ã®ã·ãŒã³ã§ã¯äœ¿çšãããªãããã詳现ã«èª¬æããŸããã åžæãã人ã¯ãããšãã°MSDNã§ãããã«ã€ããŠèªãããšãã§ããŸãã
ãžãªã¡ããªã·ã§ãŒããŒïŒãžãªã¡ããªã·ã§ãŒããŒãGSïŒ -ãã€ãã©ã€ã³ã®åã®ã¹ããŒãžã§åŠçãããé ç¹ããçµã¿ç«ãŠãããããªããã£ãïŒãã€ã³ããã©ã€ã³ããŸãã¯äžè§åœ¢ïŒãåŠçããŸãã ãžãªã¡ããªã·ã§ãŒããŒã¯ããã®å Žã§æ°ããããªããã£ããçæã§ããŸãïŒã€ãŸããé ç¹ã·ã§ãŒããŒã®å Žåã®ããã«ããšããŸãŒã¹ãã1察1ã§ããå¿ èŠã¯ãããŸããïŒã ãããã¯ãã·ã£ããŠïŒã·ã£ããŠããªã¥ãŒã ïŒãã¹ãã©ã€ãïŒããŒãã£ã¯ã«ã·ã¹ãã ãªã©ïŒãåå°ïŒãã¥ãŒããããã§ã®ã·ã³ã°ã«ãã¹ã¬ã³ããªã³ã°ãªã©ïŒãªã©ã®ãžãªã¡ããªãçæããããã«äœ¿çšãããŸãã ããã»ã¬ãŒã·ã§ã³ã«ã䜿çšã§ããŸãããããã¯æšå¥šãããŸããã ãžãªã¡ããªã·ã§ãŒããŒããã®ããŒã¿ã¯ãã¹ããªãŒã åºåãŸãã¯ã©ã¹ã¿ã©ã€ã¶ãŒã«éä¿¡ãããŸãã
ã¹ããªãŒã åºåïŒSOïŒ -ãã€ãã©ã€ã³ã®ãªãã·ã§ã³ã®ã¹ããŒãžã§ããã€ãã©ã€ã³ã«ãã£ãŠåŠçãããé ç¹ãã·ã¹ãã ã¡ã¢ãªã«ããŠã³ããŒãããããã«äœ¿çšãããŸãïŒSOææ°ã¯CPUã«ãã£ãŠèªã¿åããããã次ã®éå§æã«ãã€ãã©ã€ã³ã«ãã£ãŠäœ¿çšãããŸãïŒã ãžãªã¡ããªã·ã§ãŒããŒããããŒã¿ãåãåãããããŒã¿ããªãå Žåã¯é ç¹ã·ã§ãŒããŒãŸãã¯ãã¡ã€ã³ã·ã§ãŒããŒããããŒã¿ãåãåããŸãã
ã©ã¹ã¿ã©ã€ã¶ïŒã©ã¹ã¿ã©ã€ã¶ãRSïŒ -ã°ã©ãã£ãã¯ãã€ãã©ã€ã³ã®ãäžå¿ãã ååã瀺ãããã«ããã®ã¹ããŒãžã®ç®çã¯ãããªããã£ããã©ã¹ã¿ã©ã€ãºããããšã§ããã€ãŸããããªããã£ãããã¯ã»ã«ã«åå²ããŸãïŒãã ããããã¯ã»ã«ããšããååã¯å®å šã«æ£ããããã§ã¯ãããŸããããã¯ã»ã«ãšã¯ãéåžžããã¬ãŒã ãããã¡ãŒã«çŽæ¥é 眮ãããããšãæå³ããŸããã€ãŸãã ãããã©ã°ã¡ã³ãããããæ£ç¢ºã«ãªããŸãïŒã ã©ã¹ã¿ã©ã€ã¶ã¯ããã€ãã©ã€ã³ã®åã®ã¹ããŒãžããé ç¹ã«é¢ãããã¯ãã«æ å ±ãåãåãããããã©ã¹ã¿ã«å€æããã¹ã³ãŒãå€ã®ããªããã£ããåãåããé ç¹ã«é¢é£ä»ããããå€ïŒãã¯ã¹ãã£åº§æšãªã©ïŒãè£éãããã®äœçœ®ã2次å 衚瀺é åïŒè±èªïŒã«æ圱ããŸããã¥ãŒããŒã ïŒã ã©ã¹ã¿ã©ã€ã¶ãŒããã®ããŒã¿ã¯ããã¯ã»ã«ã·ã§ãŒããŒïŒã€ã³ã¹ããŒã«ãããŠããå ŽåïŒã«éãããŸãã
ãã¯ã»ã«ã·ã§ãŒããŒïŒãã¯ã»ã«ã·ã§ãŒããŒãPSïŒ -ã©ã¹ã¿ã©ã€ã¶ãŒããåãåã£ãç»åã®æçãåŠçããŸãã ããŸããŸãªã°ã©ãã£ãã¯ãšãã§ã¯ããå®è£ ããããã«äœ¿çšãããåºåæã«Output Mergerã¹ããŒãžã«åºåããããã©ã°ã¡ã³ãã®è²ãšããªãã·ã§ã³ã§æ·±åºŠå€ïŒã©ã®ãã©ã°ã¡ã³ããã«ã¡ã©ã«è¿ãããå€æããããã«äœ¿çšãããå€ïŒãæäŸããŸãã
Output MergerïŒOMïŒã¯ãã°ã©ãã£ãã¯ã¹ãã€ãã©ã€ã³ã®æçµæ®µéã§ãã ãã¯ã»ã«ã·ã§ãŒããŒããåãåã£ãåãã©ã°ã¡ã³ãã«å¯ŸããŠã深床ãã¹ããšã¹ãã³ã·ã«ãã¹ããå®è¡ãããã©ã°ã¡ã³ãããã¬ãŒã ãããã¡ãŒã«ç§»åããŠãªã³ã®å Žåã«è²ãæ··åããå¿ èŠããããã©ãããå€æããŸãã
次ã«ãAPIèªäœã«ã€ããŠèª¬æããŸãã
Direct3D APIã¯ã軜éã®COMïŒ Microsoft Component Object Model ïŒã«åºã¥ããŠããŸãã éåžžã«è»œéã§ããããããã®äžã®ãæ¬æ ŒçãªãCOMããã¯ã€ã³ã¿ãŒãã§ãŒã¹ã®æŠå¿µã®ã¿ãæ®ããŸãã
COMã€ã³ã¿ãŒãã§ãŒã¹ã®æŠå¿µã«ç²ŸéããŠããªã人åã-å°ããªåæ çãªäœè«ã
COMã€ã³ã¿ãŒãã§ã€ã¹ã®æŠå¿µã¯ã.NETããã®ã€ã³ã¿ãŒãã§ã€ã¹ã®æŠå¿µã«æ¬è³ªçã«è¿ãã§ãïŒå®éã.NETã¯COMã®éçºã§ããããïŒã ã³ã¢ã¯ãã¡ãœããã®ã¿ãæã¡ã16ãã€ãã®èå¥åïŒ GUID ïŒãå²ãåœãŠãããæœè±¡ã¯ã©ã¹ã§ãã ç©ççã«ã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã¯é¢æ°ã®ã³ã¬ã¯ã·ã§ã³ãã€ãŸããé¢æ°ãžã®ãã€ã³ã¿ãæã€é åãžã®ãã€ã³ã¿ïŒCäºæã®ABIãéåžžã¯stdcallåŒã³åºãèŠçŽïŒã§ãããæåã®åŒæ°ãšããŠã€ã³ã¿ãŒãã§ã€ã¹ãžã®ãã€ã³ã¿ãæã¡ãŸãã åã€ã³ã¿ãŒãã§ã€ã¹ã®èåŸã«ã¯ããããå®è£ ãããªããžã§ã¯ãããããåãªããžã§ã¯ãã¯ããã€ãã®ç°ãªãã¿ã€ãã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ã§ããŸãã ãã€ã¯ããœããã¯ãã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ãããªããžã§ã¯ãã«é£çµ¡ããå¯äžã®æ¹æ³ã¯ããã®ã€ã³ã¿ãŒãã§ã€ã¹ãžã®ãã€ã³ã¿ãä»ããŠãã€ãŸããã®ã¡ãœãããåŒã³åºãããšã ãšä»®å®ããŠããŸãã
ã€ã³ã¿ãŒãã§ã€ã¹ã¯çžäºã«ç¶æ¿ã§ããDirect3Dã®ã€ã³ã¿ãŒãã§ã€ã¹ãå«ãã»ãšãã©ã®COMã€ã³ã¿ãŒãã§ã€ã¹ã¯ãç¹å¥ãªã€ã³ã¿ãŒãã§ã€ã¹-IUnknownããç¶æ¿ãããŸããIUnknown㯠ãåç §ã«ãŠã³ããéããŠã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ãããªããžã§ã¯ãããããŸããŸãªã¿ã€ãã®ã€ã³ã¿ãŒãã§ã€ã¹ãžã®ãã€ã³ã¿ãåãåãããšãã§ãããªããžã§ã¯ãã®åç¶æéã®å¶åŸ¡ãå®è£ ããŸãGUIDã«ãã£ãŠã
ãã®èšäºã®ããã°ã©ã ã¯C ++ã§èšè¿°ãããŠããŸãããCOMã€ã³ã¿ãŒãã§ã€ã¹ã«ã¯Cäºæã®ABIãããããããã€ãã£ãã³ãŒããçŽæ¥ãŸãã¯FFIãä»ããŠæ©èœããä»»æã®èšèªããæäœã§ããŸãã MSVC ++ããã³.NETã®å ŽåãMSã¯ããããCOMãC ++ããã³.NETãªããžã§ã¯ãã·ã¹ãã ã«ææ©çã«çµ±åãããããããã¯ç¹ã«äŸ¿å©ã§ãã
ã€ã³ã¿ãŒãã§ã€ã¹Direct3D 10ããã³11ã¯ãããã€ãã®ã¿ã€ãã«åé¡ã§ããŸãã
DXGIã€ã³ã¿ãŒãã§ã€ã¹ã DXGIã¯ãWindowsã°ã©ãã£ãã¯ãµãã·ã¹ãã ã®ãã¹ãŠã®æ°ããã³ã³ããŒãã³ãã®ããŒã¹ãšãªãäœã¬ãã«APIã§ãã D3Dã®å Žåãç¹ã«IDXGISwapChainã€ã³ã¿ãŒãã§ã€ã¹ã«é¢å¿ããããŸããããã¯ãã°ã©ãã£ãã¯ã¹ãã€ãã©ã€ã³ãæç»ãããããã¡ãŒã®ãã§ãŒã³ãã«ãã»ã«åããç¹å®ã®winapiãŠã£ã³ããŠïŒHWNDïŒã«ãã€ã³ããã圹å²ãæãããŸãã ãã®ã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããå¿ èŠã¯ãŸã£ãããããŸãããïŒããŠã£ã³ããŠã«ãã¬ã³ããªã³ã°ããå Žåã§ãããã¯ã¹ãã£ã«æç»ããŠGDIã§HDCã«è»¢éã§ããŸãïŒãéåžžã«äŸ¿å©ãªããããã䜿çšãããŸãã
ä»®æ³ã¢ããã¿ãŒã€ã³ã¿ãŒãã§ã€ã¹ ãããã¯ãããŸããŸãªãªãœãŒã¹ã®äœæãã°ã©ãã£ãã¯ãã€ãã©ã€ã³ã®æ§æãããã³èµ·åã«äœ¿çšãããŸãã D3D10ã§ã¯ããã®ãã¹ãŠãåäžã®ã€ã³ã¿ãŒãã§ã€ã¹ãæ åœããŠããŸãããID3D10Device ïŒãŸãã¯D3D10.1ã®å Žåã¯ID3D10Device1ïŒãäžè¬ã«ãD3Dããã³DXGIã€ã³ã¿ãŒãã§ã€ã¹ã®åœåã§ã¯ãååã®ãã¬ãã£ãã¯ã¹ãIãã¯ãã¿ã€ããã€ã³ã¿ãŒãã§ã€ã¹ã¿ã€ãããDXGIããŸãã¯ã D3D11ãã¯ç¹å®ã®APIãæå³ããæ¥å°ŸèŸïŒããå ŽåïŒã¯APIã®ãã€ããŒããŒãžã§ã³ã瀺ããŸãïŒãD3D11ã§ã¯ã ID3D11Device ïŒãªãœãŒã¹ã®äœæïŒãšID3D11DeviceContext ïŒæ®ãã®2ã€ã®ã¿ã¹ã¯ïŒã®2ã€ã«åå²ãããŸããã
ãããã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ãããªããžã§ã¯ãã¯ãããã€ãã®DXGIã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããŸããããšãã°ã ID3D11DeviceããIDXGIDeviceã€ã³ã¿ãŒãã§ã€ã¹ãèŠæ±ã§ããŸãïŒ IUnknownã«å«ãŸããQueryInterfaceã¡ãœãããåŒã³åºããŠãæåããIXknownãç¶æ¿ããŸãïŒã
ããã§ãææ°ã®APIã䜿çšãããšããã®APIã«å®å šã«æºæ ããããã«ããã°ã©ã ãåäœããããŒããŠã§ã¢ã絶察ã«å¿ èŠãšããªãããšã«æ³šæããŠãã ããã Microsoftã¯D3D10.1ã«ãæ©èœã¬ãã«ãã®æŠå¿µãå°å ¥ããŸãããããã«ãããAPIã®æ°ããããŒãžã§ã³ã䜿çšããããã°ã©ã ãD3D9ããŒããŠã§ã¢äžã§ãå®è¡ã§ããŸãïŒãã¡ãããAPIã®æ©èœãå«ãŸããŠããªãç¹å®ã®æ©èœã¬ãã«ãå¿ èŠãšããªãéãïŒã ç§ã®ã·ãŒã³ã®å ŽåãD3D11ã䜿çšããŸãããD3D_FEATURE_LEVEL_10_0ãã©ã°ã䜿çšããŠä»®æ³ã¢ããã¿ãŒãäœæãããããã4çªç®ã®ã¢ãã«ã®ã·ã§ãŒããŒã䜿çšããŸãã
ãã«ããŒã€ã³ã¿ãŒãã§ã€ã¹ã ID3D11Debug ã ID3D11InfoQueue ã ID3D11CounterããŸãã¯ID3D11ShaderReflectionãªã© -ã¯ããã€ãã©ã€ã³ã®ç¶æ ãã·ã§ãŒããŒãããã©ãŒãã³ã¹ãªã©ã枬å®ããããã®è¿œå æ å ±ãååŸããããã«äœ¿çšãããŸãã
ãªãœãŒã¹ã€ã³ã¿ãŒãã§ãŒã¹ D3Dã§ã¯ããªãœãŒã¹ã¯ãã¯ã¹ãã£ïŒããšãã°ã ID3D11Texture2D -2次å ãã¯ã¹ãã£ïŒããŸãã¯åãªããããã¡ïŒããšãã°ãé ç¹ããŒã¿ãå«ãïŒãæããŸãã ãªãœãŒã¹ãªããžã§ã¯ãã¯ã IDXGIResourceãªã©ã®ããŸããŸãªDXGIã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããŸããããã¯ã æ°ããã°ã©ãã£ãã¯ã¹ãµãã·ã¹ãã ïŒDirect2DãGDIãªã©ïŒãšæ°ããããŒãžã§ã³ã®Windowsã®åããµãã·ã¹ãã ïŒD3D9ã10ã11ïŒã®ç°ãªãããŒãžã§ã³éã®çžäºéçšæ§ã®éµã§ãã
ã€ã³ã¿ãŒãã§ã€ã¹ã衚瀺ããŸãã åãªãœãŒã¹ã¯ããã€ãã®ç°ãªãç®çã«äœ¿çšã§ããåæã«äœ¿çšããããšãã§ããŸãã D3Dã®æ°ããããŒãžã§ã³ã§ã¯ããã€ãã©ã€ã³ã«ãã¯ã¹ãã£ãšãããã¡ãŒã€ã³ã¿ãŒãã§ã€ã¹ãçŽæ¥æäŸããŸããïŒé ç¹ãã€ã³ããã¯ã¹ãããã³å®æ°ãããã¡ãŒãé€ãïŒã代ããã«ããã¬ãŒã³ããŒã·ã§ã³ã€ã³ã¿ãŒãã§ã€ã¹ã®1ã€ãå®è£ ãããã€ãã©ã€ã³ã«æäŸãããªããžã§ã¯ããäœæããŸãã
D3D11ã«ã¯ã次ã®ã¿ã€ãã®ãã¥ãŒã€ã³ã¿ãŒãã§ã€ã¹ããããŸãã
- ID3D11RenderTargetView-ã¬ã³ããªã³ã°ã¿ãŒã²ããã®è¡šçŸïŒè±èªã®ã¬ã³ããªã³ã°ã¿ãŒã²ããïŒã ååã瀺ãããã«ïŒäžè¬ã«ãD3DãšDXGIã®ååã¯é·ãã§ãããéåžžã«èšãã°ïŒãã°ã©ãã£ãã¯ãã€ãã©ã€ã³ã¯ãã®ãã¥ãŒã«é¢é£ä»ãããããªãœãŒã¹ã«æç»ããŸã
- ID3D11ShaderResourceView-ã·ã§ãŒããŒã«ãã£ãŠäœ¿çšããããªãœãŒã¹ã®è¡šçŸïŒäŸã¯ããã¯ã»ã«ã·ã§ãŒããŒããã¯ã»ã«ãéžæããŠãã©ã°ã¡ã³ãã«ã©ãŒã圢æãããã¯ã¹ãã£ã§ãïŒã
- ID3D11DepthStencilView-深床ããã³ã¹ãã³ã·ã«ãããã¡ãŒãšããŠäœ¿çšããããªãœãŒã¹ã®ãã¥ãŒã
- ID3D11UnorderedAccessView-èšç®ã·ã§ãŒããŒã§äœ¿çšããããªãœãŒã¹ã®è¡šçŸïŒCompute ShaderãCS-å®è³ªçã«ã¬ã³ããªã³ã°ããã»ã¹ã«å±ããŠããªãããã説æããŸããïŒã
ã·ã§ãŒããŒã€ã³ã¿ãŒãã§ã€ã¹ ããšãã°ã ID3D11VertexShader ã ã°ã©ãã£ãã¯ãã€ãã©ã€ã³ã®ç¹å®ã®ããã°ã©ã å¯èœãªã¹ããŒãžã®ã·ã§ãŒããŒã³ãŒããã«ãã»ã«åãããã®ã¹ããŒãžã®ã·ã§ãŒããŒãèšå®ããããã«äœ¿çšãããŸãã
ç¶æ ïŒè±èªã®ç¶æ ïŒã®ã€ã³ã¿ãŒãã§ã€ã¹ã ããŸããŸãªéããã°ã©ããã«ã³ã³ãã¢ã¹ããŒãžãæ§æããããã«äœ¿çšãããŸãã äŸãšããŠã¯ã ID3D11RasterizerState ïŒã©ã¹ã¿ã©ã€ã¶ãŒãèšå®ïŒã ID3D11InputLayout ïŒå ¥åã¢ã»ã³ãã©ãŒã®é ç¹ãããã¡ãŒããäŸçµŠãããé ç¹ã«é¢ããæ å ±ãä¿åïŒã ID3D11BlendState ïŒåºåããŒãžã§è²æ··åããã»ã¹ãèšå®ïŒããããŸãã
åé ã§è¿°ã¹ãã·ãŒã³ãæç»ããããã°ã©ã èªäœã«ã€ããŠã¯ãèšäºã®ä»¥äžã®éšåã§èª¬æããŸããã€ãŸãã第2éšã§ã¯ãä»®æ³ã¢ããã¿ãŒãšã·ãŒã³ã®ã¬ã³ããªã³ã°ã«å¿ èŠãªãªãœãŒã¹ã®äœæãšåæåã®ããã»ã¹ã詳现ã«èª¬æããŸãã ã
å®å šãªã³ãŒãã¯ãgithubã®æ¬¡ã®ãªã³ã¯ããå ¥æã§ããŸãïŒ github.com/Lovesan/Reef