
ç«ã®äžã§èå³ãæã£ãŠãã ããã
å
容
ããŒã1.ã¯ããã«
ããŒã2.åºæ¬çãªç §æ
ããŒã3. 3Dã¢ãã«ãããŠã³ããŒããã
ããŒã4.é«åºŠãªOpenGLæ©èœ
ããŒã5.é«åºŠãªç §æ
- Opengl
- ãŠã£ã³ããŠäœæ
- ããã«ã¡ã¯ãŠã£ã³ããŠ
- ããã«ã¡ã¯ãã©ã€ã¢ã³ã°ã«
- ã·ã§ãŒããŒ
- ãã¯ã¹ãã£ãŒ
- å€æ
- 座æšç³»
- ã«ã¡ã©
ããŒã2.åºæ¬çãªç §æ
ããŒã3. 3Dã¢ãã«ãããŠã³ããŒããã
ããŒã4.é«åºŠãªOpenGLæ©èœ
- 深床ãã¹ã
- ã¹ãã³ã·ã«ãã¹ã
- è²æ··å
- é¡ã®ã¯ãªããã³ã°
- ãã¬ãŒã ãããã¡
- ãã¥ãŒããã¯ã«ãŒã
- é«åºŠãªããŒã¿åŠç
- é«åºŠãªGLSL
- 幟äœåŠã·ã§ãŒããŒ
- ã€ã³ã¹ã¿ã³ã¹å
- ã¹ã ãŒãžã³ã°
ããŒã5.é«åºŠãªç §æ
- é«åºŠãªç §æã Blinn-Fongã¢ãã«ã
- ã¬ã³ãè£æ£
- ã·ã£ããŠã«ãŒã
- å šæ¹åã·ã£ããŠããã
OpenGLã§ã¯ããã¹ãŠã3D空éã«ãããŸãããåæã«ç»é¢ãšãŠã£ã³ããŠã¯ãã¯ã»ã«ã®2Dãããªãã¯ã¹ã§ãã ãããã£ãŠãOpenGLã®ã»ãšãã©ã®äœæ¥ã¯ã3D座æšãç»é¢ã«ã¬ã³ããªã³ã°ããããã®2D空éã«å€æããããšã§ãã 3D座æšã2D座æšã«å€æããããã»ã¹ã¯ãOpenGLã°ã©ãã£ãã¯ãã€ãã©ã€ã³ã«ãã£ãŠå¶åŸ¡ãããŸãã ã°ã©ãã£ãã¯ãã€ãã©ã€ã³ã¯2ã€ã®å€§ããªéšåã«åå²ã§ããŸããæåã®éšåã¯3D座æšã2D座æšã«å€æãã2çªç®ã®éšåã¯2D座æšãã«ã©ãŒãã¯ã»ã«ã«å€æããŸãã ãã®ã¬ãã¹ã³ã§ã¯ãã°ã©ãã£ãã¯ãã€ãã©ã€ã³ãšãããããã©ã¹ãšããŠäœ¿çšããŠçŸãããã¯ã»ã«ãäœæããæ¹æ³ã詳现ã«èª¬æããŸãã
2D座æšãšãã¯ã»ã«ã«ã¯éãããããŸãã 2D座æšã¯2D空éå ã®ãã€ã³ãã®éåžžã«æ£ç¢ºãªè¡šçŸã§ããã2Dãã¯ã»ã«ã¯ç»é¢/ãŠã£ã³ããŠå ã®ããããã®äœçœ®ã§ãã
ã°ã©ãã£ãã¯ãã€ãã©ã€ã³ã¯äžé£ã®3D座æšãååŸããç»é¢äžã®2Dã«ã©ãŒãã¯ã»ã«ã«å€æããŸãã ãã®ã°ã©ãã£ãã¯ã³ã³ããã¯è€æ°ã®æ®µéã«åå²ã§ããå段éã§ã¯éå»ã®äœåããã®å ¥åãå¿ èŠã§ãã ãããã®ã¹ããŒãžã¯ãã¹ãŠéåžžã«ç¹æ®åãããŠãããç°¡åã«äžŠè¡ããŠå®è¡ã§ããŸãã 䞊åæ§ã®ãããææ°ã®GPUã®å€ãã¯ããã€ãã©ã€ã³ã®å段éã§å€æ°ã®å°ããªããã°ã©ã ãå®è¡ããããšã«ãããã°ã©ãã£ãã¯ãã€ãã©ã€ã³ããŒã¿ãè¿ éã«åŠçããããã®æ°åã®å°ããªããã»ããµãåããŠããŸãã ãããã®å°ããªããã°ã©ã ã¯ã·ã§ãŒããŒãšåŒã°ããŸã ã
ãããã®ã·ã§ãŒããŒã®äžéšã¯éçºè ãã«ã¹ã¿ãã€ãºã§ãããããç¬èªã®ã·ã§ãŒããŒãäœæããŠæšæºã®ã·ã§ãŒããŒã眮ãæããããšãã§ããŸãã ããã«ããããã€ãã©ã€ã³ã®ç¹å®ã®å Žæã埮調æŽããæ©äŒãã¯ããã«å€ããªããŸããããã¯ãŸãã«ãGPUã§åäœããããCPUæéãç¯çŽã§ããããã§ãã ã·ã§ãŒããŒã¯OpenGLã·ã§ãŒãã£ã³ã°èšèªïŒGLSLïŒã§èšè¿°ãããŠããã次ã®ã¬ãã¹ã³ã§ããã«æãäžããŠãããŸãã
äžã®ç»åã§ã¯ãã°ã©ãã£ãã¯ã¹ãã€ãã©ã€ã³ã®ãã¹ãŠã®æ®µéã®ããããã®è¡šçŸãèŠãããšãã§ããŸãã éãéšåã¯ãç¬èªã®ã·ã§ãŒããŒãæå®ã§ããã¹ããŒãžã瀺ããŠããŸãã

