åã®ã¬ãã¹ã³ã§ã¯ãããµãŒãã§ã¹ã·ã§ãŒããŒãã®ãããã¯ãšãã®äœ¿çšæ¹æ³ã«ã€ããŠç°¡åã«è§ŠããŸããã ãã®ã¬ãã¹ã³ã§ã¯ãã·ã§ãŒããŒãç¹ã«OpenGLã·ã§ãŒããŒèšèªïŒOpenGLã·ã§ãŒãã£ã³ã°èšèªïŒã«ã€ããŠè©³ããèŠãŠãããŸãã
ã¡ãã¥ãŒ
- ã¯ããã«
- Opengl
- ãŠã£ã³ããŠäœæ
- ããã«ã¡ã¯ãŠã£ã³ããŠ
- ããã«ã¡ã¯ãã©ã€ã¢ã³ã°ã«
- ã·ã§ãŒããŒ
GLSL
ã·ã§ãŒããŒïŒäžèšã®ããã«ãã·ã§ãŒããŒã¯ããã°ã©ã ã§ãïŒã¯ãGLSLèšèªã®ãããªCã§ããã°ã©ã ãããŠããŸãã ã°ã©ãã£ãã¯ã¹ã§ã®äœ¿çšã«é©åããŠããããã¯ãã«ããã³è¡åãæäœããããã®æ©èœãæäŸããŸãã
ã·ã§ãŒããŒã®èª¬æã¯ããã®ããŒãžã§ã³ã®è¡šç€ºã§å§ãŸããå
¥åããã³åºåå€æ°ãã°ããŒãã«å€æ°ïŒçµ±äžããŒã¯ãŒãïŒãã¡ã€ã³é¢æ°ã®ãªã¹ããç¶ããŸãã é¢æ°mainã¯ãã·ã§ãŒããŒã®éå§ç¹ã§ãã ãã®é¢æ°å
ã§ã¯ãå
¥åããŒã¿ãæäœã§ããŸããã·ã§ãŒããŒã®çµæã¯åºåå€æ°ã«é
眮ãããŸãã çµ±äžãããããŒã¯ãŒãã«æ³šæãæããªãã§ãã ãããåŸã§ããã«æ»ããŸãã
以äžã¯ãäžè¬åãããã·ã§ãŒããŒæ§é ã§ãã
#version version_number in type in_variable_name; in type in_variable_name; out type out_variable_name; uniform type uniform_name; void main() {
é ç¹ã·ã§ãŒããŒã®å
¥åå€æ°ã¯ãé ç¹å±æ§ãšåŒã°ããŸãã ã·ã§ãŒããŒã«è»¢éã§ããé ç¹ã®æ倧æ°ããããŸãããã®ãããªå¶éã¯ãå¶éãããããŒããŠã§ã¢æ©èœã«ãã£ãŠèª²ããããŸãã OpenGLã¯ãå°ãªããšã16 4åã®ã³ã³ããŒãã³ãé ç¹ã転éããæ©èœãä¿èšŒããŸããã€ãŸããå°ãªããšã64åã®å€ãã·ã§ãŒããŒã«è»¢éã§ããŸãã ãã ãããã®æ°Žæºã倧å¹
ã«åŒãäžããã³ã³ãã¥ãŒãã£ã³ã°ããã€ã¹ãããããšãèæ
®ãã䟡å€ããããŸãã GL_MAX_VERTEX_ATTRIBSå±æ§ã調ã¹ãããšã§ãã·ã§ãŒããŒã«æž¡ãããå
¥åé ç¹å€æ°ã®æ倧æ°ãèŠã€ããããšãã§ããŸãã
GLint nrAttributes; glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &nrAttributes); std::cout << "Maximum nr of vertex attributes supported: " << nrAttributes << std::endl;
ãã®ã³ãŒããå®è¡ããçµæãFigure> = 16ã衚瀺ãããŸãã
çš®é¡
GLSLã¯ãä»ã®ããã°ã©ãã³ã°èšèªãšåæ§ã«ãå€æ°ã¿ã€ãã®ç¹å®ã®ãªã¹ããæäŸããŸã;ãããã«ã¯ãintãfloatãdoubleãuintãboolãšããããªããã£ãã¿ã€ããå«ãŸããŸãã GLSLã¯ããã¯ã¿ãŒãšãããªãã¯ã¹ã®2ã€ã®ã³ã³ãããŒã¿ã€ããæäŸããŸãã
ãã¯ãã«
GLSLã®ãã¯ã¿ãŒã¯ã1ã4åã®ä»»æã®ããªããã£ãåã®å€ãå«ãã³ã³ãããŒã§ãã ã³ã³ããã®ãã¯ãã«å®£èšã¯æ¬¡ã®ããã«ãªããŸãïŒnã¯ãã¯ãã«èŠçŽ ã®æ°ã§ãïŒïŒ
vecnïŒvec4ãªã©ïŒã¯ãfloatåã®nåã®å€ãå«ãæšæºãã¯ãã«ã§ãã
bvecnïŒbvec4ãªã©ïŒã¯ãããŒã«åã®nåã®å€ãå«ããã¯ãã«ã§ã
ivecnïŒäŸãã°ãivec4ïŒã¯ãnåã®æŽæ°å€ãå«ããã¯ãã«ã§ãã
uvecnïŒããšãã°ãuvecnïŒã¯ã笊å·ãªãæŽæ°åã®nåã®å€ãå«ããã¯ãã«ã§ãã
dvecnïŒdvecnãªã©ïŒã¯ãnåã®doubleå€ãå«ããã¯ãã«ã§ãã
ã»ãšãã©ã®å Žåãæšæºãã¯ãã«vecnã䜿çšãããŸãã
ãã¯ã¿ãŒã³ã³ããã®èŠçŽ ã«ã¢ã¯ã»ã¹ããã«ã¯ã次ã®æ§ævec.xãvec.yãvec.zãvec.wã䜿çšããŸãïŒãã®å ŽåãæåããæåŸãŸã§ãã¹ãŠã®èŠçŽ ãé çªã«åŠçããŸããïŒã ãã¯ãã«ãè²ãè¡šãå Žåã¯RGBAãç¹°ãè¿ãããã¯ãã«ããã¯ã¹ãã£ã®åº§æšãè¡šãå Žåã¯stpqãç¹°ãè¿ãããšãã§ããŸãã
PS XYZWãRGBAãSTPQãä»ãã1ã€ã®ãã¯ã¿ãŒãžã®ã¢ã¯ã»ã¹ãèš±å¯ãããŸãã ãã®ã¡ã¢ãè¡åã®æéãšããå¿
èŠã¯ãããŸããã
PPSäžè¬ã«ãã€ã³ããã¯ã¹ãšã€ã³ããã¯ã¹[]ã«ããã¢ã¯ã»ã¹æŒç®åã䜿çšããŠããã¯ãã«ã®ç¹°ãè¿ããçŠæ¢ãã人ã¯ããŸããã https://en.wikibooks.org/wiki/GLSL_Programming/Vector_and_Matrix_Operations#Components
ãã¯ãã«ããããã€ã³ããä»ããŠããŒã¿ã«ã¢ã¯ã»ã¹ããå Žåã1ã€ã®å€ã ãã§ãªãã ã¹ãŠã£ãºãªã³ã°ãšåŒã°ãã次ã®æ§æã䜿çšããŠãã¯ãã«å
šäœãååŸã§ããŸãã
vec2 someVec; vec4 differentVec = someVec.xyxx; vec3 anotherVec = differentVec.zyw; vec4 otherVec = someVec.xxxx + anotherVec.yxzy;
æ°ãããã¯ãã«ãäœæããã«ã¯ãåãã¿ã€ããŸãã¯ãã¯ãã«ã®ãªãã©ã«ãæ倧4ã€äœ¿çšã§ããŸããã«ãŒã«ã¯1ã€ã ãã§ããããšãã°ãå¿
èŠãªèŠçŽ ã®æ°ãååŸããå¿
èŠããããŸãã 3ã€ã®èŠçŽ ãš1ã€ã®ãªãã©ã«ã ãŸããnåã®èŠçŽ ã®ãã¯ãã«ãäœæããã«ã¯ãåäžã®å€ã䜿çšã§ããŸã;ãã®å Žåããã¯ãã«ã®ãã¹ãŠã®èŠçŽ ããã®å€ãåããŸãã ããªããã£ãåã®å€æ°ã®äœ¿çšãèš±å¯ãããŠããŸãã
vec2 vect = vec2(0.5f, 0.7f); vec4 result = vec4(vect, 0.0f, 0.0f); vec4 otherResult = vec4(result.xyz, 1.0f);
ãã¯ãã«ã¯éåžžã«æè»ãªããŒã¿åã§ãããå
¥åå€æ°ããã³åºåå€æ°ãšããŠäœ¿çšã§ããããšã«æ°ä»ããããããŸããã
ã€ã³å€æ°ãšã¢ãŠãå€æ°
ã·ã§ãŒããŒã¯å°ããªããã°ã©ã ã§ãããã»ãšãã©ã®å Žåããããã¯ãã倧ããªãã®ã®äžéšã§ããããšãããã£ãŠããŸãããã®ãããGLSLã«ã¯ãåŠççšã®ããŒã¿ãåãåã£ãŠåŒã³åºãå
ã«çµæãæž¡ãããšãã§ãããã·ã§ãŒããŒãã€ã³ã¿ãŒãã§ã€ã¹ãäœæã§ããå
¥åºåå€æ°ããããŸãã ãããã£ãŠãåã·ã§ãŒããŒã¯ãããŒã¯ãŒãinããã³outã䜿çšããŠãå
¥åå€æ°ãšåºåå€æ°ãèªèº«ã§æ±ºå®ã§ããŸãã
é ç¹ã·ã§ãŒããŒã¯ãå
¥åãåãå
¥ããªãã£ãå Žåãéåžžã«å¹çãæªããªããŸãã ãã®ã·ã§ãŒããŒèªäœã¯ãé ç¹ããŒã¿ããçŽæ¥å
¥åå€ãååŸãããšããç¹ã§ä»ã®ã·ã§ãŒããŒãšã¯ç°ãªããŸãã åŒæ°ã®ç·šææ¹æ³ãOpenGLã«äŒããããã«ãäœçœ®ã¡ã¿ããŒã¿ã䜿çšããŠãCPUã®å±æ§ãæ§æã§ããŸãã æ¢ã«ãã®ããªãã¯ãèŠãŸããïŒ 'layoutïŒlocation = 0ïŒã é ç¹ã·ã§ãŒããŒã«ã¯ãåŒæ°ãé ç¹ããŒã¿ã«æ¥ç¶ã§ããããã«ãè¿œå ã®ä»æ§ãå¿
èŠã§ãã
ã¬ã€ã¢ãŠãïŒlocation = 0ïŒãçç¥ããglGetAttributeLocationã®åŒã³åºãã䜿çšããŠé ç¹å±æ§ã®äœçœ®ãååŸã§ããŸãã
å¥ã®äŸå€ã¯ããã©ã°ã¡ã³ãã·ã§ãŒããŒã«vec4åºåãå¿
èŠã§ãããšããããšã§ããã€ãŸãããã©ã°ã¡ã³ãã·ã§ãŒããŒã¯çµæãšããŠRGBA圢åŒã§è²ãæäŸããå¿
èŠããããŸãã ãããè¡ãããªãå Žåããªããžã§ã¯ãã¯é»ãŸãã¯çœã§æç»ãããŸãã
ãããã£ãŠãããã·ã§ãŒããŒããå¥ã®ã·ã§ãŒããŒã«æ
å ±ã転éããã¿ã¹ã¯ã«çŽé¢ããŠããå Žåãçºä¿¡ã·ã§ãŒããŒã®åä¿¡ã·ã§ãŒããŒã®inå€æ°ãšåãã¿ã€ãã®å€æ°ãå®çŸ©ããå¿
èŠããããŸãã ãããã£ãŠãå€æ°ã®ã¿ã€ããšååãäž¡åŽã§åãå ŽåãOpenGLã¯ãããã®å€æ°ãæ¥ç¶ããã·ã§ãŒããŒéã§æ
å ±ã亀æããæ©äŒãäžããŸãïŒããã¯ãªã³ã¯æ®µéã§è¡ãããŸãïŒã ãããå®éã«ç€ºãããã«ãé ç¹ã·ã§ãŒããŒããã©ã°ã¡ã³ãã·ã§ãŒããŒã®è²ãæäŸããããã«ãåã®ã¬ãã¹ã³ã®ã·ã§ãŒããŒãå€æŽããŸãã
é ç¹ã·ã§ãŒããŒ
#version 330 core layout (location = 0) in vec3 position;
ãã©ã°ã¡ã³ãã·ã§ãŒããŒ
#version 330 core in vec4 vertexColor; // ( ) out vec4 color; void main() { color = vertexColor; }
ãããã®äŸã§ã¯ãé ç¹ã·ã§ãŒããŒã§vertexColorãšããååã®4ã€ã®èŠçŽ ã®åºåãã¯ãã«ãšãvertexColorãšããåããã¯ãã«ã宣èšããŸããããããã¯ãã©ã°ã¡ã³ãã·ã§ãŒããŒã®å
¥åãšããŠã®ã¿ã§ãã ãã®çµæãé ç¹ã·ã§ãŒããŒããã®åºåããŒããã¯ã¹ã«ã©ãŒãšãã©ã°ã¡ã³ãã·ã§ãŒããŒããã®å
¥åããŒããã¯ã¹ã«ã©ãŒãæ¥ç¶ãããŸããã ãªããªã é ç¹ã·ã§ãŒããŒã®vertexColorå€ãäžéæãªããŒã¬ã³ãã£ïŒæ¿ãèµ€ïŒã«èšå®ããã·ã§ãŒããŒããªããžã§ã¯ãã«é©çšãããšãããŒã¬ã³ãã£è²ã«ãªããŸãã 次ã®å³ã«çµæã瀺ããŸãã

