
æåŸã®ã¬ãã¹ã³ã§ã¯ããŠã£ã³ããŠãéãããšãšããªããã£ããªãŠãŒã¶ãŒå
¥åããã¹ã¿ãŒããŸããã ãã®ã¬ãã¹ã³ã§ã¯ãé ç¹ãç»é¢ã«è¡šç€ºãããã¹ãŠã®åºæ¬ãåæããVAOãVBOãEBOãªã©ã®OpenGLã®ãã¹ãŠã®æ©èœã䜿çšããŠãäžè§åœ¢ã®ãã¢ãæç»ããŸãã
ç«ã®äžã§èå³ãæã£ãŠãã ããã
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
ã芧ã®ãšããã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)
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)
ãã®ã³ãŒãã¯ããèªäœãå®å
šã«èšè¿°ããŠããŸãã ã·ã§ãŒããŒãããã°ã©ã ã«æ¥ç¶ãããã€ã³ãããŸãã
ã·ã§ãŒããŒã¢ã»ã³ããªãšåæ§ã«ããã€ã³ãã£ã³ã°ãšãšã©ãŒã¡ãã»ãŒãžã®æåãååŸã§ããŸãã å¯äžã®éãã¯ã glGetShaderivãšglGetShaderInfoLogã®ä»£ããã«äœ¿çšããããšã§ãã
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success)
äœæããããã°ã©ã ã䜿çšããã«ã¯ã
glUseProgramãåŒã³åºãå¿
èŠããããŸãã
glUseProgram(shaderProgram)
ã·ã§ãŒããŒãšã¬ã³ããªã³ã°é¢æ°ã®ååŒã³åºãã¯ãããã°ã©ã ãªããžã§ã¯ãïŒããã³ãããã«å¿ããŠãã·ã§ãŒããŒïŒã䜿çšããŸãã
ããã§ãããã€ã³ãåŸã«äœæããã·ã§ãŒããŒãåé€ããããšãå¿ããªãã§ãã ããã ãããã¯ããå¿
èŠãããŸããã
glDeleteShader(vertexShader)
çŸæç¹ã§ã¯ãé ç¹ããŒã¿ã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)
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)
æåã®åŒæ°ã¯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ã€ã§ãããæåã®äžè§åœ¢ãèŠã€ããã ãã§ãããã®éšåã¯éåžžã«è€éã§ããæåã®äžè§åœ¢ãæãã«ã¯ãããçšåºŠã®ç¥èãå¿
èŠã ããã§ãã幞ããªããšã«ãç§ãã¡ã¯ãã§ã«ãããçµéšããŠããããã®åŸã®ã¬ãã¹ã³ã¯ããç°¡åã«ãªãã¯ãã§ããè¿œå ã®ãªãœãŒã¹
æŒç¿
調æ»ãçµ±åããããã«ãããã€ãã®æŒç¿ãæäŸããŸãã- ããã«é ç¹ãè¿œå ããŠãglDrawArraysã䜿çšããŠ2ã€ã®äžè§åœ¢ã1ã€ãã€æç»ããŠã¿ãŠãã ããã解決ç
- 2ã€ã®ç°ãªãVAOãšVBOã䜿çšããŠ2ã€ã®äžè§åœ¢ãäœæããŸãã解決ç
- 2çªç®ã®ãã©ã°ã¡ã³ãã·ã§ãŒããŒãäœæããé»è²ã§è¡šç€ºããŸãããããŠã2çªç®ã®äžè§åœ¢ãé»è²ã«ããŸãã解決ç