ã芧ã®ãšãããã°ã©ãã£ãã¯ãã€ãã©ã€ã³ã«ã¯å€æ°ã®ã»ã¯ã·ã§ã³ãå«ãŸããŠãããåã»ã¯ã·ã§ã³ã§ã¯ãå®å šã«ã¬ã³ããªã³ã°ããããã¯ã»ã«ã§é ç¹ããŒã¿ãåŠçããéšåãåŠçããŠããŸãã ã³ã³ãã€ãŒã®åã»ã¯ã·ã§ã³ãå°ãç°¡ç¥åãã圢ã§èª¬æããŠãã³ã³ãã€ãŒãã©ã®ããã«æ©èœãããã«ã€ããŠã®è¯ãã¢ã€ãã¢ãæäŸããŸãã
3D座æšã®é åã¯ãé ç¹ããŒã¿ãšåŒã°ããäžè§åœ¢ã圢æã§ããã³ã³ãã¢ã®å ¥åã«éä¿¡ãããŸãã é ç¹ããŒã¿ã¯é ç¹ã®ã³ã¬ã¯ã·ã§ã³ã§ãã é ç¹ã¯ã3D座æšã®äžã«ããããŒã¿ã»ããã§ãã ãã®ããŒã¿ã¯ãä»»æã®ããŒã¿ãå«ãããšãã§ããé ç¹ã®å±æ§ã䜿çšããŠè¡šãããŸãããç°¡åã«ããããã«ãé ç¹ã¯3Dã®äœçœ®ãšè²ã®å€ã§æ§æãããŠãããšä»®å®ããŸãã
OpenGLã¯ãæž¡ããã座æšãšè²ã®å€ã®ã³ã¬ã¯ã·ã§ã³ããäœãæ§æããããç¥ãããã®ã§ãOpenGLã¯ããŒã¿ããã©ã®åœ¢ç¶ã圢æããããæå®ããå¿ èŠããããŸãã äžé£ã®ãã€ã³ããäžé£ã®äžè§åœ¢ããŸãã¯1æ¬ã®é·ãç·ãæç»ããŸããïŒ ãã®ãããªåœ¢ç¶ã¯ããªããã£ããšåŒã°ããã¬ã³ããªã³ã°ã³ãã³ããåŒã³åºããšãã«OpenGLã«æž¡ãããŸãã GL_POINTS ã GL_TRIANGLESãããã³GL_LINE_STRIPã®ããã€ãã®ããªããã£ãããããŸã ã
ãã€ãã©ã€ã³ã®æåã®æ®µéã¯ã1ã€ã®é ç¹ãå ¥åãšããŠåãåãé ç¹ã·ã§ãŒããŒã§ãã é ç¹ã·ã§ãŒããŒã®äž»ãªã¿ã¹ã¯ã¯ã3D座æšãä»ã®3D座æšã«å€æããããšã§ãïŒè©³çŽ°ã¯åŸã»ã©èª¬æããŸãïŒããã®ã·ã§ãŒããŒãå€æŽã§ããããšã«ãããé ç¹å€ã®åºæ¬çãªå€æãå®è¡ã§ããŸãã
ããªããã£ãã®ã¢ã»ã³ããªã¯ãããªããã£ãã圢æããããããããªããã£ããåéããé ç¹ã·ã§ãŒããŒãããã¹ãŠã®é ç¹ïŒ GL_POINTSããªããã£ããéžæãããŠããå Žåã¯1ã€ã®é ç¹ïŒãåãå ¥ããã¹ããŒãžã§ãã ãã®å Žåãäžè§åœ¢ã«ãªããŸãã
ããªããã£ãã¢ã»ã³ããªãã§ãŒãºã®çµæã¯ããžãªã¡ããªã·ã§ãŒããŒã«æž¡ãããŸãã 次ã«ãå ¥åã§ããªããã£ãã圢æããäžé£ã®é ç¹ãåãåããæ°ããé ç¹ãçæããŠæ°ããïŒãŸãã¯ä»ã®ïŒããªããã£ãã圢æããããšã§ãä»ã®åœ¢ç¶ãçæã§ããŸãã ããšãã°ããã®å Žåã圌ã¯ãã®å³ã«å ããŠ2çªç®ã®äžè§åœ¢ãçæããŸãã
ãžãªã¡ããªã·ã§ãŒããŒã®åŠççµæã¯ã©ã¹ã¿ã©ã€ãºã¹ããŒãžã«æž¡ãããçµæã®ããªããã£ãã¯ç»é¢äžã®ãã¯ã»ã«ã«å¯Ÿå¿ãããã©ã°ã¡ã³ãã·ã§ãŒããŒã®ãã©ã°ã¡ã³ãã圢æããŸãã ãã©ã°ã¡ã³ãã·ã§ãŒããŒãéå§ãããåã«ãã«ãããå®è¡ãããŸãã èŠããªããã©ã°ã¡ã³ãã¯ãã¹ãŠç Žæ£ããããããçç£æ§ãåäžããŸãã
OpenGLã®ãã©ã°ã¡ã³ãã¯ããã¯ã»ã«ãæç»ããããã«OpenGLãå¿ èŠãšãããã¹ãŠã®ããŒã¿ã§ãã
ãã©ã°ã¡ã³ãã·ã§ãŒããŒã®äž»ãªç®æšã¯ããã¯ã»ã«ã®æçµçãªè²ãèšç®ããããšã§ããããã¯ãã»ãšãã©ã®å Žåãè¿œå ã®OpenGLãšãã§ã¯ãããã¹ãŠå®è¡ããã段éã§ããããŸãã å€ãã®å Žåããã©ã°ã¡ã³ãã·ã§ãŒããŒã«ã¯3Dã·ãŒã³ã«é¢ãããã¹ãŠã®æ å ±ãå«ãŸããŠãããæçµçãªè²ïŒç §æã圱ãå æºã®è²ãªã©ïŒãå€æŽããããã«äœ¿çšã§ããŸãã
察å¿ãããã¹ãŠã®ã«ã©ãŒå€ã®æ±ºå®ãå®äºãããšãçµæã¯å¥ã®ã¹ããããçµãŸããããã¯ãã¢ã«ãã¡ãã¹ãããã³ãã¬ã³ããšåŒã°ããŸãã ãã®æ®µéã§ã¯ããã©ã°ã¡ã³ãã®æ·±ãïŒããã³ãã³ãã¬ãŒãïŒã®å¯Ÿå¿ããå€ïŒåŸã§ããã«æ»ããŸãïŒããã§ãã¯ãããããã䜿çšããŠãä»ã®ãªããžã§ã¯ãïŒåé¢ãŸãã¯èé¢ïŒã«å¯Ÿãããã©ã°ã¡ã³ãã®äœçœ®ã確èªããŸãã ãã®ã¹ãããã§ã¯ãéæ床ã®å€ããã§ãã¯ããå¿ èŠã«å¿ããŠè²ãæ··ããŸãã ãããã£ãŠãè€æ°ã®ããªããã£ãã®ã¬ã³ããªã³ã°äžããã¯ã»ã«ã®çµæã®è²ã¯ããã©ã°ã¡ã³ãã·ã§ãŒããŒã«ãã£ãŠèšç®ãããè²ãšç°ãªãå ŽåããããŸãã
ã芧ã®ãšãããã°ã©ãã£ãã¯ãã€ãã©ã€ã³ã¯éåžžã«è€éã§ãå€ãã®æ§æå¯èœãªéšåãå«ãŸããŠããŸãã ããã«ãããããããäž»ã«é ç¹ã·ã§ãŒããŒãšãã©ã°ã¡ã³ãã·ã§ãŒããŒã䜿çšããŸãã ãžãªã¡ããªã·ã§ãŒããŒã¯ãªãã·ã§ã³ã§ãããå€ãã®å Žåæšæºã®ãŸãŸã§ãã
ææ°ã®OpenGLã§ã¯ãå°ãªããšãé ç¹ã·ã§ãŒããŒãæå®ããå¿ èŠããããŸãïŒãããªã«ãŒãã«ã¯æšæºã®é ç¹/ãã©ã°ã¡ã³ãã·ã§ãŒããŒã¯ãããŸããïŒã ãã®ãããæåã®äžè§åœ¢ãæãåã«ããªãã®éã®çè«ãåŠã¶å¿ èŠããããããææ°ã®OpenGLãå匷ããã®ã¯é£ããå ŽåããããŸãã ãã®ãã¥ãŒããªã¢ã«ã®æåŸã§ã¯ãã°ã©ãã£ã«ã«ããã°ã©ãã³ã°ã«ã€ããŠå€ããåŠã³ãŸãã
é ç¹è»¢é
æå§ãã«äœããæãã«ã¯ãé ç¹ã«é¢ããOpenGLããŒã¿ãæž¡ãå¿ èŠããããŸãã OpenGLã¯3Dã©ã€ãã©ãªã§ãããããOpenGLã«äŒãããã¹ãŠã®åº§æšã¯3次å 空éïŒxãyãzïŒã«ãããŸãã OpenGLã¯ãæž¡ããããã¹ãŠã® 3D座æšãç»é¢äžã®2Dãã¯ã»ã«ã«å€æããŸããã OpenGLã¯ã3ã€ã®åº§æšãã¹ãŠïŒxãyãzïŒã«ã€ããŠã -1.0ã1.0ã®ç¹å®ã®ééã§ã®ã¿3D座æšãåŠçããŸãã ãã®ãããªåº§æšã¯ãã¹ãŠãããã€ã¹ã«æ£èŠåãããïŒãŸãã¯åã«æ£èŠåãããïŒåº§æšãšåŒã°ããŸãã
1ã€ã®äžè§åœ¢ãæç»ããããã3ã€ã®é ç¹ãæäŸããå¿ èŠããããŸããåé ç¹ã¯3次å 空éã«ãããŸãã ããããGLfloaté åã§æ£èŠåããã圢åŒã§å®çŸ©ããŸãã
GLfloat vertices[] = { -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f, 0.0f, 0.5f, 0.0f };
OpenGLã¯3次å 空éã§åäœãããããz座æšã0.0ã®2次å ã®äžè§åœ¢ãæç»ããŸãã ãããã£ãŠãäžè§åœ¢ã®æ·±ãã¯åãã«ãªãã2次å ã«èŠããŸãã
æ£èŠåãããããã€ã¹åº§æšïŒNDCïŒ
é ç¹ã·ã§ãŒããŒã§é ç¹åº§æšãåŠçãããåŸãxãyãz座æšã-1.0ã1.0ã®ç¯å²ã«ããå°ããªç©ºéã§ããNDCã«æ£èŠåãããå¿ èŠããããŸãã ãã®å¶éãè¶ ãã座æšã¯ãã¹ãŠç Žæ£ãããç»é¢ã«è¡šç€ºãããŸããã 以äžã«ãèšå®ããäžè§åœ¢ã瀺ããŸãã
![]()
ç»é¢åº§æšãšã¯ç°ãªããæ£ã®y軞ã®å€ã¯äžãæãã ïŒ0ã0ïŒåº§æšã¯å·Šäžé ã§ã¯ãªãã°ã©ãã®äžå¿ã§ãã
NDC座æšã¯ã glViewportåŒã³åºãã§æäŸãããããŒã¿ã䜿çšããŠããã¥ãŒããŒããéããŠç»é¢ç©ºé座æšã«å€æãããŸãã 次ã«ãç»é¢ç©ºéã®åº§æšããã©ã°ã¡ã³ãã«å€æãããå ¥åãã©ã°ã¡ã³ãã·ã§ãŒããŒã«äŸçµŠãããŸãã
é ç¹ããŒã¿ã決å®ããåŸãã°ã©ãã£ãã¯ã¹ãã€ãã©ã€ã³ã®æåã®ã¹ããŒãžã§ããé ç¹ã·ã§ãŒããŒã«è»¢éããå¿ èŠããããŸãã ããã¯æ¬¡ã®ããã«è¡ãããŸããGPUã«ã¡ã¢ãªãå²ãåœãŠãé ç¹ããŒã¿ãä¿åããOpenGLã«è»¢éãããããŒã¿ã解éããæ¹æ³ãäŒãã転éãããããŒã¿éãGPUã«è»¢éããŸãã 次ã«ãé ç¹ã·ã§ãŒããŒã¯ã圌ãèšã£ãã®ãšåãæ°ã®é ç¹ãåŠçããŸãã
ãã®ã¡ã¢ãªã¯ãããããé ç¹ãããã¡ãªããžã§ã¯ãïŒVBOïŒãéããŠç®¡çãããŸããVBOã¯ãGPUã¡ã¢ãªã«å€æ°ã®é ç¹ãæ ŒçŽã§ããŸãã ãã®ãããªãããã¡ãªããžã§ã¯ãã䜿çšããå©ç¹ã¯ãäžåºŠã«1ã€ã®é ç¹ãéä¿¡ããå¿ èŠãªããäžåºŠã«å€æ°ã®ããŒã¿ã»ããããããªã«ãŒãã«éä¿¡ã§ããããšã§ãã CPUããGPUãžã®ããŒã¿éä¿¡ã¯ããªãé ããããäžåºŠã«ã§ããã ãå€ãã®ããŒã¿ãéä¿¡ããããšããŸãã ããããããŒã¿ãGPUã«ãããšããã«ãé ç¹ã·ã§ãŒããŒã¯ã»ãŒç¬æã«ãããåãåããŸãã
VBOã¯ãæåã®ã¬ãã¹ã³ã§èª¬æãããªããžã§ã¯ããšã®æåã®åºäŒãã§ãã OpenGLã®ãªããžã§ã¯ããšåæ§ã«ããã®ãããã¡ãŒã«ã¯äžæã®èå¥åããããŸãã glGenBuffersé¢æ°ã䜿çšããŠVBOãäœæã§ããŸãã
GLuint VBO; glGenBuffers(1, &VBO);
OpenGLã«ã¯ãããŸããŸãªçš®é¡ã®ãããã¡ãªããžã§ã¯ããå€æ°ãããŸãã VBO- GL_ARRAY_BUFFERãšå ¥åããŸãã OpenGLã§ã¯ãè€æ°ã®ãããã¡ãŒã®ã¿ã€ããç°ãªãå Žåããããããã€ã³ãã§ããŸãã glBindBufferã䜿çšããŠã GL_ARRAY_BUFFERããããã¡ãŒã«ãã€ã³ãã§ããŸãã
glBindBuffer(GL_ARRAY_BUFFER, VBO);
ãã以éããããã¡ã䜿çšãããã¹ãŠã®åŒã³åºãã¯VBOã§æ©èœããŸãã ããã§ã glBufferDataãåŒã³åºããŠãé ç¹ããŒã¿ããã®ãããã¡ãŒã«ã³ããŒã§ããŸãã
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glBufferDataã¯ãæå®ããããããã¡ã«ãŠãŒã¶ãŒããŒã¿ãã³ããŒããããšãç®çãšããé¢æ°ã§ãã æåã®åŒæ°ã¯ãããŒã¿ã®ã³ããŒå ã®ãããã¡ãŒã®ã¿ã€ãã§ãïŒVBOã¯GL_ARRAY_BUFFERã«ãã€ã³ããããŠããŸã ïŒã 2çªç®ã®åŒæ°ã¯ããããã¡ã«æž¡ãããŒã¿ã®éïŒãã€ãåäœïŒã決å®ããŸãã 3çªç®ã®åŒæ°ã¯ããŒã¿ãã®ãã®ã§ãã
4çªç®ã®åŒæ°ã¯ã転éãããããŒã¿ããããªã«ãŒãã§ã©ã®ããã«äœ¿çšãããã決å®ããŸãã 3ã€ã®ã¢ãŒãããããŸãã
- GL_STATIC_DRAW ïŒããŒã¿ã¯å€æŽãããªãããéåžžã«ãŸãã«ããå€æŽãããŸããã
- GL_DYNAMIC_DRAW ïŒããŒã¿ã¯é »ç¹ã«å€æŽãããŸãã
- GL_STREAM_DRAW ïŒããŒã¿ã¯ã¬ã³ããªã³ã°ããšã«å€åããŸãã
äžè§åœ¢ã®äœçœ®ã®ããŒã¿ã¯å€æŽãããªãããã GL_STATIC_DRAWãéžæããŸãã ããšãã°ãå€ãéåžžã«é »ç¹ã«å€åãããããã¡ãããå Žåã GL_DYNAMIC_DRAWãŸãã¯GL_STREAM_DRAWã䜿çšããŠããã®ãããã¡ã®ããŒã¿ãæãéãæžã蟌ãã¡ã¢ãªé åã«ä¿åããå¿ èŠããããšããæ å ±ããããªã«ãŒãã«æäŸããŸãã
ããã§ãGPUäžã®é ç¹ããŒã¿ãVBOãšãããããã¡ãŒãªããžã§ã¯ãã«ä¿åããŸããã
次ã«ãå®éã®ããŒã¿åŠçã®ããã«é ç¹ã·ã§ãŒããŒãšãã©ã°ã¡ã³ãã·ã§ãŒããŒãäœæããå¿ èŠããããããå§ããŸãããã
é ç¹ã·ã§ãŒããŒ
é ç¹ã·ã§ãŒããŒã¯ãããã°ã©ã å¯èœãªã·ã§ãŒããŒã®1ã€ã§ãã ææ°ã®OpenGLã§ã¯ãäœããæç»ããå Žåãé ç¹ã·ã§ãŒããŒãšãã©ã°ã¡ã³ãã·ã§ãŒããŒãå®çŸ©ããå¿ èŠããããããäžè§åœ¢ãæç»ããããã®2ã€ã®éåžžã«åçŽãªã·ã§ãŒããŒãæäŸããŸãã 次ã®ã¬ãã¹ã³ã§ã¯ãã·ã§ãŒããŒã«ã€ããŠè©³ãã説æããŸãã
æåã«ãã·ã§ãŒããŒèªäœãç¹å¥ãªGLSLèšèªïŒOpenGLã·ã§ãŒãã£ã³ã°èšèªïŒã§èšè¿°ãããããã¢ã»ã³ãã«ããŠãã¢ããªã±ãŒã·ã§ã³ãåäœã§ããããã«ããå¿ èŠããããŸãã æãç°¡åãªã·ã§ãŒããŒã³ãŒãã次ã«ç€ºããŸãã
#version 330 core layout (location = 0) in vec3 position; void main() { gl_Position = vec4(position.x, position.y, position.z, 1.0); }
ã芧ã®ãšãããGLSLã¯Cã«éåžžã«ãã䌌ãŠããŸããåã·ã§ãŒããŒã¯ããã®ããŒãžã§ã³ãã€ã³ã¹ããŒã«ããããšããå§ãŸããŸãã OpenGLããŒãžã§ã³3.3以éã§ã¯ãGLSLããŒãžã§ã³ã¯OpenGLããŒãžã§ã³ãšåãã§ãïŒããšãã°ãGLSL 420ããŒãžã§ã³ã¯OpenGLããŒãžã§ã³4.2ãšåãã§ãïŒã ãŸããã³ã¢ãããã¡ã€ã«ã䜿çšããŠããããšãæ瀺çã«ç€ºããŸããã
次ã«ãinããŒã¯ãŒãã䜿çšããŠãé ç¹ã·ã§ãŒããŒã§ãã¹ãŠã®å ¥åé ç¹å±æ§ãæå®ããŸããã äœçœ®ããŒã¿ãæäœããã ãã§ããã®ã§ãé ç¹å±æ§ã1ã€ã ãæå®ããŸãã GLSLã«ã¯ã1ã4åã®æµ®åå°æ°ç¹æ°ãå«ããã¯ã¿ãŒããŒã¿åããããŸãã é ç¹ã«ã¯3次å 座æšãããããã positionãšããvec3ãäœæããŸãã ãŸãã ã¬ã€ã¢ãŠãã䜿çšããŠå€æ°ã®äœçœ®ãæ瀺çã«ç€ºããŸããïŒlocation = 0ïŒ ã
ãã¯ãã«
ã°ã©ãã£ã«ã«ããã°ã©ãã³ã°ã§ã¯ããã¯ãã«ã®æ°åŠçãªæŠå¿µããã䜿çšããŸããããã¯ããã¯ãã«ããããã空éã®äœçœ®/æ¹åãå®å šã«è¡šããæçšãªæ°åŠçãªç¹æ§ãåããŠããããã§ãã GLSLã®ãã¯ãã«ã®æ倧ãµã€ãºã¯4èŠçŽ ã§ãããåèŠçŽ ãžã®ã¢ã¯ã»ã¹ã¯ãããããvec.x ã vec.y ã vec.zããã³vec.wãä»ããŠååŸã§ããŸãã ã³ã³ããŒãã³ãvec.wã¯ç©ºéå ã®äœçœ®ãšããŠäœ¿çšãããªãããšã«æ³šæããŠãã ããïŒ4Dã§ã¯ãªã3Dã§äœæ¥ããŸãïŒããããŒã¹ãã¯ãã£ãåå²ã§äœæ¥ããå Žåã«åœ¹ç«ã¡ãŸãã ãã¯ãã«ã«ã€ããŠã¯ã次ã®ã¬ãã¹ã³ã§è©³ãã説æããŸãã
é ç¹ã·ã§ãŒããŒã®çµæã瀺ãããã«ãäºåå®çŸ©ãããå€æ°gl_Positionã«å€ãå²ãåœãŠãå¿ èŠããããŸããããã¯ãã¿ã€ãvec4ã§ãã ã¡ã€ã³é¢æ°ãçµäºããåŸãgl_Positionã«æž¡ããã®ã¯äœã§ããé ç¹ã·ã§ãŒããŒã®çµæãšããŠäœ¿çšãããŸãã å ¥åãã¯ãã«ã¯3次å ãªã®ã§ã4次å ã«å€æããå¿ èŠããããŸãã ãããè¡ãã«ã¯ã vec3ã³ã³ããŒãã³ããvec4ã«æž¡ã ã wã³ã³ããŒãã³ãã1.0fã«èšå®ããŸãïŒãã®çç±ã«ã€ããŠã¯åŸã§èª¬æããŸãïŒã
ãã®é ç¹ã·ã§ãŒããŒã¯ãããããããŒã¿ãåŠçãããåã«ãã®ããŒã¿ãåºåã«æž¡ãã ããªã®ã§ãããããããªããèããããšãã§ããæãç°¡åãªã·ã§ãŒããŒã§ãã å®éã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãå ¥åããŒã¿ã¯æ£èŠåãããŠããªããããæåã¯æ£èŠåããå¿ èŠããããŸãã
ã·ã§ãŒããŒã¢ã»ã³ããª
ã·ã§ãŒããŒã®ãœãŒã¹ã³ãŒãïŒCè¡ã«æ ŒçŽïŒãäœæããŸããããOpenGLããã®ã·ã§ãŒããŒã䜿çšããã«ã¯ããã«ãããå¿ èŠããããŸãã
ãŸããã·ã§ãŒããŒãªããžã§ã¯ããäœæããå¿ èŠããããŸãã äœæããããªããžã§ã¯ããžã®ã¢ã¯ã»ã¹ã¯èå¥åãä»ããŠè¡ãããããã GLuintåã®å€æ°ã«ä¿åã ã glCreateShaderãä»ããŠäœæããŸãã
GLuint vertexShader; vertexShader = glCreateShader(GL_VERTEX_SHADER);
ã·ã§ãŒããŒãäœæãããšããäœæããã·ã§ãŒããŒã®ã¿ã€ããæå®ããå¿ èŠããããŸãã é ç¹ã·ã§ãŒããŒãå¿ èŠãªã®ã§ã GL_VERTEX_SHADERãæå®ããŸãã
次ã«ãã·ã§ãŒããŒãœãŒã¹ã³ãŒããã·ã§ãŒããŒãªããžã§ã¯ãã«ãã€ã³ãããŠã³ã³ãã€ã«ããŸãã
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); glCompileShader(vertexShader);
glShaderSourceé¢æ°ã¯ ãæåã®åŒæ°ãšããŠãçµã¿ç«ãŠãå¿ èŠãããã·ã§ãŒããŒãåãåããŸãã 2çªç®ã®åŒæ°ã¯è¡æ°ãèšè¿°ããŸãã ãã®äŸã§ã¯ã1è¡ã®ã¿ã§ãã 3çªç®ã®ãã©ã¡ãŒã¿ãŒã¯ã·ã§ãŒããŒãœãŒã¹ã³ãŒãèªäœã§ããã4çªç®ã®ãã©ã¡ãŒã¿ãŒã¯NULLã®ãŸãŸã«ããŸãã
ã»ãšãã©ã®å Žåãã·ã§ãŒããŒã¢ã»ã³ããªã®æåã確èªããå¿ èŠããããŸãã ã·ã§ãŒããŒããã«ããããŠããªãå Žåã¯ããã«ãäžã«çºçãããšã©ãŒãååŸããŸãã 次ã®ããã«ãšã©ãŒã確èªããŸãã
GLint success; GLchar infoLog[512]; glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
ãŸããã¢ã»ã³ããªã®æåãå€æããããã®çªå·ãšããšã©ãŒãæ ŒçŽããããã®ã³ã³ãããŒïŒååšããå ŽåïŒã宣èšããŸãã ããããglGetShaderivã§æåããã¹ãããŸã ã ã¢ã»ã³ããªã倱æããå Žåã glGetShaderInfoLogã䜿çšããŠãšã©ãŒã¡ãã»ãŒãžãååŸãããã®ãšã©ãŒã衚瀺ã§ããŸãã
if(!success) { glGetShaderInfoLog(vertexShader, 512, NULL, infoLog); std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl; }
ãã®åŸãã³ã³ãã€ã«ãšã©ãŒããªããã°ãã·ã§ãŒããŒãæ§ç¯ãããŸãã
ãã©ã°ã¡ã³ãã·ã§ãŒããŒ
ãã©ã°ã¡ã³ãã·ã§ãŒããŒã¯ãäžè§åœ¢ãæç»ããå¿ èŠããã2çªç®ãšæåŸã®ã·ã§ãŒããŒã§ãã ãã©ã°ã¡ã³ãã·ã§ãŒããŒã¯ãã¯ã»ã«ã«ã©ãŒãèšç®ããŸãã åçŽãã®åã«ãããŠããã©ã°ã¡ã³ãã·ã§ãŒããŒã¯ãªã¬ã³ãžã®ã¿ãåºåããŸãã
ã³ã³ãã¥ãŒã¿ãŒã°ã©ãã£ãã¯ã¹ã®è²ã¯ãèµ€ãç·ãéãéæ床ã®4ã€ã®å€ã®é åãšããŠè¡šãããŸãã ãã®ãããªã³ã³ããŒãã³ãããŒã¹ã¯RGBAãšåŒã°ããŸãã OpenGLãŸãã¯GLSLã§è²ãèšå®ãããšããåã³ã³ããŒãã³ãã®å€ã0.0ã1.0ã®éã«èšå®ããŸãã ããšãã°ãèµ€ãšç·ã®æåã®å€ã1.0fã«èšå®ãããšããããã®è²ãæ··ãã£ãé»è²ãåŸãããŸãã 3ã€ã®ã³ã³ããŒãã³ãã®çµã¿åããã«ãããçŽ1600äžã®ç°ãªãè²ãåŸãããŸãã
#version 330 core out vec4 color; void main() { color = vec4(1.0f, 0.5f, 0.2f, 1.0f); }
åºåãã©ã°ã¡ã³ãã·ã§ãŒããŒã«å¿ èŠãªã®ã¯ã4ã³ã³ããŒãã³ããã¯ãã«ã§ããã«ã©ãŒå€ã®ã¿ã§ãã outããŒã¯ãŒãã䜿çšããŠåºåå€æ°ãæå®ã§ããŸãããã®å€æ°ãcolorãšåŒã³ãŸãã 次ã«ããã®å€æ°vec4ã®å€ãäžéæãªãªã¬ã³ãžã§èšå®ããŸãã
ãã©ã°ã¡ã³ãã·ã§ãŒããŒã®ã¢ã»ã³ãã«ããã»ã¹ã¯ãé ç¹ã·ã§ãŒããŒã®ã¢ã»ã³ãã«ã«äŒŒãŠããŸãããç°ãªãã¿ã€ãã®ã·ã§ãŒããŒãæå®ããå¿ èŠãããã®ã¯GL_FRAGMENT_SHADERã®ã¿ã§ãã
GLuint fragmentShader; fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); glCompileShader(fragmentShader);
äž¡æ¹ã®ã·ã§ãŒããŒãã¢ã»ã³ãã«ãããã¬ã³ããªã³ã°æã«äœ¿çšã§ããããã«ãããã°ã©ã ã«ãªã³ã¯ããã ãã«ãªããŸããã
ã·ã§ãŒããŒããã°ã©ã
ã·ã§ãŒããŒããã°ã©ã ã¯ãè€æ°ã®ã·ã§ãŒããŒã®çµã¿åããã®æçµçµæã§ãããªããžã§ã¯ãã§ãã çµã¿ç«ãŠãããã·ã§ãŒããŒã䜿çšããã«ã¯ãã·ã§ãŒããŒããã°ã©ã ã®ãªããžã§ã¯ãã«æ¥ç¶ãããªããžã§ã¯ããã¬ã³ããªã³ã°ãããšãã«ãã®ããã°ã©ã ãã¢ã¯ãã£ãã«ããå¿ èŠããããŸãããã®ããã°ã©ã ã¯ãæç»ã³ãã³ããåŒã³åºããšãã«äœ¿çšãããŸãã
ã·ã§ãŒããŒãããã°ã©ã ã«æ¥ç¶ãããšãããã·ã§ãŒããŒã®åºåå€ãå¥ã®ã·ã§ãŒããŒã®å ¥åå€ãšæ¯èŒãããŸãã å ¥åå€ãšåºåå€ãäžèŽããªãå Žåãã·ã§ãŒããŒæ¥ç¶äžã«ãšã©ãŒãçºçããããšããããŸãã
ããã°ã©ã ã®äœæã¯éåžžã«ç°¡åã§ãã
GLuint shaderProgram; shaderProgram = glCreateProgram();
glCreateProgramé¢æ°ã¯ããã°ã©ã ãäœæãããã®ããã°ã©ã ã®èå¥åãè¿ããŸãã 次ã«ãã¢ã»ã³ãã«ãããã·ã§ãŒããŒãããã°ã©ã ã«ã¢ã¿ãããã glLinkProgramã䜿çšããŠãããããªã³ã¯ããå¿ èŠããããŸãã
glAttachShader(shaderProgram, vertexShader); glAttachShader(shaderProgram, fragmentShader); glLinkProgram(shaderProgram);
ãã®ã³ãŒãã¯ããèªäœãå®å šã«èšè¿°ããŠããŸãã ã·ã§ãŒããŒãããã°ã©ã ã«æ¥ç¶ãããã€ã³ãããŸãã
ã·ã§ãŒããŒã¢ã»ã³ããªãšåæ§ã«ããã€ã³ãã£ã³ã°ãšãšã©ãŒã¡ãã»ãŒãžã®æåãååŸã§ããŸãã å¯äžã®éãã¯ã glGetShaderivãšglGetShaderInfoLogã®ä»£ããã«äœ¿çšããããšã§ãã
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success); If (!success) { glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog); ⊠}
äœæããããã°ã©ã ã䜿çšããã«ã¯ã glUseProgramãåŒã³åºãå¿ èŠããããŸãã
glUseProgram(shaderProgram);
ã·ã§ãŒããŒãšã¬ã³ããªã³ã°é¢æ°ã®ååŒã³åºãã¯ãããã°ã©ã ãªããžã§ã¯ãïŒããã³ãããã«å¿ããŠãã·ã§ãŒããŒïŒã䜿çšããŸãã
ããã§ãããã€ã³ãåŸã«äœæããã·ã§ãŒããŒãåé€ããããšãå¿ããªãã§ãã ããã ãããã¯ããå¿ èŠãããŸããã
glDeleteShader(vertexShader); glDeleteShader(fragmentShader);
çŸæç¹ã§ã¯ãé ç¹ããŒã¿ãGPUã«æž¡ããGPUã«ãã®åŠçæ¹æ³ãæ瀺ããŸããã ã»ãŒå®äºã§ãã OpenGLã¯ãã¡ã¢ãªå ã®é ç¹ããŒã¿ãè¡šçŸããæ¹æ³ãšãé ç¹ããŒã¿ãé ç¹ã·ã§ãŒããŒã®å±æ§ã«çµåããæ¹æ³ããŸã èªèããŠããŸããã ãããå§ããŸãããã
é ç¹å±æ§ã®ãã€ã³ã
é ç¹ã·ã§ãŒããŒã䜿çšãããšãé ç¹ã®åå±æ§ã«ä»»æã®ããŒã¿ãæå®ã§ããŸãããããã¯ãã©ã®ããŒã¿èŠçŽ ãã©ã®å±æ§ã«å±ããŠãããã瀺ãå¿ èŠããããšããæå³ã§ã¯ãããŸããã ããã¯ãã¬ã³ããªã³ã°ã®åã«OpenGLãé ç¹ããŒã¿ãã©ã®ããã«è§£éããããæ瀺ããå¿ èŠãããããšãæå³ããŸãã
é ç¹ãããã¡ãŒã®åœ¢åŒã¯æ¬¡ã®ãšããã§ãã

- äœçœ®æ å ±ã¯32ãããïŒ4ãã€ãïŒã®æµ®åå°æ°ç¹å€ã§ä¿åãããŸãã
- åäœçœ®ã¯3ã€ã®å€ã§æ§æãããŠããŸãã
- 3ã€ã®å€ã®ã»ããã®éã«ã»ãã¬ãŒã¿ã¯ãããŸããã ãã®ãããªãããã¡ã¯ã å¯éç¶æ ãšåŒã°ããŸãã
- éä¿¡ãããããŒã¿ã®æåã®å€ã¯ããããã¡ãŒã®å é ã§ãã
ãããã®æ©èœãç¥ã£ãŠããã°ãé ç¹ããŒã¿ã解éããæ¹æ³ãOpenGLã«äŒããããšãã§ããŸãã ããã¯glVertexAttribPointeré¢æ°ã䜿çšããŠè¡ãããŸãã
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0); glEnableVertexAttribArray(0);
glVertexAttribPointeré¢æ°ã«ã¯ãã©ã¡ãŒã¿ãŒãã»ãšãã©ãããŸãããããã«èŠãŠã¿ãŸãããã
- æåã®åŒæ°ã¯ãèšå®ããã·ã§ãŒããŒåŒæ°ã瀺ããŸãã 次ã®ããã«äœçœ®ãæå®ãããäœçœ®åŒæ°ã®å€ãæå®ããŸãïŒ layoutïŒlocation = 0ïŒã
- 次ã®åŒæ°ã¯ãã·ã§ãŒããŒã®åŒæ°ã®ãµã€ãºã瀺ããŸãã vec3ã䜿çšããããã3ã瀺ããŸãã
- 3çªç®ã®åŒæ°ã¯ã䜿çšãããããŒã¿åã瀺ããŸãã ã·ã§ãŒããŒã®vecã¯æµ®åå°æ°ç¹æ°ã䜿çšãããã ã GL_FLOATãæå®ããŸãã
- 4çªç®ã®åŒæ°ã¯ãå
¥åãæ£èŠåããå¿
èŠãããããšã瀺ããŸãã GL_TRUEãæå®ãããšããã¹ãŠã®ããŒã¿ã¯0ïŒç¬Šå·ä»ãå€ã®å Žåã¯-1ïŒãã1ã®éã«äœçœ®ããŸããæ£èŠåã¯å¿
èŠãªãããã GL_FALSEã®ãŸãŸã«ããŸãã
- 5çªç®ã®åŒæ°ã¯ã¹ããããšåŒã°ããããŒã¿ã»ããéã®è·é¢ã瀺ããŸãã ãŸãã0ã«çããã¹ããããæå®ãããšãOpenGLãã¹ããããèšç®ããŸãïŒå¯éããããŒã¿ã»ããã§ã®ã¿æ©èœããŸãïŒã ãã®è°è«ããå®è³ªçãªå©çãåŸãæ¹æ³ã¯ãåŸã§æ€èšããŸãã
- æåŸã®ãã©ã¡ãŒã¿ãŒã¯GLvoid *åã§ããããããã®ãããªå¥åŠãªãã£ã¹ããå¿ èŠã§ãã ããã¯ããããã¡å ã®ããŒã¿ã®å é ã®ãªãã»ããã§ãã ãããã¡ã«ã¯ãªãã»ããããªãããã0ãæå®ããŸãã
åé ç¹å±æ§ã¯ãçŸåšGL_ARRAY_BUFFERã«ãã€ã³ããããŠããVBOã«ãã£ãŠç®¡çãããã¡ã¢ãªããå€ãåãåããŸãã ãããã£ãŠãå¥ã®VBOã§glVertexAttribPointerãåŒã³åºããå Žåãé ç¹ããŒã¿ã¯å¥ã®VBOããååŸãããŸãã
é ç¹ããŒã¿ã®è§£éæ¹æ³ãOpenGLã«äŒããåŸã glEnableVertexAttribArrayã䜿çšããŠå±æ§ãæå¹ã«ããå¿ èŠããããŸãã ãããã£ãŠãé ç¹å±æ§ã«åŒæ°ã®äœçœ®ãæž¡ããŸãã ãã¹ãŠãã»ããã¢ããããåŸãVBOã䜿çšããŠãããã¡ãŒå ã®é ç¹ããŒã¿ãåæåããé ç¹ãšãã©ã°ã¡ã³ãã·ã§ãŒããŒãèšå®ããé ç¹ã·ã§ãŒããŒãšé ç¹ããŒã¿ãæ¥ç¶ããæ¹æ³ãOpenGLã«æ瀺ããŸããã OpenGLã§ãªããžã§ã¯ããæç»ãããšã次ã®ããã«ãªããŸãã
// 0. OpenGL glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); // 1. glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0); // 2. glUseProgram(shaderProgram); // 3. someOpenGlFunctionThatDrawsOutTriangle();
ãªããžã§ã¯ããæç»ãããã³ã«ãã®ããã»ã¹ãç¹°ãè¿ãå¿ èŠããããŸãã ããã»ã©é£ããã¯ãªãããã§ãããé ç¹ã®å±æ§ã5ã€ä»¥äžããã100ã®ç°ãªããªããžã§ã¯ãã®é åã«äœãããããšæ³åããŠãã ããã ãããŠãåãªããžã§ã¯ãã«ãããã®æ§æãåžžæã€ã³ã¹ããŒã«ããããšã¯ãããã«ã¯ã€ã«ããªã«ãŒãã³ã«ãªããŸãã ããã¯ãããããã¹ãŠã®ç¶æ ãä¿åããããã®äœããã®æ¹æ³ã§ãããã¬ã³ããªã³ã°ã®ããã«äœããã®ç¶æ ã«ãã€ã³ãããã ãã§ã...
é ç¹é åãªããžã§ã¯ã
é ç¹é åãªããžã§ã¯ãïŒVAOïŒãVBOã®ããã«ãã€ã³ãã§ãããã®åŸãé ç¹å±æ§ãžã®ä»¥éã®ãã¹ãŠã®åŒã³åºãã¯VAOã«æ ŒçŽãããŸãã ãã®æ¹æ³ã®å©ç¹ã¯ãå±æ§ã1åèšå®ããã ãã§æžã¿ããã®åŸã®ãã¹ãŠã®æéã§VAOèšå®ã䜿çšãããããšã§ãã ãŸãããã®æ¹æ³ã§ã¯ãç°ãªãVAOããã€ã³ãããã ãã§ãé ç¹ããŒã¿ãšå±æ§ã®æ§æãç°¡åã«å€æŽã§ããŸãã
Core OpenGL ã§ã¯ ãå ¥åé ç¹ã®æäœæ¹æ³ãOpenGLãèªèã§ããããã«ãVAOã䜿çšããå¿ èŠããããŸãã VAOãæå®ããªãå ŽåãOpenGLã¯ã¬ã³ããªã³ã°ãæåŠããå ŽåããããŸãã
VAOã¯æ¬¡ã®åŒã³åºããä¿åããŸãã
- glEnableVertexAttribArrayãŸãã¯glDisableVertexAttribArrayãåŒã³åºããŸãã
- glVertexAttribPointerãä»ããŠè¡ãããå±æ§èšå®ã
- glVertexAttribPointerã䜿çšããŠé ç¹å±æ§ã«é¢é£ä»ããããVBO