以äžã§ãã é ç¹ã·ã§ãŒããŒããã®å€ããã©ã°ã¡ã³ãã·ã§ãŒããŒã«ãã£ãŠååŸãããããã«ããŸããã ããã«ãã¢ããªã±ãŒã·ã§ã³ããã·ã§ãŒããŒã«æ
å ±ã転éããæ¹æ³ãæ€èšããŸãã
ãŠããã©ãŒã ïŒãã©ãŒã ãšåŒã³ãŸãïŒã¯ãCPUã§å®è¡ãããŠããã¢ããªã±ãŒã·ã§ã³ããGPUã§å®è¡ãããŠããã·ã§ãŒããŒã«æ
å ±ã転éããå¥ã®æ¹æ³ã§ãã 圢ç¶ã¯ãé ç¹å±æ§ãšã¯ãããã«ç°ãªããŸãã ãŸãããã©ãŒã ã¯ã°ããŒãã«ã§ãã GLSLã®ã°ããŒãã«å€æ°ãšã¯ã次ã®ããšãæå³ããŸããã°ããŒãã«å€æ°ã¯åã·ã§ãŒããŒããã°ã©ã ã«å¯ŸããŠäžæã§ããããã¹ãŠã®ã·ã§ãŒããŒã¯ãã®ããã°ã©ã ã®ã©ã®æ®µéã§ãããã«ã¢ã¯ã»ã¹ã§ããŸãã 2çªç®ïŒãã©ãŒã ã®å€ã¯ããªã»ãããŸãã¯æŽæ°ããããŸã§ä¿æãããŸãã
GLSLã¯ãunifromå€æ°æå®åã䜿çšããŠãã©ãŒã ã宣èšããŸãã ãã©ãŒã ã宣èšãããåŸãã·ã§ãŒããŒã§äœ¿çšã§ããŸãã ã·ã§ã€ãã䜿çšããŠäžè§åœ¢ã®è²ãèšå®ããæ¹æ³ãèŠãŠã¿ãŸãããã
#version 330 core out vec4 color; uniform vec4 ourColor;
ãã©ã°ã¡ã³ãã·ã§ãŒããŒã§4èŠçŽ ãã¯ãã«åã®outColorãã©ãŒã å€æ°ã宣èšããããã䜿çšããŠãã©ã°ã¡ã³ãã·ã§ãŒããŒã®åºåå€ãèšå®ããŸããã ãªããªã ãã©ãŒã ã¯ã°ããŒãã«å€æ°ãªã®ã§ããã®å®£èšã¯ã©ã®ã·ã§ãŒããŒã§ãå®è¡ã§ããŸããã€ãŸããé ç¹ã·ã§ãŒããŒãããã©ã°ã¡ã³ãã·ã§ãŒããŒã«äœãã転éããå¿
èŠã¯ãããŸããã ãããã£ãŠãé ç¹ã·ã§ãŒããŒã§ãã©ãŒã ã宣èšããŸããããªããªãã ããã§ã¯äœ¿çšããŸããã
ãã©ãŒã ã宣èšããŠã·ã§ãŒããŒããã°ã©ã ã§äœ¿çšããªãå Žåãã³ã³ãã€ã©ãŒã¯ããããµã€ã¬ã³ãã«åé€ããããããšã©ãŒãçºçããå¯èœæ§ãããããããã®æ
å ±ã«çæããŠãã ããã
çŸæç¹ã§ã¯ããã©ãŒã ã«ã¯æçšãªããŒã¿ãå«ãŸããŠããŸããã ããã«å
¥ããªãã£ãã®ã§ããããŸãããã ãŸããã·ã§ãŒããŒã§å¿
èŠãªãã©ãŒã å±æ§ã®ã€ã³ããã¯ã¹ãã€ãŸãå ŽæãèŠã€ããå¿
èŠããããŸãã å±æ§ã€ã³ããã¯ã¹ã®å€ãåãåã£ãããããã«å¿
èŠãªããŒã¿ãå容ã§ããŸãã ãã®é¢æ°ã®æ©èœãæ確ã«ç€ºãããã«ãè²ãæã
å€æŽããŸãã
GLfloat timeValue = glfwGetTime(); GLfloat greenValue = (sin(timeValue) / 2) + 0.5; GLint vertexColorLocation = glGetUniformLocation(shaderProgram, "ourColor"); glUseProgram(shaderProgram); glUniform4f(vertexColorLocation, 0.0f, greenValue, 0.0f, 1.0f);
ãŸããglfwGetTimeïŒïŒãåŒã³åºããŠã©ã³ã¿ã€ã ãæ°ç§ã§ååŸããŸãã ãã®åŸãsiné¢æ°ã䜿çšããŠå€ã0.0ãã1.0ã«å€æŽããçµæãgreenValueå€æ°ã«æžã蟌ã¿ãŸãã
glGetUniformLocationã䜿çšããŠourColorãã©ãŒã ã®ã€ã³ããã¯ã¹ãèŠæ±ããåŸã ãã®é¢æ°ã¯2ã€ã®åŒæ°ãåããŸããã·ã§ãŒããŒããã°ã©ã ã®å€æ°ãšããã®ããã°ã©ã å
ã§å®çŸ©ããããã©ãŒã ã®ååã§ãã glGetUniformLocationã-1ãè¿ããå Žåãåãååã®ãã©ãŒã ãèŠã€ãããªãã£ãããšãæå³ããŸãã æåŸã®ã¹ãããã¯ãglUniform4fé¢æ°ã䜿çšããŠourColorãã©ãŒã ã®å€ãèšå®ããããšã§ãã ãã©ãŒã ã€ã³ããã¯ã¹ã®æ€çŽ¢ã«ã¯ãäºåã«glUseProgramãåŒã³åºãå¿
èŠã¯ãããŸãããããã©ãŒã ã®å€ãæŽæ°ããã«ã¯ãæåã«glUseProgramãåŒã³åºãå¿
èŠããããŸãã
OpenGLã¯é¢æ°ã®ãªãŒããŒããŒãããªãCèšèªã䜿çšããŠå®è£
ãããŠãããããç°ãªãåŒæ°ã§é¢æ°ãåŒã³åºãããšã¯ã§ããŸããããOpenGLã¯é¢æ°ã®æ¥å°ŸèŸã«ãã£ãŠæ±ºå®ãããåããŒã¿åã®é¢æ°ãå®çŸ©ããŸãã 以äžã¯ããã€ãã®æ¥å°ŸèŸã§ãïŒ
fïŒé¢æ°ã¯floatåŒæ°ãåããŸãã
iïŒé¢æ°ã¯intåŒæ°ãåããŸãã
uiïŒé¢æ°ã¯unsigned intåŒæ°ãåããŸãã
3fïŒé¢æ°ã¯ãfloatåã®3ã€ã®åŒæ°ãåããŸãã
fvïŒé¢æ°ã¯ãåŒæ°ãšããŠfloatãããã¯ãã«ãåãåããŸãã
ãããã£ãŠããªãŒããŒããŒããããé¢æ°ã䜿çšãã代ããã«ãé¢æ°ã®æ¥å°ŸèŸã§ç€ºãããããã«ãå®è£
ãç¹å®ã®åŒæ°ã»ããçšã«èšèšãããé¢æ°ã䜿çšããå¿
èŠããããŸãã äžèšã®äŸã§ã¯ãfloatåã®4ã€ã®åŒæ°ã®åŠçã«ç¹åããé¢æ°glUniform ...ïŒïŒã䜿çšãããããé¢æ°ã®å®å
šãªååã¯glUniform4fïŒïŒïŒ4f-floatåã®4ã€ã®åŒæ°ïŒã§ããã
ãã©ãŒã ã«å€ãèšå®ããæ¹æ³ãããã£ãã®ã§ãã¬ã³ããªã³ã°ããã»ã¹ã§ãããã䜿çšã§ããŸãã æéã®çµéãšãšãã«è²ãå€æŽãããå Žåã¯ãã¬ã³ããªã³ã°ãµã€ã¯ã«ã®å埩ããšã«åœ¢ç¶å€ãæŽæ°ããå¿
èŠããããŸãïŒèšãæããã°ãåãã¬ãŒã ã§è²ãå€æŽãããŸãïŒãããã§ãªãå Žåãè²ã1åã ãèšå®ãããšäžè§åœ¢ã¯åãè²ã«ãªããŸãã 以äžã®äŸã§ã¯ãäžè§åœ¢ã®æ°ããè²ãèšç®ãããã¬ã³ããªã³ã°ãµã€ã¯ã«ã®åå埩ã§æŽæ°ãããŸãã
while(!glfwWindowShouldClose(window)) {
ã³ãŒãã¯ä»¥å䜿çšãããã®ãšéåžžã«äŒŒãŠããŸãããã«ãŒãå
ã§å®è¡ããåå埩ã§ãã©ãŒã ã®å€ãå€æŽããŸãã ãã¹ãŠãæ£ãããã°ãäžè§åœ¢ã®è²ãç·ããé»ã«ããŸãã¯ãã®éã«å€åããããšãããããŸãïŒã¯ã£ããããªãå Žåã¯ãæ£åŒŠæ³¢ã®ç»åãèŠã€ããŸãïŒã
ãã®ãããªå¥è·¡ãèµ·ããããã°ã©ã ã®å®å
šãªãœãŒã¹ã³ãŒãã¯ããã«ãããŸã ã
æ¢ã«ãæ°ä»ãã®ããã«ããã©ãŒã ã¯ã·ã§ãŒããŒãšããã°ã©ã ã®éã§ããŒã¿ã亀æããããã®éåžžã«äŸ¿å©ãªæ¹æ³ã§ãã ããããåé ç¹ã«è²ãèšå®ãããå Žåã¯ã©ãã§ããããïŒ ãããè¡ãã«ã¯ãé ç¹ã®æ°ã ãå³åœ¢ã宣èšããå¿
èŠããããŸãã æãæåãã解決çã¯ãé ç¹å±æ§ã䜿çšããããšã§ããããã次ã«ç€ºããŸãã
å±æ§ç¥ãžã®ããå€ãã®å±æ§!!!
åã®ã¬ãã¹ã³ã§ã¯ãVBOã«ããŒã¿ãå
¥åããæ¹æ³ãé ç¹å±æ§ãžã®ãã€ã³ã¿ãŒãæ§æããæ¹æ³ãããã³ãã¹ãŠãVAOã«ä¿åããæ¹æ³ãèŠãŸããã 次ã«ãé ç¹ããŒã¿ã«è²æ
å ±ãè¿œå ããå¿
èŠããããŸãã ãããè¡ãã«ã¯ã3ã€ã®floatèŠçŽ ã®ãã¯ãã«ãäœæããŸãã äžè§åœ¢ã®åé ç¹ã«ããããèµ€ãç·ãéã®è²ãå²ãåœãŠãŸãã
GLfloat vertices[] = {
ããã§ãé ç¹ã·ã§ãŒããŒã«éä¿¡ããå€ãã®æ
å ±ãåŸãããã®ã§ãé ç¹ãšè²ã®äž¡æ¹ãåãåãããã«ã·ã§ãŒããŒãç·šéããå¿
èŠããããŸãã è²ã®å Žæã1ã«èšå®ããŠããããšã«æ³šæããŠãã ããã
#version 330 core layout (location = 0) in vec3 position; // 0 layout (location = 1) in vec3 color; // 1 out vec3 ourColor; // void main() { gl_Position = vec4(position, 1.0); ourColor = color; // , }
ourColorãã©ãŒã ã¯äžèŠã«ãªããŸããããåºåãã©ã¡ãŒã¿ãŒourColorã¯å€ããã©ã°ã¡ã³ãã·ã§ãŒããŒã«æž¡ãã®ã«åœ¹ç«ã¡ãŸãã
#version 330 core in vec3 ourColor; out vec4 color; void main() { color = vec4(ourColor, 1.0f); }
ãªããªã æ°ããé ç¹ãã©ã¡ãŒã¿ãŒãè¿œå ããVBOã¡ã¢ãªãæŽæ°ãããããé ç¹å±æ§ãã€ã³ã¿ãŒãæ§æããå¿
èŠããããŸãã VBOã¡ã¢ãªå
ã®æŽæ°ãããããŒã¿ã¯æ¬¡ã®ãšããã§ãã

çŸåšã®ã¹ããŒã ãããã£ãŠããã®ã§ ã glVertexAttribPointeré¢æ°ã䜿çšããŠé ç¹åœ¢åŒãæŽæ°ã§ããŸãã
glVertexAttribPointeré¢æ°ã®æåã®ããã€ãã®å±æ§ã¯éåžžã«åçŽã§ãã ãã®äŸã§ã¯ãäœçœ®1ã®é ç¹å±æ§ã䜿çšããŸããè²ã¯ããªãŒãã¿ã€ãã®3ã€ã®å€ã§æ§æãããŠãããæ£èŠåã¯å¿
èŠãããŸããã
ãªããªã ããã§ãã·ã§ãŒããŒã®2ã€ã®å±æ§ã䜿çšããã¹ããããåèšç®ããå¿
èŠããããŸãã 次ã®ã·ã§ãŒããŒã¢ããªãã¥ãŒãïŒæ¬¡ã®xé ç¹ãã¯ãã«ïŒã«ã¢ã¯ã»ã¹ããã«ã¯ã6åã®ãããŒãèŠçŽ ãå³ã«ç§»åããå¿
èŠããããŸãã3åã¯é ç¹ãã¯ãã«ã3åã¯è²ãã¯ãã«ã§ãã ã€ãŸã 6åå³ã«ç§»åããŸãã å³åŽã«24ãã€ãã
次ã«ãã·ãããææ¡ããŸããã æåã¯ãé ç¹åº§æšãæã€ãã¯ãã«ã§ãã RGBã«ã©ãŒå€ãæã€ãã¯ãã«ã¯ã座æšãæã€ãã¯ãã«ã®åŸã«ãããŸãã 3 * sizeofïŒGLfloatïŒ= 12ãã€ãã®åŸã
ããã°ã©ã ãå®è¡ãããšã次ã®çµæã衚瀺ãããŸãã

ãã®å¥è·¡ãçã¿åºãå®å
šãªãœãŒã¹ã³ãŒãã¯ããã«ãããŸã ïŒ
çµæãšããŠè¡šç€ºããããã¬ããã§ã¯ãªã3è²ã®ã¿ãèšå®ããŠãããããçµæã¯å®äºããäœæ¥ã«å¯Ÿå¿ããŠããªãããã«èŠããå ŽåããããŸãã ãã®çµæã¯ããã©ã°ã¡ã³ãã·ã§ãŒããŒã®ãã©ã°ã¡ã³ãè£éã«ãã£ãŠååŸãããŸãã ã©ã¹ã¿ã©ã€ãºã®æ®µéã§äžè§åœ¢ãæç»ãããšãã·ã§ãŒããŒåŒæ°ãšããŠäœ¿çšããé ç¹ã ãã§ãªããããå€ãã®é åãåŸãããŸãã ã©ã¹ã¿ã©ã€ã¶ã¯ãããªãŽã³äžã®äœçœ®ã«åºã¥ããŠãããã®é åã®äœçœ®ã決å®ããŸãã ãã®äœçœ®ã«åºã¥ããŠããã©ã°ã¡ã³ãã·ã§ãŒããŒã®ãã¹ãŠã®åŒæ°ãè£éãããŸãã çæ¹ã®ç«¯ãç·ã§ãããäžæ¹ã®ç«¯ãéã§ããåçŽãªç·ããããšããŸãã ãã©ã°ã¡ã³ãã·ã§ãŒããŒãã»ãŒäžå€®ã«ããé åãåŠçããå Žåããã®é åã®è²ã¯ãç·è²ãã©ã€ã³ã§äœ¿çšãããè²ã®50ïŒ
ã«çãããªãããã«éžæããããããã£ãŠãéè²ã¯éè²ã®50ïŒ
ã«çãããªããŸãã ãããäžè§åœ¢ã§èµ·ããããšã§ãã 3ã€ã®è²ãš3ã€ã®ããŒã¯ããããããããã«è²ãèšå®ãããŠããŸãã ããèŠããšãèµ€ãéã«ç§»åãããšæåã«çŽ«ã«å€ããããšãããããŸãã ãã©ã°ã¡ã³ãè£éã¯ããã©ã°ã¡ã³ãã·ã§ãŒããŒã®ãã¹ãŠã®å±æ§ã«é©çšãããŸãã
倧è¡ãžã®OOPïŒ ã·ã§ãŒããŒã¯ã©ã¹ãäœæãã
ã·ã§ãŒããŒãã³ã³ãã€ã«ããŠãã·ã§ãŒããŒãæ§æã§ããããã«ããã³ãŒãã¯ãéåžžã«é¢åã§ãã ãããã£ãŠããã£ã¹ã¯ããã·ã§ãŒããŒãèªã¿åããã³ã³ãã€ã«ãããªã³ã¯ãããšã©ãŒããã§ãã¯ãããããŠãã¡ãããã·ã³ãã«ã§çŽ æŽãããã€ã³ã¿ãŒãã§ãŒã¹ãæã€ã¯ã©ã¹ãæžãããšã§ãç§ãã¡ã®ç掻ãå°ã楜ã«ããŸãããã ãã®ããã«ããŠãOOPã¯ã¯ã©ã¹ã®ã¡ãœããå
ã«ãã®ã«ãªã¹ããã¹ãŠã«ãã»ã«åããã®ã«åœ¹ç«ã¡ãŸãã
ã€ã³ã¿ãŒãã§ã€ã¹ã®å®£èšããã¯ã©ã¹ã®éçºãéå§ããæ°ããäœæãããèŠåºãã«å¿
èŠãªãã¹ãŠã®includeãã£ã¬ã¯ãã£ããèšè¿°ããŸãã çµæã¯æ¬¡ã®ããã«ãªããŸãã
#ifndef SHADER_H #define SHADER_H #include <string> #include <fstream> #include <sstream> #include <iostream> #include <GL/glew.h>; // glew , OpenGL class Shader { public: // GLuint Program; // Shader(const GLchar* vertexPath, const GLchar* fragmentPath); // void Use(); }; #endif
ãããifndefã䜿çšããŠãã£ã¬ã¯ãã£ããå®çŸ©ããincludeãã£ã¬ã¯ãã£ãã®ååž°çãªå®è¡ãé¿ããŸãããã ãã®ãã³ãã¯OpenGLã§ã¯ãªããäžè¬çãªC ++ããã°ã©ãã³ã°ã«é©çšãããŸãã
ãããŠãã¯ã©ã¹ã¯ãã®èå¥åãä¿åããŸãã ã·ã§ãŒããŒã³ã³ã¹ãã©ã¯ã¿ãŒã¯ããã¬ãŒã³ããã¹ãã§è¡šãããé ç¹ã·ã§ãŒããŒãšãã©ã°ã¡ã³ãã·ã§ãŒããŒãå«ããã¡ã€ã«ãžã®ãã¹ãå«ãæåã®é
åïŒã€ãŸããããã¹ããããã³ã¯ã©ã¹ã®ã³ã³ããã¹ãã§ã¯ãã·ã§ãŒããŒã®ãœãŒã¹ã³ãŒããæã€ãã¡ã€ã«ãžã®ãã¹ãèšãæ¹ãé©åã§ãïŒã®åŒæ°ãšããŠåŒæ°ãåããŸãã ãŸããã·ã§ãŒããŒã¯ã©ã¹ã䜿çšããå©ç¹ãæ確ã«ç€ºããŠãŒãã£ãªãã£é¢æ°Useãè¿œå ããŸãã
ã·ã§ãŒããŒãã¡ã€ã«ãèªã¿åããŸãã èªã¿åãã«ã¯ãæšæºã®C ++ã¹ããªãŒã ã䜿çšããŠãçµæã次ã®è¡ã«å
¥ããŸãã
Shader(const GLchar* vertexPath, const GLchar* fragmentPath) {
( , , . , ⊠):
Use:
void Use() { glUseProgram(this->Program); }
:
Shader ourShader("path/to/shaders/shader.vs", "path/to/shaders/shader.frag"); ... while(...) { ourShader.Use(); glUniform1f(glGetUniformLocation(ourShader.Program, "someUniform"), 1.0f); DrawStuff(); }
shader.vs, shader.frag. , , , , .
, ,
:
1. , : .
2. : .
3. (, ). , , , ?: