[[TableOfContents]] == 기본 컨셉 == OpenGLì—서 ì •ë§ ì‹¤ë¬´ì—서 쓰는 부분만 따로 떼어낸 OpenGL ES(Embeded System)ì˜ Javascript 구현체ì´ë©° HTML5 Canvas를 통해 나타난다. ë”°ë¼ì„œ 초보ìžê°€ 쉽게 배우는ë°ì— ì´ˆì ì´ ë§žì¶”ì–´ì ¸ 있지 ì•Šê³ ì˜¤ì§ ì „ë¬¸ê°€ê°€ êµ¬í˜„ì„ í•˜ëŠ”ë°ì— ì´ˆì ì´ ë§žì¶”ì–´ì ¸ 있다. == 특징 == Javascriptìž„ì—ë„ ë¶ˆêµ¬í•˜ê³ ë§ˆì¹˜ Cí”„ë¡œê·¸ëž˜ë° ìŠ¤íƒ€ì¼ì˜ í•¨ìˆ˜ë“¤ì´ ì¡´ìž¬í•œë‹¤. WinApiê°€ C스타ì¼ì˜ OOPì´ë“¯ WebGL ë˜í•œ C스타ì¼ì˜ OOPì´ë‹¤. ëª¨ë“ í•¨ìˆ˜ëŠ” WebGLcontextë¼ëŠ” ê°ì²´ì— ìžˆëŠ”ë° ë³´ë©´ 그냥 ì ‘ë‘어를 ë¶™ì´ëŠ” ëŠë‚Œì´ë‹¤. {{{ var gl = canvas.getContext("experimental-webgl"); gl.attachShader(shaderProgram, fragmentShader); gl.attachShader(shaderProgram, vertexShader); }}} ìœ„ì˜ ì½”ë“œë¥¼ ë³´ë©´ ì‰ì´ë” í”„ë¡œê·¸ëž¨ì— fragmentShader와 vertexShader를 Link 시키는 구문ì¸ë° ì£¼ì²´ì¸ shaderProgramì€ ì²«ë²ˆì¨° ì¸ìžì´ê³ glì€ ê·¸ëƒ¥ ì ‘ë‘ì–´ 처럼 ë³´ì¸ë‹¤. ì € 구문만 ê·¸ëŸ°ê²ƒì´ ì•„ë‹ˆë¼ ë‹¤ë¥¸ ëª¨ë“ í•¨ìˆ˜ë“¤ì´ ì € gl ê°ì²´ì— 붙어있다. 하지만 ì •ìž‘ glì´ ì£¼ì²´ê°€ 아닌 ê²ƒë“¤ì´ ë§Žë‹¤. ë”°ë¼ì„œ 래핑한 ê°ì²´ë¥¼ 만들어 쓰는 ê²ƒì´ ì†íŽ¸í•œë° ì–´ì„¤í”„ê²Œ 했다가는 무척 꼬ì´ê²Œ ëœë‹¤. ì´ ê´€ìŠµì€ OpenGLì´ ê¸°ë³¸ì 으로 Cë¼ì´ë¸ŒëŸ¬ë¦¬ì´ë¼ 그런듯 하다. ì‹¤ì œ ëž˜í•‘ì„ ì§„í–‰í•´ë³¸ê²°ê³¼ 마치 MFC를 보는듯한 ëŠë‚Œì„ 강하게 ë°›ê³ ìžˆë‹¤. === OpenGLê³¼ ì°¨ì´ì === * WebGLì€ ê¸°ì¡´ OpenGLê³¼ 다르게 ì§ì ‘ 그리기가 ì§€ì›ë˜ì§€ 않는다. ê¸°ì¡´ì˜ glBegin()와 glEnd()사ì´ì—서 ê°’ì„ ê³„ì†ì 으로 ì „ë‹¬í•˜ìˆ˜ ì—†ê³ ì˜¤ì§ glDrawElement()를 통한 ë°°ì—´ì„ í•œêº¼ë²ˆì— ì „ë‹¬í•˜ëŠ” 것'ë§Œ' ì§€ì›í•œë‹¤. 초보ìžë“¤ì˜ 첫난관ì´ë‹¤. * 사ê°í˜•그리기 ë° ë‹¤ê°í˜• 그리기가 ì§€ì›ë˜ì§€ 않는다. ì‹¤ì œë¡œ 다ê°í˜• 그리기는 연습시ì—ë§Œ ìžì£¼ ì“°ê³ ì‹¤ì œ 코드ì—서는 삼ê°í˜•으로 ì´ë£¨ì–´ì§„ 모ë¸ì„ ê°€ì ¸ë‹¤ 쓰기 ë•Œë¬¸ì¸ ê²ƒìœ¼ë¡œ ë³´ì¸ë‹¤. ê·¸ë¦¬ê³ ë‹¤ê°í˜•ì€ ì‚¼ê°í˜•ì˜ ì§‘í•©ìœ¼ë¡œ í‘œí˜„í• ìˆ˜ 있다. * ìœ í‹¸ë¼ì´ë¸ŒëŸ¬ë¦¬ë¡œ ì œê³µë˜ëŠ” í브, 구, 실린ë”, í‹°í¬íŠ¸ê°€ ëª¨ë‘ ì§€ì›ë˜ì§€ 않는다. ì—시 ì˜ˆì œì—ë§Œ ì“°ì´ê³ ì“°ì§€ 않기 ë•Œë¬¸ì— ê³¼ê°ížˆ ì œê±°í•œê²ƒìœ¼ë¡œ ë³´ì¸ë‹¤. * ê´‘ì›, ì¹´ë©”ë¼ ì¡°ìž‘, íšŒì „ ë“±ì´ ì œê³µë˜ì§€ 않는다. ëª¨ë‘ ìžì‹ ì´ ì§ì ‘ ì—°ì‚°ì„ í†µí•´ í–‰ë ¬ì„ êµ¬í•´ì£¼ì–´ì•¼ 한다. 초보ìžë“¤ì˜ 둘쨰 난관ì´ë‹¤. * í…ìŠ¤ì³ ëª¨ë“œì™€ 조명 모드가 매우 ì œí•œë˜ì–´ 있다. * ì‰ì´ë”를 짜지않으면 쓸수가 없다. 심지어 í…스ì³ë¥¼ 입히는 ê²ƒë„ ì‰ì´ë”ì—서 처리한다. 그냥 단색으로 처리하는 ì½”ë“œë„ ì‰ì´ë” 코드를 짜지 않으면 그냥 í–ì–€ 것만 보게ëœë‹¤. ê·¸ë¦¬ê³ ê·¸ê²ƒë„ íšŒì „ì‹œí‚¬ìˆ˜ë„ ì—†ë‹¤. == 구조 == === 파ì´í”„ ë¼ì¸ === WebGLì€ ì¼ì •한 í름구조를 만들어 ë‘ê³ ê·¸ ê°ë¶€ë¶„ì„ ë§Œë“¤ìˆ˜ 있ë„ë¡ í•´ ë‘었다. 아마 최ì 화가 쉬운 íƒ“ì— ê·¸ëŸ¬í–ˆìœ¼ë¦¬ê³ ìƒê°ëœë‹¤. [[attachment:WebGL.png WebGl파ì´í”„ë¼ì¸]] Attribute는 ê° í¬ì¸íЏ 별로 ì „ë‹¬ë˜ëŠ” ì •ë³´ì´ê³ uniform ì€ ì „ì²´ì—서 공통ì ì¸ ì •ë³´ì´ë‹¤. ì¼ë°˜ì 으로 Attribute는 ê° ì •ì ì˜ ìœ„ì¹˜ ì •ë³´ì™€ ê° ì§€ì ì˜ ë²•ì„ ë²¡í„° ì •ë³´ë¥¼ì„ ì „ë‹¬í•œë‹¤. uniformì€ ì¼ë°˜ì 으로 ì¹´ë©”ë¼ì˜ 위치나 í™˜ê²½ê´‘ì˜ ìœ„ì¹˜ì²˜ëŸ¼ ì „ì²´ì ì¸ ê²ƒì„ ì „ë‹¬í•œë‹¤. Attribute나 uniformì€ ì¼ì¢…ì˜ ë³€ìˆ˜ì¸ë° í•¸ë“¤ì„ ì–»ì–´ì™€ì„œ ê·¸ê²ƒì„ í†µí•´ ê°’ì„ ì „ë‹¬í• ìˆ˜ 있다. 즉 Atrribute나 Uniformì€ Javascript측ì—서 ì‰ì´ë”로 ì •ë³´ë¥¼ 보내는 것ì´ë‹¤. varyingì€ ì‰ì´ë” ê°„ì˜ ì •ë³´ ì „ë‹¬ì— ì‚¬ìš©ëœë‹¤. vertex shaderì—서 fragment shader로 ê°’ì´ ì „ë‹¬ë˜ë©° 반대는 불가능하다(파ì´í”„ë¼ì¸ êµ¬ì¡°ìƒ ë‹¹ì—°í•œ 것ì´ë‹¤). ì´ë•Œ vertex shader는 ê° ì •ì (ê¼ì§€ì ) fragment shader는 ê° í”½ì…€ì— í•œë²ˆ 호출ë˜ê²Œ ë˜ëŠ”ë° ê° ì •ì 사ì´ì˜ ê°’ë“¤ì€ ë³´ê°„ë²•ì„ ê±°ì³ ì „ë‹¬ë˜ê²Œ ëœë‹¤(ê·¸ë¼ë””언트 ê°™ì€ ëŠë‚Œì´ë‹¤ ì¤‘ê°„ê°’ì„ ì•Œì•„ì„œ 만들어 준다). ê° ì‰ì´ë”는 ë™ì‹œì— ë™ìž‘í• ìˆ˜ ìžˆëŠ”ë° ë‹¹ì—°ížˆ ì´ë“¤ì€ ì„œë¡œê°„ì— ë…립ì ì´ì–´ì•¼ 한다. === ì‰ì´ë” === ì‰ì´ë”는 ì‰ì´ë” 언어로 따로 ì§œì£¼ê³ ì»´íŒŒì¼ í•´ì•¼í•˜ë©° 심지어 ë§í¬ê¹Œì§€ 시켜주어야 한다. GPUì˜ ê°•ë ¥í•œ í–‰ë ¬ì—°ì‚° ëŠ¥ë ¥ì„ ê°€ì ¸ë‹¤ 쓰기 위해서ì¸ê²ƒìœ¼ë¡œ ë³´ì´ëŠ”ë° ì´ê²ƒì„ 사용하지 ì•Šê³ ì„œëŠ” ì˜ˆì œíŒŒì¼ë„ ëŒë ¤ë³¼ìˆ˜ê°€ 없다. ë‹¤í–‰ì´ ì–¸ì–´ëŠ” C언어와 매우 ìœ ì‚¬í•˜ê³ í–‰ë ¬ì—°ì‚°ì´ ëª¨ë‘ ìžˆê¸° ë•Œë¬¸ì— ë”±ížˆ ì–´ë µê±°ë‚˜ 하진 않다. 다만 ì–´ëŠë¶€ë¶„ì—서 어디와 ì—°ê²°ë˜ëŠ”ì§€ ì´í•´í•˜ëŠ”ë° ì‹œê°„ì´ ê±¸ë¦°ë‹¤. ==== vertex shader ==== ê° ì •ì (vertex, ê¼ì§€ì )마다 호출ë˜ë©° 주로 ê¼ì§€ì ì˜ ìœ„ì¹˜ë¥¼ ì—°ì‚°í•˜ê³ ì‹¤ì œ Viewì— íˆ¬ì˜í•˜ëŠ” ì—°ì‚°ì„ ì£¼ë¡œ 하게 ëœë‹¤. 한마디로 모ë¸ì˜ 위치 변환과 ì¹´ë©”ë¼ ì‹œì ì— ë”°ë¥¸ 변환 ì›ê·¼ë²•ì„ ì 용하는 ë³€í™˜ë“±ì„ ìˆ˜í–‰í•œë‹¤. ==== fragment shader ==== ê° ì •ì 사ì´ì— 있는 픽셀 마다 호출ëœë‹¤. 주로 ê´‘ì›íš¨ê³¼ë¥¼ ì 용한 í”½ì…€ì˜ ìµœì¢…ì ì¸ ìƒ‰ê¹”ì´ë‚˜ í…ìŠ¤ì³ ì—°ì‚°ì— ì‚¬ìš©ëœë‹¤. varying변수를 vertex shaderì—서 fragment shader로 넘겨주면 ê° ì •ì 사ì´ì—는 보간법으로 ë³€í™˜ëœ ê°’ì´ ë„˜ì–´ 온다. ê³„ì† ìž‘ì„±ì¤‘.