VAOçæããã»ã¹ã¯VBOçæã«éåžžã«äŒŒãŠããŸãïŒ
GLuint VAO; glGenVertexArrays(1, &VAO);
VAOã䜿çšããããã«å¿ èŠãªããšã¯ãVAOãglBindVertexArrayã«ãã€ã³ãããããšã ãã§ã ã 次ã«ãå¿ èŠãªVBOãšå±æ§ãã€ã³ã¿ãŒãæ§æ/ãã€ã³ãããæåŸã«åŸã§äœ¿çšããããã«VAOããã€ã³ã解é€ããå¿ èŠããããŸãã ãããŠä»ããªããžã§ã¯ããæç»ãããã³ã«ããªããžã§ã¯ããã¬ã³ããªã³ã°ããåã«å¿ èŠãªèšå®ã§VAOããã€ã³ãããã ãã§ãã 次ã®ããã«ãªããŸãã
// ..:: ( (, , )) :: .. // 1. VAO glBindVertexArray(VAO); // 2. OpenGL glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); // 3. glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0); glEnableVertexAttribArray(0); //4. VAO glBindVertexArray(0); [...] // ..:: ( ) :: .. // 5. glUseProgram(shaderProgram); glBindVertexArray(VAO); someOpenGLFunctionThatDrawsOurTriangle(); glBindVertexArray(0);
OpenGLã§ã¯ããªããžã§ã¯ãã®é¢é£ä»ãã解é€ããã®ãäžè¬çã§ãã å°ãªããšãæ§æã誀ã£ãŠå°ç¡ãã«ããªãããã ãã§ãã
以äžã§ãïŒ ç§ãã¡ãäœçŸäžããŒãžä»¥äžè¡ã£ãŠããããšã¯ãã¹ãŠããã®ç¹ã«ç§ãã¡ããããããŸããã é ç¹å±æ§ãšå¿ èŠãªVBOãæ ŒçŽããVAOã å€ãã®å Žåãã¬ã³ããªã³ã°çšã®è€æ°ã®ãªããžã§ã¯ããããå Žåãæåã«VAOãçæããã³æ§æããåŸã§äœ¿çšããããã«ããããä¿åããŸãã ãªããžã§ã¯ãã®1ã€ãæç»ããå¿ èŠãããå Žåã¯ãä¿åãããVAOã䜿çšããŸãã
åŸ ã£ãŠããäžè§åœ¢
ãªããžã§ã¯ããã¬ã³ããªã³ã°ããããã«ãOpenGLã¯glDrawArraysé¢æ°ãæäŸããŸãã ã¢ã¯ãã£ãã·ã§ãŒããŒãšã€ã³ã¹ããŒã«ãããVAOã䜿çšããŠãæå®ãããããªããã£ããã¬ã³ããªã³ã°ããŸãã
glUseProgram(shaderProgram); glBindVertexArray(VAO); glDrawArrays(GL_TRIANGLES, 0, 3); glBindVertexArray(0);
glDrawArraysé¢æ°ã¯ãæç»ããããªããã£ããOpenGLã®æåã®åŒæ°ãšããŠåãåããŸããäžè§åœ¢ãæãããã®ã§ãåãã€ããããªãã®ã§ãGL_TRIANGLESãæå®ããŸãã2çªç®ã®åŒæ°ã¯ãæç»ããé ç¹ãå«ãé åã®éå§ã€ã³ããã¯ã¹ã瀺ããŸãã0ã®ãŸãŸã«ããŸããæåŸã®åŒæ°ã¯ãæç»ããé ç¹ã®æ°ã瀺ããŸãã3ãæç»ããå¿ èŠããããŸãïŒ1ã€ã®äžè§åœ¢ã®é·ãã¯3é ç¹ã§ãïŒã
ããã§ãèšè¿°ãããã³ãŒãããã«ãããŠå®è¡ã§ããŸãã次ã®çµæã衚瀺

