
è²æ··å
OpenGLïŒããã³ãã®ä»ã®ã°ã©ãã£ã«ã«APIã
çŽPerã ïŒã®ãã¬ã³ãã¯ãéåžžããªããžã§ã¯ãã®éæåºŠã®å®è£
ã«é¢é£ä»ããããŠããææ³ã§ãã ãªããžã§ã¯ãã®åéææ§ã¯ã1ã€ã®åè²ã§å¡ãã€ã¶ãããŠããªãããšãæå³ããŸãããããŸããŸãªæ¯çã®çŽ æã®é°åœ±ãèåŸã®ãªããžã§ã¯ãã®è²ãšçµã¿åãããŸãã äŸãšããŠãçªã«è²ä»ãã®ã¬ã©ã¹ãå
¥ããããšãã§ããŸããã¬ã©ã¹ã«ã¯ç¬èªã®è²åãããããŸãããæçµçã«ã¯ã¬ã©ã¹ã®è²åããšã¬ã©ã¹ã®åŸãã«èŠãããã¹ãŠã®ãã®ã®æ··åç©ã芳å¯ããŸãã å®éã«ã¯ãåã
ã®ãªããžã§ã¯ãã®è²ã®æ··åã§ããçµæã®è²ã芳å¯ããããããã®åäœããæ··åãšããçšèªãçããŸãã ããã«ãããåéæã®ãªããžã§ã¯ããéããŠèŠããŸãã

åéæã®ãªããžã§ã¯ãã¯ãå®å
šã«éæïŒãã¹ãŠã®è²ãééïŒãŸãã¯éšåçã«éæïŒå
ãééããŸãããç¬èªã®ã·ã§ãŒãã远å ïŒã«ããããšãã§ããŸãã ã³ã³ãã¥ãŒã¿ã°ã©ãã£ãã¯ã¹ã§ã¯ãè²ãã¯ãã«ã®ãããã
ã¢ã«ãã¡æåã®äžéæåºŠã瀺ãã®ãç¿æ
£ã§ãã ã¢ã«ãã¡ã³ã³ããŒãã³ãã¯è²ãã¯ãã«ã®4çªç®ã®èŠçŽ ã§ããã以åã®ã¬ãã¹ã³ã§2åä»¥äžæ°ã¥ããã¯ãã§ãã ãã ãããã®ç¬éãŸã§ããã®å€ã¯åžžã«1.0ã«ä¿ãããŸãããããã¯å®å
šãªäžéæåºŠã«çžåœããŸãã ã¢ã«ãã¡ã³ã³ããŒãã³ãã0.0ã«èšå®ãããšãå®å
šãªéæåºŠãåŸãããŸãã å€0.5ã¯ããªããžã§ã¯ãã®æçµçãªè²ããããªã¢ã«ã«ãã£ãŠ50ïŒ
èšå®ãããèåŸã®ãªããžã§ã¯ãã«ãã£ãŠ50ïŒ
ãèšå®ãããããšãæå³ããŸãã
ãããŸã§äœ¿çšãããã¹ãŠã®ãã¯ã¹ãã£ã«ã¯ãèµ€ãéãç·ã®3ã€ã®è²æåãå«ãŸããŠããŸããã äžéšã®ãã¯ã¹ãã£åœ¢åŒã§ã¯ãåãã¯ã»ã«ã®4çªç®ã®ã¢ã«ãã¡ã³ã³ããŒãã³ããä¿åããããšãã§ããŸãã ãã®å€ã¯ããã¯ã¹ãã£ã®ã©ã®éšåãåéæã§ãã©ã®ããããã瀺ããŸãã ããšãã°ããã®
ãŠã£ã³ããŠãã€ã³ãã¯ã¹ãã£ã®ã¢ã«ãã¡ã³ã³ããŒãã³ãã¯ãã¬ã©ã¹é åã§ã¯0.25ããã¬ãŒã ã§ã¯0.0ã«èšå®ãããŠããŸãã ä»ã®ç¶æ³ã§ã¯ãã¬ã©ã¹éšåã¯å®å
šã«èµ€ã«ãªããŸããã75ïŒ
ã®éæåºŠã«ãããè²ã¯çŸåšã®WebããŒãžã®èæ¯ã«ãã£ãŠã»ãšãã©æ±ºå®ãããŸãã
ããã«ãã®ãã¯ã¹ãã£ãæ°ããã·ãŒã³ã«è¿œå ããŸããããŸãæåã«ãå®å
šãªéæåºŠãŸãã¯å®å
šãªäžéæåºŠã®ãããããå¿
èŠãªå Žåã«éæåºŠãéæããããã®ããç°¡åãªææ³ã«ã€ããŠèª¬æããŸãã
ãã©ã°ã¡ã³ããç Žæ£ãã
å Žåã«ãã£ãŠã¯ãéšåçãªéæåºŠã¯å¿
èŠãããŸããããã¯ã¹ãã£ã®ã«ã©ãŒå€ã«åºã¥ããŠãäœãã衚瀺ããããäœã衚瀺ããªãå¿
èŠããããŸãã èã®æãæ³åããŠãã ãããæã®æãåçŽãªå®è£
ã§ã¯ãã·ãŒã³ã«ãã2Dã¯ã¯ããã«èã®ãã¯ã¹ãã£ãå¿
èŠã§ãã ãã ããã¯ã¯ãããã©ãŒã ã¯èã®æ¢ãã·ãã¥ã¬ãŒãããã¿ã¹ã¯ã«ã¯ããŸã圹ç«ã¡ãŸãããéãåããããã¯ã¹ãã£ã®äžéšãé衚瀺ã«ããŠãä»ã®äžéšãæ®ããŠã害ã«ã¯ãªããŸããã
以äžã«ç€ºããã¯ã¹ãã£ã¯ã説æããã±ãŒã¹ãæ£ç¢ºã«è¡šããŠããŸãããã®ã»ã¯ã·ã§ã³ã¯ãå®å
šã«äžéæïŒã¢ã«ãã¡æå= 1.0ïŒãŸãã¯å®å
šã«éæïŒã¢ã«ãã¡æå= 0.0ïŒã§ãå¹³åå€ã¯ãããŸããã èã®èã®ç»åããªãå Žæã§ã¯ããã¯ã¹ãã£ã®è²ã§ã¯ãªãããµã€ãã®èæ¯ãèŠããããšã«æ°ä»ããããããŸããã
ãããã£ãŠãã·ãŒã³ã«æ€çãé
眮ãããšãã¯ãæ€ç©ã®éšåã«å¯Ÿå¿ãããã¯ã¹ãã£ã®éšåã®ã¿ã衚瀺ããããªãŽã³ãåããæ®ãã®ãã¯ã¹ãã£ãç Žæ£ããŸãã ã€ãŸãããã¯ã¹ãã£ã®éæéšåãå«ããã©ã°ã¡ã³ããã«ã©ãŒãããã¡ã«ä¿åããã«ç Žæ£ããŸãã ãã ãããã©ã°ã¡ã³ãã§æãæ±ãåã«ãã¢ã«ãã¡ãã£ãã«ã䜿çšããŠãã¯ã¹ãã£ãããŒãããæ¹æ³ãåŠç¿ããå¿
èŠããããŸãã
ãããè¡ãã«ã¯ã䜿ãæ
£ããã³ãŒããããŸã倿Žããå¿
èŠã¯ãããŸããã
stb_image.hã®ããŒããŒé¢æ°ã¯ãç»åã®ã¢ã«ãã¡ãã£ãã«ãããã°ãèªåçã«ããŒãããŸãã ããããåæã«ãã¢ã«ãã¡ãã£ãã«ã䜿çšãããã¯ã¹ãã£ãäœæãããšãã«OpenGLã«æç€ºçã«ç€ºãå¿
èŠããããŸãã
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
ãŸãããã©ã°ã¡ã³ãã·ã§ãŒããŒã§ã¯ãRGBå€ã®ã¿ãæ®ãããªãããã«ã4ã€ã®ã³ã³ããŒãã³ããæã€ãã¯ãã«ãéžæããããã«ããŠãã ããã
void main() {
éæåºŠã®ãããã¯ã¹ãã£ã®ããŒããããã£ãã®ã§ã
深床ãã¹ããã¥ãŒããªã¢ã«ã§äœ¿çšããã·ãŒã³ã®åšãã«èã®æ¿ãããã€ãæããŸãã
èã®æ¿ã®äœçœ®ã
glm :: vec3ã®åœ¢åŒã§æ ŒçŽããå°ããªãã¯ãã«ãäœæããŸãããã
vector<glm::vec3> vegetation; vegetation.push_back(glm::vec3(-1.5f, 0.0f, -0.48f)); vegetation.push_back(glm::vec3( 1.5f, 0.0f, 0.51f)); vegetation.push_back(glm::vec3( 0.0f, 0.0f, 0.7f)); vegetation.push_back(glm::vec3(-0.3f, 0.0f, -2.3f)); vegetation.push_back(glm::vec3( 0.5f, 0.0f, -0.6f));
åèãªããžã§ã¯ãã¯ãèã®ãã¯ã¹ãã£ãå²ãåœãŠãããåäžã®åè§åœ¢ãšããŠã¬ã³ããªã³ã°ãããŸãã 3Dã§èãã·ãã¥ã¬ãŒãããæããšããµã€ãã£ã³ã°ãªæ¹æ³ã§ã¯ãããŸããããããªãŽã³ã¢ãã«ã䜿çšãããããã¯ããã«å¹æçã§ãã åãäœçœ®ã«åããã¯ã¹ãã£ãæã€å転ããã¯ã¯ããã®å¥ã®ãã¢ã远å ãããªã©ãå°ããªããªãã¯ã®å©ããåããŠãè¯ãçµæãéæããããšãã§ããŸãã
èã®ãã¯ã¹ãã£ãã¯ã¯ããã«å²ãåœãŠããããæ°ããVAOïŒé ç¹é
åãªããžã§ã¯ãïŒãå¿
èŠã§ãVBOïŒé ç¹ãããã¡ãªããžã§ã¯ãïŒã«å
¥åãã察å¿ãããã€ã³ã¿ãé ç¹å±æ§ã«èšå®ããŸãã ããã«ãåºãšç«æ¹äœã®è¡šé¢ãã¬ã³ããªã³ã°ããåŸãèã衚瀺ããŸãã
glBindVertexArray(vegetationVAO); glBindTexture(GL_TEXTURE_2D, grassTexture); for(unsigned int i = 0; i < vegetation.size(); i++) { model = glm::mat4(1.0f); model = glm::translate(model, vegetation[i]); shader.setMat4("model", model); glDrawArrays(GL_TRIANGLES, 0, 6); }
ããã°ã©ã ãå®è¡ãããšã次ã®çµæãçæãããŸãã
ããã¯ãOpenGLèªäœãã¢ã«ãã¡ãã£ãã«ã®å€ãã©ãåŠçãããããŸããã©ã°ã¡ã³ãããããããã€äœ¿çšããããç¥ããªãããã«çºçããŸããã ãããã¯ãã¹ãŠæåã§æå®ããå¿
èŠããããŸãã 幞ããªããšã«ãã·ã§ãŒããŒã®å©ããåããŠããã¹ãŠãéåžžã«ç°¡åã«è¡ãããŸãã GLSLã«ã¯çµã¿èŸŒã¿ã®
ç Žæ£ãã£ã¬ã¯ãã£ããããããã®åŒã³åºãã¯ãã«ã©ãŒãããã¡ãŒã«èœã¡ãããšãªããçŸåšã®ãã©ã°ã¡ã³ãã®ãããªãåŠçã®åæ¢ã«ã€ãªãããŸãã ãããã解決çãçãŸããŸãããã¯ã¹ãã£èŠçŽ ã®ã¢ã«ãã¡æåã®å€ã確èªããç¹å®ã®ãããå€ãããå°ããå Žåã¯ç Žæ£ããŸãã
#version 330 core out vec4 FragColor; in vec2 TexCoords; uniform sampler2D texture1; void main() { vec4 texColor = texture(texture1, TexCoords); if(texColor.a < 0.1) discard; FragColor = texColor; }
ãã®ã³ãŒãã§ã¯ããã¯ã¹ãã£ãµã³ãã«ã®ã¢ã«ãã¡æåã0.1æªæºã®å Žåããã©ã°ã¡ã³ããç Žæ£ããŸãã ãã®ãããªã·ã§ãŒããŒã¯ãéåžžã«äžéæã§ããããšã倿ãããã©ã°ã¡ã³ãã®ã¿ã®åºåãæäŸããŸãã

å¢çã®ãã¯ã¹ãã£ãååŸãããšããOpenGLã¯å¢çã®å€ãããã¯ã¹ãã£ãç¹°ãè¿ããŠååŸããæ¬¡ã®å€ã®å€ã§è£éããŸãïŒãã¯ã¹ãã£ã®ç¹°ãè¿ããªãã·ã§ã³ãGL_REPEATã«èšå®ããŠãããã ïŒã éåžžã®ãã¯ã¹ãã£ã¢ããªã±ãŒã·ã§ã³ã®å Žåãããã¯æ£åžžã§ãããéæåºŠã®ãããã¯ã¹ãã£ã®å Žåã¯è¯ããããŸãããäžéšå¢çã®å®å
šã«éæãªãã¯ã»ã«å€ã¯ãå®å
šã«äžéæãªäžéšå¢çãã¯ã»ã«ãšæ··åãããŸãã ãã®çµæããã¯ã¹ãã£ã®ããåè§åœ¢ã®åšãã«åéæã®è²ä»ããã¬ãŒã ã衚瀺ãããå ŽåããããŸãã ãã®ã¢ãŒãã£ãã¡ã¯ããåé¿ããã«ã¯ãéæåºŠã®ãããã¯ã¹ãã£ã䜿çšãããšãã«ç¹°ãè¿ããã©ã¡ãŒã¿ãŒãGL_CLAMP_TO_EDGEã«èšå®ããå¿
èŠããããŸãã
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
ã³ãŒãäŸã¯
ãã¡ãã§ãã
ããã·ã³ã°
ãã©ã°ã¡ã³ããç Žæ£ããããšã¯äŸ¿å©ã§ç°¡åãªæ¹æ³ã§ãããšããäºå®ã«ãããããããåéæã®è²ã®éšåçãªæ··åãé©çšããããšãå¯èœã«ããŸããã ç°ãªãäžéæåºŠã®ãªããžã§ã¯ãã§ç»åãã¬ã³ããªã³ã°ããã«ã¯ããã¬ã³ãã¢ãŒããæå¹ã«ããå¿
èŠããããŸãã ããã¯ãã»ãšãã©ã®OpenGLã¢ãŒããšåæ§ã«è¡ãããŸãã
glEnable(GL_BLEND);
ããŠãããã·ã³ã°ããªã³ã«ãããšããããã©ã®ããã«æ©èœããããææ¡ãã䟡å€ããããŸãã
OpenGLããã·ã³ã°ã¯ã次ã®åŒã䜿çšããŠå®è¡ãããŸã
$$ display $$ \ begin {equation} \ bar {C} _ {result} = \ bar {\ color {green} C} _ {source} * \ color {green} F_ {source} + \ bar {\ color {red} C} _ {destination} * \ color {red} F_ {destination} \ end {equation} $$ display $$
ã©ãã§
ãœãŒã¹ã®è²ãã¯ãã«ã§ãã ããã¯ããã¯ã¹ãã£ããååŸããè²ã®å€ã§ãã
ã¬ã·ãŒããŒã®è²ãã¯ãã«ã§ãã ããã¯ãçŸåšã«ã©ãŒãããã¡ã«æ ŒçŽãããŠããã«ã©ãŒå€ã§ãã
-ãœãŒã¹ä¹æ°ã ã¢ã«ãã¡æåããœãŒã¹ã®è²ã«ã©ã®çšåºŠåœ±é¿ããããæå®ããŸãã
-åä¿¡æ©ã®ä¹æ°ã ã¢ã«ãã¡æåãã¬ã·ãŒããŒã®è²ã«åœ±é¿ãã床åããèšå®ããŸãã
ãã©ã°ã¡ã³ãã·ã§ãŒããŒããã³ãã®ä»ã®ãã¹ãïŒã¹ãã³ã·ã«ããã³æ·±åºŠãã¹ãã
çŽPerã ïŒã®å®è¡ãã§ãŒãºã®åŸããã®æ··ååŒã¯ãåŠçæžã¿ã®ãã©ã°ã¡ã³ãã®è²ãšãçŸæç¹ã§ãããã¡ã«ä¿åãããŠããè²ïŒåã®ãã¬ãŒã ã®ãã©ã°ã¡ã³ãã®è²å€ïŒãèªç±ã«äœ¿çšã§ããŸãã OpenGLã¯ãœãŒã¹ãšã¬ã·ãŒããŒã®åœ¹å²ãèªåçã«å²ãåœãŠãŸããããããã®èŠçŽ ãèªåã§èšå®ã§ããŸãã éå§ããã«ã¯ã次ã®äŸãæ€èšããŠãã ããã
äžéæãªèµ€ã®äžã«2ã€ã®æ£æ¹åœ¢ãšåéæã®ç·ãæç»ããŸãã ãã®å Žåãã¬ã·ãŒããŒã®è²ã¯èµ€ãæ£æ¹åœ¢ã®è²ã«ãªããããæåã«ã«ã©ãŒãããã¡ãŒã«ãªã¹ãããå¿
èŠããããŸãã
åé¡ãçºçããŸãïŒæ··ååŒã§å åã®å€ãéžæããæ¹æ³ã¯ïŒ å°ãªããšãã2çªç®ã®æ£æ¹åœ¢ã®ç·è²ã«ã¢ã«ãã¡æåå€ãæããå¿
èŠããããŸãããããã£ãŠã
ãœãŒã¹ã®è²ãã¯ãã«ã®ã¢ã«ãã¡æåã«çãããã€ãŸã 0.6ã ããã«åºã¥ããŠãåä¿¡è
ãå©çšå¯èœãªéæåºŠã«æ¯äŸããçµæãžã®è²¢ç®ãæäŸãããšä»®å®ããããšã¯åççã§ãã ç·ã®åè§ãåèšã®60ïŒ
ãæäŸããå Žåãèµ€ã®åè§ã¯40ïŒ
ïŒ1-0.6ïŒãååŸããŸãã ã ãã乿°
ãŠããã£ãšãœãŒã¹ã«ã©ãŒãã¯ãã«ã®ã¢ã«ãã¡æåã®å·®ã«çããèšå®ããŸãã ãã®çµæãæ··ååŒã¯æ¬¡ã®åœ¢åŒãåããŸãã
$$ display $$ \ begin {equation} \ bar {C} _ {result} = \ begin {pmatrix} \ color {red} {0.0} \\ \ color {green} {1.0} \\ \ color {blue} {0.0} \\ \ color {purple} {0.6} \ end {pmatrix} * \ color {green} {0.6} + \ begin {pmatrix} \ color {red} {1.0} \\ \ color {green} {0.0 } \\ \ color {blue} {0.0} \\ \ color {purple} {1.0} \ end {pmatrix} * \ color {red} {ïŒ1-0.6ïŒ} \ end {equation} $$ display $$
æ··åã®çµæã¯ãå
ã®ç·ãšå
ã®èµ€ã®40ïŒ
ã§æ§æããã60ïŒ
ã®è²ã«ãªããŸã-ããã¯ããŒãããè¶è²ã§ãïŒ
çµæã¯ã«ã©ãŒãããã¡ã«èšé²ãããå€ãå€ã眮ãæããããŸãã
ããŠãã©ã®æ··åä¿æ°å€ã䜿çšãããããOpenGLã«ã©ã®ããã«çè§£ãããã®ã§ããããïŒ å¹žããªããšã«ãç¹å¥ãªæ©èœããããŸãã
glBlendFunc(GLenum sfactor, GLenum dfactor)
ãœãŒã¹ãšã¬ã·ãŒãã®ä¿æ°ã®å€ã決å®ãã2ã€ã®ãã©ã¡ãŒã¿ãŒãåããŸãã OpenGL APIã¯ããããã®ãã©ã¡ãŒã¿ãŒã®å€ã®å®å
šãªãªã¹ããå®çŸ©ããŸããããã«ãããå¿
èŠã«å¿ããŠããã·ã³ã°ã¢ãŒããæ§æã§ããŸãã ããã§ã¯ãæããå®è¡äžãã®ãã©ã¡ãŒã¿ãŒå€ã瀺ããŸãã äžå®ã®è²ãã¯ãã«
glBlendColorã§åå¥ã«èšå®ã
ãŸã ã
2ä¹ã®äŸã§èª¬æããçµæãåŸãã«ã¯ããœãŒã¹ä¿æ°ããœãŒã¹ã«ã©ãŒã®
ã¢ã«ãã¡ ïŒã¢ã«ãã¡æåå€ïŒã«çãããã¬ã·ãŒããŒä¿æ°ã
1-alphaã«çãããã©ã¡ãŒã¿ãŒãéžæããå¿
èŠããããŸãã æ¬¡ã®åŒã³åºããšåçã§ãïŒ
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBlendFuncSeparate颿°ã䜿çšããŠãRGBããã³ã¢ã«ãã¡æåã®ä¿æ°ãåå¥ã«èª¿æŽããããšãã§ããŸãã
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO);
ãã®ãããªåŒã³åºãã¯ãåã®äŸã®ããã«RGBã³ã³ããŒãã³ãã®æ··åã調æŽããçµæã®ã¢ã«ãã¡æåããœãŒã¹ã®ã¢ã«ãã¡æåãšçãããªãããšãããã«ç€ºããŸãã
OpenGLã§ã¯ãæ··ååŒãããã«æè»ã«æ§æã§ãããããåŒã®ã³ã³ããŒãã³ãéã§å®è¡ããæäœãéžæã§ããŸãã ããã©ã«ãã§ã¯ããœãŒã¹ãšã¬ã·ãŒãã®ã³ã³ããŒãã³ããå ç®ãããŸããããããæå³ããå Žåã¯æžç®ãéžæã§ããŸãã 颿°ã®åäœãå®çŸ©ããŸã
glBlendEquation(GLenum mode)
ãŸãããã©ã¡ãŒã¿ãŒå€ã«ã¯3ã€ã®ãªãã·ã§ã³ããããŸãã
- GL_FUNC_ADD ïŒããã©ã«ããã³ã³ããŒãã³ãã远å ããŸãïŒ ã
- GL_FUNC_SUBTRACT ïŒãœãŒã¹ã³ã³ããŒãã³ãããã¬ã·ãŒãã³ã³ããŒãã³ããæžç®ããŸãã ã
- GL_FUNC_REVERSE_SUBTRACT ïŒåä¿¡åŽã³ã³ããŒãã³ããããœãŒã¹ã³ã³ããŒãã³ããæžç®ããŸãã ã
éåžžãããã©ã«ãã¢ãŒãã¯
GL_FUNC_ADDã§ããããã
glBlendEquationã¯å¿
èŠ
ãããŸããããããã£ãŠãã»ãšãã©ã®ã¢ããªã±ãŒã·ã§ã³ã«é©ããŠããŸãã ããããéæšæºçãªã¢ãããŒãããç°åžžãªèŠèŠçãœãªã¥ãŒã·ã§ã³ãäœæããããšããå Žåã¯ãæ··ååŒãèšç®ããä»ã®ã¢ãŒãã圹ç«ã€å ŽåããããŸãã
åéæã®ãã¯ã¹ãã£ã¬ã³ããªã³ã°
ããã§ãã©ã€ãã©ãªãããã·ã³ã°ãå®è¡ããæ¹æ³ãç¥ããŸããã ããã€ãã®éæãªãŠã£ã³ããŠãäœæããŠããã®ç¥èãå®è·µã«ç§»ããŸãã ã¬ãã¹ã³ã®æåãšåãã·ãŒã³ã䜿çšããŸãããèã®æ¿ã®ä»£ããã«ãã¬ãã¹ã³ã®æåã«æ¢ã«è¿°ã¹ã
ãŠã£ã³ããŠãã¯ã¹ãã£ã䜿çšããŠãªããžã§ã¯ããé
眮ããŸãã
éå§ããã«ã¯ãæ··åã¢ãŒãããªã³ã«ããŠããã®ãã©ã¡ãŒã¿ãŒãéžæããŸãã
glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
ãã¬ã³ãããªã³ã«ãããããéæãªãã©ã°ã¡ã³ããç Žæ£ããå¿
èŠããªããªããŸããã ãã©ã°ã¡ã³ãã·ã§ãŒããŒã³ãŒãã¯ä»¥åã®ç¶æ
ã«æ»ããŸãã
#version 330 core out vec4 FragColor; in vec2 TexCoords; uniform sampler2D texture1; void main() { FragColor = texture(texture1, TexCoords); }
ããã§ãåãã©ã°ã¡ã³ããåŠçãããšãã«ãOpenGLã¯ãåŠçäžã®ãã©ã°ã¡ã³ãã®è²ãšãæåã®ã¢ã«ãã¡æåã®å€ã«åŸã£ãŠãããã¡ã«ä¿åãããè²ãæ··åããŸãã ãŠã£ã³ããŠã®ã¬ã©ã¹éšåã¯åéæãªã®ã§ããŠã£ã³ããŠã®åŸãã®æ®ãã®ã·ãŒã³ã衚瀺ãããŸãã
ãã ããããèŠããšãã¬ã³ããªã³ã°ãæ£ãããªãããšãããããŸãã äœããã®çç±ã§ãç§ãã¡ã«æãè¿ããŠã£ã³ããŠã®åéæéšåãããã¯ã°ã©ãŠã³ãã§ä»ã®ãŠã£ã³ããŠãšéãªããŸãïŒ
ãã®çç±ã¯ãæ·±ããã¹ãã§ã¯ãåŠçæã«ééãã©ã°ã¡ã³ããèæ
®ããããã©ãããèæ
®ãããªãããã§ãã ãã®çµæããŠã£ã³ããŠãã¯ã¹ãã£ãæã€ã¯ã¯ããã®ãã¹ãŠã®ãã©ã°ã¡ã³ãã¯ãã¬ã©ã¹ããŒãã«å±ããŠãããã©ããã«ãããããã1ã€ã®æ¹æ³ã§æ·±åºŠãã¹ãã«åæ ŒããŸãã å€ãç Žçã¯ã¬ã©ã¹éšåã®åŸãã«æ®ãã¹ãã§ãããšããäºå®ã«ãããããããæ·±åºŠãã¹ãã¯ããããæšãŠãŸãã
çµè«ïŒãããã«ããŠããåéæã®ãªããžã§ã¯ãã衚瀺ããããšã¯ã§ããŸããããŸããæ·±åºŠãã¹ããšæ··åèªäœããã¹ãŠãæ£ããè¡ãæ¹æ³ã決å®ããããšãæåŸ
ããŠããŸãã ä»ã®ãŠã£ã³ããŠã«ãã£ãŠãããã¯ãããŠãããŠã£ã³ããŠã®æ£ããã¬ã³ããªã³ã°ãä¿èšŒããã«ã¯ããŸãé ãã«ãããŠã£ã³ããŠã衚瀺ããå¿
èŠããããŸãã ãããã£ãŠããŠã£ã³ããŠãæãé ãäœçœ®ããæãè¿ãäœçœ®ã«äžŠã¹æ¿ãããã®é åºã«åŸã£ãŠè¡šç€ºããå¿
èŠããããŸãã
å®å
šã«éæãªå ŽåïŒèã®å ŽåïŒã«ã¯ãããã·ã³ã°ãçºçããªãããããã©ã°ã¡ã³ããããããããæäœã§èª¬æããåé¡ãçºçããªãããšã«æ³šæããŠãã ããã
ã¬ã³ããªã³ã°ã®ä¿å
è€æ°ã®ãªããžã§ã¯ããã¬ã³ããªã³ã°ãããšãã«ããã·ã³ã°ãæ£ããæ©èœãããã«ã¯ãæãé ãããåºåãéå§ããæãè¿ããã®ã§çµäºããå¿
èŠããããŸãã ããã·ã³ã°ãå¿
èŠãšããªãäžéæãªããžã§ã¯ãã¯ã深床ãããã¡ã䜿çšããŠéåžžã®æ¹æ³ã§è¡šç€ºã§ããŸããããã§ã¯ãœãŒãã¯äžèŠã§ãã ãã ããã·ãŒã³ã®äžéæãªéšåã¯ããã¬ã³ãã䜿çšããŠèŠçŽ ãåºåããåã«ã¬ã³ããªã³ã°ããå¿
èŠããããŸãã ãã®çµæãäžéæãªããžã§ã¯ããšéæãªããžã§ã¯ãã®äž¡æ¹ãå«ãã·ãŒã³ãã¬ã³ããªã³ã°ããæé ã¯æ¬¡ã®ãšããã§ãã
- ãã¹ãŠã®äžéæãªããžã§ã¯ããå°å·ããŸãã
- éæãªãªããžã§ã¯ããåé€ããŠäžŠã¹æ¿ããŸãã
- éæãªãªããžã§ã¯ãããœãŒãé ã«æç»ããŸãã
ãœãŒããã1ââã€ã®æ¹æ³ã¯ããªããžã§ã¯ããã芳å¯è
ãŸã§ã®è·é¢ã«åºã¥ããŠé
眮ããããšã§ãã ãã®å€ã¯ãã«ã¡ã©ã®äœçœ®ãã¯ãã«ãšãªããžã§ã¯ãèªäœã®éã®è·é¢ãšããŠæ±ºå®ãããŸãã æ¬¡ã«ãC ++æšæºã©ã€ãã©ãªã®
ãããã³ã³ãããŒå
ã®ãªããžã§ã¯ãã®äœçœ®ãã¯ãã«ãšãšãã«ãã®è·é¢ãä¿åããŸãã 飿³ã³ã³ãã
ãããã¯ãããŒå€ã«åºã¥ããŠæ ŒçŽãããèŠçŽ ã®é åºãèªåçã«ä¿èšŒããããããªããžã§ã¯ãã®ãã¹ãŠã®è·é¢ãšäœçœ®ã®ãã¢ãå
¥åããã ãã§æžã¿ãŸãã
std::map<float, glm::vec3> sorted; for (unsigned int i = 0; i < windows.size(); i++) { float distance = glm::length(camera.Position - windows[i]); sorted[distance] = windows[i]; }
ãã®çµæããŠã£ã³ããŠãªããžã§ã¯ãã®äœçœ®ãæå°ããæå€§ã®è·é¢ã§ãœãŒããããã³ã³ãããäœæãããŸãã
ã¬ã³ããªã³ã°æã«ã¯ãã³ã³ãããéã®é åºïŒæå€§ããæå°ïŒã§åŠçããé©åãªäœçœ®ã«ãŠã£ã³ããŠãæç»ããå¿
èŠããããŸãã
for(std::map<float,glm::vec3>::reverse_iterator it = sorted.rbegin(); it != sorted.rend(); ++it) { model = glm::mat4(1.0f); model = glm::translate(model, it->second); shader.setMat4("model", model); glDrawArrays(GL_TRIANGLES, 0, 6); }
ããã§ã¯ãã³ã³ããã«éã®ã€ãã¬ãŒã¿ã䜿çšããŠãã³ã³ãããéã®é åºã§åŠçãããããã«ããŸãã åãŠã£ã³ããŠãªããžã§ã¯ãã¯ã察å¿ããäœçœ®ã«ç§»åããŠæç»ãããŸãã æ¯èŒçç°¡åãªã³ãŒã倿Žã«ããã以åã«ç¹å®ãããåé¡ã®å®å
šãªè§£æ±ºã«ã€ãªãããŸããã
ã芧ã®ãšãããã·ãŒã³ãæ£ãã衚瀺ãããããã«ãªããŸããã äŸã®ãœãŒã¹ã³ãŒãã¯
ãã¡ãã§ãã
åçŽãªç¯å²ã®äžŠã¹æ¿ãã¯ããã®å Žåã¯ããŸããããŸããããå転ãã¹ã±ãŒãªã³ã°ããªããžã§ã¯ãã®ä»ã®å€æãªã©ã®æ©èœãèæ
®ããŠããªãããšã«æ³šæããŠãã ããã ãŸããè€éãªåœ¢ç¶ã®ãªããžã§ã¯ãã«ã¯ãã«ã¡ã©ããã®è·é¢ã ãã§ãªãããœãŒãã®ããã®ããé«åºŠãªã¡ããªãã¯ãå¿
èŠã«ãªããŸãã
ããã«ãäžŠã¹æ¿ãã¯ç¡æã§ã¯ãããŸããããã®ã¿ã¹ã¯ã®è€éãã¯ã·ãŒã³ã®ã¿ã€ããšæ§æã«ãã£ãŠæ±ºãŸããããã»ã¹èªäœã«ã¯è¿œå ã®èšç®ã³ã¹ããå¿
èŠã§ãã éæãªããžã§ã¯ããšäžéæãªããžã§ã¯ãã®äž¡æ¹ãå«ãã·ãŒã³ãåºåããããã®ããé«åºŠãªæ¹æ³ããããŸããããšãã°ã
Order Independent TransparencyïŒOIT ïŒã¢ã«ãŽãªãºã ãªã©ã§ãã ãããããã®ãããã¯ã®ç¯å²ã¯ã¬ãã¹ã³ã®ç¯å²ãè¶
ããŠããŸãã ãããŠãããã·ã³ã°ã®éåžžã®å®è£
ãè¡ãå¿
èŠããããŸãã ããããæ²ãã¿ã®çç±ã¯ãããŸããããã¯ãããžãŒã®éçãç¥ããæ³šæããããšã§ãéåžžã«å°è±¡çãªçµæãåŸãããšãã§ããŸãïŒ
PS ïŒãããŠãåã³ã³ã¡ã³ãã«
圹ç«ã€ãªã³ã¯ããããŸãã ãã¬ã³ãã¢ãŒãã®éžæãçµæã«ã©ã®ããã«åœ±é¿ããããã©ã€ãã§ç¢ºèªã§ããŸãã
PPS ïŒ
Eanmosãš
ç§ã¯ã転éã調æŽããããã®
é»å ±conf ãæã£ãŠããŸãã 翻蚳ãæäŒããããšããçå£ãªé¡æãããã°ã倧æè¿ã§ãïŒ