ãããŸãããœãŒã¹ã³ãŒãã¯ãã¡ãã«ãããŸãã
çµæãç°ãªãå Žåã¯ãããããã©ããééã£ãŠããŸããã³ãŒããäžèšã®ãœãŒã¹ã³ãŒããšæ¯èŒããŸãã
èŠçŽ ãããã¡ãªããžã§ã¯ã
ä»æ¥ã®é ç¹ã¬ã³ããªã³ã°ã«ã€ããŠæåŸã«èª¬æããã®ã¯ãèŠçŽ ãããã¡ãªããžã§ã¯ãïŒEBOïŒã§ãããããäœã§ãããã©ã®ããã«æ©èœãããã説æããããã«ãäŸãæããã»ããè¯ãã§ããããäžè§åœ¢ã§ã¯ãªãåè§åœ¢ãæãå¿ èŠããããšããŸãããã2ã€ã®äžè§åœ¢ã䜿çšããŠåè§åœ¢ãæç»ã§ããŸãïŒOpenGLã¯äž»ã«äžè§åœ¢ã§æ©èœããŸãïŒã
翻蚳è ããã®ã¡ã¢
ãŠãŒã¶ãŒproydakovãææããããã«ããã®ãªããžã§ã¯ãã¯ããããã€ã³ããã¯ã¹ãããã¡ãŒãªããžã§ã¯ããIBOãšãåŒã°ããŸãã
ãããã£ãŠã次ã®äžé£ã®é ç¹ã宣èšããå¿ èŠããããŸãã
GLfloat vertices[] = { // 0.5f, 0.5f, 0.0f, // 0.5f, -0.5f, 0.0f, // -0.5f, 0.5f, 0.0f, // // 0.5f, -0.5f, 0.0f, // -0.5f, -0.5f, 0.0f, // -0.5f, 0.5f, 0.0f // };
ã芧ã®ãšãããå³äžãšå·Šäžã®é ç¹ã2åæå®ããŸããã 6ã€ã§ã¯ãªã4ã€ã®é ç¹ãæã€é·æ¹åœ¢ãèšè¿°ããããšãã§ãããããããã¯ãªãœãŒã¹ã®ããŸãåççãªäœ¿çšã§ã¯ãããŸããã1000ãè¶ ããäžè§åœ¢ãæã€ããšãã§ãã倧ããªã¢ãã«ãæ±ãå Žåãåé¡ã¯ããã«éèŠã«ãªããŸãããã®åé¡ã®æãæ£ãã解決çã¯ãäžæã®é ç¹ã®ã¿ãä¿åããã¬ã³ããªã³ã°ãå®è¡ããé åºãåå¥ã«ç€ºãããšã§ãããã®å Žåã4ã€ã®é ç¹ãä¿åããã ãã§ãæç»ããé åºãæå®ã§ããŸãã OpenGLããã®ãããªæ©äŒãæäŸããŠããããçŽ æŽããããšæããŸãã
幞ããªããšã«ãEBOã¯ãŸãã«ç§ãã¡ãå¿ èŠãšããŠãããã®ã§ããEBOã¯VBOã®ãããªãããã¡ãŒã§ãããæç»ããé ç¹ã決å®ããããã«OpenGLã䜿çšããã€ã³ããã¯ã¹ãä¿åããŸããããã¯ã€ã³ããã¯ã¹ä»ãæç»ãšåŒã°ããäžèšã®åé¡ã®è§£æ±ºçã§ããæåã«ãäžæã®é ç¹ãšã€ã³ããã¯ã¹ãæå®ããŠããããäžè§åœ¢ãšããŠæç»ããå¿ èŠããããŸãã
GLfloat vertices[] = { 0.5f, 0.5f, 0.0f, // 0.5f, -0.5f, 0.0f, // -0.5f, -0.5f, 0.0f, // -0.5f, 0.5f, 0.0f // }; GLuint indices[] = { // , 0! 0, 1, 3, // 1, 2, 3 // };
ã芧ã®ãšãããå¿ èŠãªé ç¹ã¯6ã§ã¯ãªã4ã€ã ãã§ãã次ã«ãEBOãäœæããå¿ èŠããããŸãã
GLuint EBO; glGenBuffers(1, &EBO);
VBOãšåæ§ã«ãEBOããã€ã³ãããglBufferDataãä»ããŠãã®ãããã¡ãŒã«ã€ã³ããã¯ã¹ãã³ããŒããŸããVBOã®å Žåãšåæ§ã«ããã€ã³ãã£ã³ã°ã³ãã³ããšãã«ãããªã³ã°ã³ãã³ãïŒglBindBufferïŒGL_ELEMENT_ARRAY_BUFFERã0ïŒã®éã«åŒã³åºããé 眮ãââãŸããä»åã®ã¿ãããã¡ãŒã¿ã€ããGL_ELEMENT_ARRAY_BUFFERã§ãã
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
å®å ãããã¡ãšããŠGL_ELEMENT_ARRAY_BUFFERãæž¡ããŠããããšã«æ³šæããŠãã ãããç§ãã¡ãè¡ãå¿ èŠãããæåŸã®äºã¯-ã³ãŒã«çœ®ãæããããšã§ãglDrawArraysã«ã³ãŒã«glDrawElementsããæã ã¯ããããã¡ã€ã³ããã¯ã¹ã®äžè§åœ¢ãæãããããšã瀺ãããã«ãglDrawElementsã䜿çšãããšãçŸåšãã€ã³ããããŠããEBOããã¬ã³ããªã³ã°ãå®è¡ãããŸãã
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
æåã®åŒæ°ã¯glDrawArraysã®ããã«ãã¬ã³ããªã³ã°ãããããªããã£ããèšè¿°ããŸãã 2çªç®ã®åŒæ°ã¯ãã¬ã³ããªã³ã°ããèŠçŽ ã®æ°ã§ãã 6ã€ã®ã€ã³ããã¯ã¹ãæå®ããããã6ã€ã®é ç¹ãé¢æ°ã«æž¡ããŸãã 3çªç®ã®åŒæ°ã¯ã€ã³ããã¯ã¹ããŒã¿åã§ããã®äŸã§ã¯GL_UNSIGNED_INTã§ããæåŸã®åŒæ°ã¯ãããªãã®EBOã®ãªãã»ããïŒãŸãã¯é åã€ã³ããã¯ã¹ã転éãããããããªãEBOã䜿çšããŠïŒç§éã¯ã¡ããã©0ãæå®ããŠãæå®ããããšãã§ããŸã
æ©èœglDrawElementsãã«çžãé»æµããåãã€ã³ããã¯ã¹ãGL_ELEMENT_ARRAY_BUFFER EBOãããã¯ãæ¯åç°ãªãEBOãã¢ã¿ããããå¿ èŠãããå Žåãæå³ããŸããããããVAOã¯EBOãä¿åããæ¹æ³ãç¥ã£ãŠããŸãã

ã¿ãŒã²ãããGL_ELEMENT_ARRAY_BUFFERã®å ŽåãVAOã¯glBindBufferã®åŒã³åºããä¿åããŸãããŸãã解ãåŒã³åºããä¿åããããšãæå³ãããããVAOã解ãåã«EBOã解ããªãããã«ããŠãã ãããããããªããšãEBOããŸã£ããæ¥ç¶ãããŸããã
ãã®çµæã次ã®ã³ãŒãã®ãããªãã®ãåŸãããŸãã
// ..:: :: .. // 1. VAO glBindVertexArray(VAO); // 2. OpenGL glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); // 3. OpenGL glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); // 3. glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0); glEnableVertexAttribArray(0); // 4. VAO ( EBO) glBindVertexArray(0); [...] // ..:: ( ) :: .. glUseProgram(shaderProgram); glBindVertexArray(VAO); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0) glBindVertexArray(0);
ããã°ã©ã ãèµ·åãããšã次ã®çµæãçæãããŸããå·Šã®ç»åã¯èšç»ã©ããã§ãããå³ã®ç»åã¯ã¯ã€ã€ãã¬ãŒã ã¢ãŒãã§æç»ãããé·æ¹åœ¢ã§ããã芧ã®ãšããããã®åè§åœ¢ã¯2ã€ã®äžè§åœ¢ã§æ§æãããŠããŸãã

Wireframe
, OpenGL, glPolygonMode(GL_FRONT_AND_BACK, GL_LINE) . , , , . , â glPolygonMode(GL_FRONT_AND_BACK, GL_FILL).
äœãåé¡ãããå Žåã¯ãã¬ãã¹ã³ãããçŽããŠãã ãããäœãå¿ããŠãããããããŸããããŸãããœãŒã¹ã³ãŒãã確èªããããšãã§ããŸãã
ãã¹ãŠãããŸããã£ããªããããã§ãšãããããŸããããªãã¯ãææ°ã®OpenGLãåŠã¶äžã§æãé£ããéšåã®1ã€ã§ãããæåã®äžè§åœ¢ãèŠã€ããã ãã§ãããã®éšåã¯éåžžã«è€éã§ããæåã®äžè§åœ¢ãæãã«ã¯ãããçšåºŠã®ç¥èãå¿ èŠã ããã§ãã幞ããªããšã«ãç§ãã¡ã¯ãã§ã«ãããçµéšããŠããããã®åŸã®ã¬ãã¹ã³ã¯ããç°¡åã«ãªãã¯ãã§ãã
è¿œå ã®ãªãœãŒã¹
- antongerdelan.net/hellotriangleïŒã¢ã³ãã³ã»ã¬ãŒãã©ã³ã¹ã¯æåã®äžè§åœ¢ãæããŸã..
- open.gl/drawingïŒAlexander Overvoordesã¯æåã®äžè§åœ¢ãæããŸãã
- antongerdelan.net/vertexbuffersïŒVBOã®å°ããªã€ã³ãã³ãã
- learnopengl.com/#!In-Practice/DebuggingïŒãã®ã¬ãã¹ã³ã§ã¯ããã®ã¬ãã¹ã³ããå€ãã®ããšãåŠã³ãŸãããã©ããã«è¡ãè©°ãŸã£ãŠããå Žåã¯ããã®ããŒãžãåç §ããŠãã ãããïŒãã®ããŒãžã®ç¿»èš³åŸã翻蚳ãžã®ãªã³ã¯ãäœæããŸãïŒã
æŒç¿
調æ»ãçµ±åããããã«ãããã€ãã®æŒç¿ãæäŸããŸãã
- ããã«é ç¹ãè¿œå ããŠãglDrawArraysã䜿çšããŠ2ã€ã®äžè§åœ¢ã1ã€ãã€æç»ããŠã¿ãŠãã ããã解決ç
- 2ã€ã®ç°ãªãVAOãšVBOã䜿çšããŠ2ã€ã®äžè§åœ¢ãäœæããŸãã解決ç
- 2çªç®ã®ãã©ã°ã¡ã³ãã·ã§ãŒããŒãäœæããé»è²ã§è¡šç€ºããŸãããããŠã2çªç®ã®äžè§åœ¢ãé»è²ã«ããŸãã解決ç