[[TableOfContents]] skyLibrary_inclue ---- Describe OpenGL스터디_1 here = <ëŒ€ë‹¨ì› 1>. openGL기본 학습 = '''Intro''' ì´ íŽ˜ì´ì§€ëŠ” 위키를 연습?í• ê¼„ ì œê°€ í˜„ì œ ê³µë¶€ì¤‘ì¸ openGLë‚´ìš©ì„ ì •ë¦¬í•˜ê¸° 위한 페ì´ì§€ìž…니다. 혹시 openGLì„ ê³µë¶€í•˜ì‹œëŠ” ë¶„ë“¤ì€ ì°¸ê³ í•˜ì…”ì„œ ë„ì›€ì´ ë˜ë©´ ì¢‹ê² ìŠµë‹ˆë‹¤. 공부하는 ë„서는 openGL superbible 3íŒ ë²ˆì—서 + openGL Game programming ë‘권으로 í•˜ê³ ìžˆìŠµë‹ˆë‹¤. 아마 ì´ë²ˆë‹¬ì— 5íŒ ì›ì„œê°€ 해외ì—서 나오는 걸로 ì•Œê³ ìžˆëŠ”ë°, ì´ê±¸ 보시는 ë¶„ì€ ì°¸ê³ í•´ì„œ ì›ì„œë¥¼ ë³´ëŠ”ê²ƒë„ ë‚˜ì˜ì§€ 않겟네요. == Chapter 1.OpenGLì—서 3D그래픽 ê¸°ë³¸ì§€ì‹ == * openGLì„ ê³µë¶€í•˜ê¸°ì „ì— ì´ì— 필요한 간단한? 용어와 ê°œë…ì„ ê°„ë‹¨ížˆ ì •ë¦¬í•˜ê³ ë“¤ì–´ê°‘ì‹œë‹¤. === íŒí•‘(popping)í˜„ìƒ === * 핵심 ì •ë¦¬ : 2ì°¨ì› ìƒì—서 3ì°¨ì› ë¬¼ì²´ë¥¼ í‘œí˜„í• ë•Œ 앞면과 ë’·ë©´ì´ ë°”ë€Œì–´ì„œ ë³´ì´ëŠ” 현ìƒì„ '''íŒí•‘ 현ìƒ'''ì´ë¼ê³ 부른다. {{{: example : ì •ìœ¡ê°í˜•ì„ ê·¸ë¦´ë•Œ ëª¨ë“ ë³€ì„ ê·¸ë¦°ë‹¤ë©´ 우리는 ë’·ë©´ê³¼ ì•žë©´ì„ ì°©ê°í•´ì„œ ë³¼ 수 있다. 왜ëƒí•˜ë©´ ë’·ë©´ì— í•´ë‹¹í•˜ëŠ” ì„ ë“¤ì´ ì•žìª½ì— ìœ„ì¹˜í•œ ì„ ìœ¼ë¡œ ì°©ê°í• 수 있기 때문ì´ë‹¤. }}} ì´ëŸ° íŒí•‘현ìƒì€ 3ì°¨ì›ì ì¸ í‘œí˜„ì„ ë°©í•´í•œë‹¤. ê³ ë¡œ 보통 ì´ë¥¼ ì œê±°í•˜ê¸°ìœ„í•´ì„œ ë’·ë©´ì„ ê·¸ë¦¬ëŠ” ì„ ì„ ì œê±°í•˜ì—¬ 3ì°¨ì›ì ì¸ í‘œí˜„ì„ ë” ìƒìƒí•˜ê²Œ 한다. ì´ë ‡ê²Œ ë’·ë©´ì˜ ì„ ì„ ì œê±°í•˜ëŠ” ë°©ì‹ì„ '''ì€ë©´ì œê±°''' í˜¹ì€ '''숨겨진 표면 ì œê±°'''ë¼ê³ 한다. '''íŒí•‘ 현ìƒì˜ 예시''' attachment:popping1.png '''ì€ë©´ì œê±° 예시''' attachment:poping3.png === ëžœë”ë§ & ëžœë”(render) === * í•µì‹¬ì •ë¦¬ : 3ì°¨ì› ì‚¬ë¬¼ì— ëŒ€í•œ ì •ë³´ë¥¼ ê°€ì§€ê³ í™”ë©´(2ì°¨ì›)ì— í‘œì‹œí•˜ëŠ” ê²ƒì„ '''ëžœë”(render)한다'''ë¼ê³ ë§í•˜ê³ ëžœë”ë§ì´ë¼ê³ 한마디로 ë§í•œë‹¤. === ì›ê·¼ë²• === ì»´í“¨í„°í™”ë©´ì€ 2ì°¨ì›ì´ë‹¤. 하지만 우리가 3Dê²Œìž„ì„ í• ë•Œ ë³´ë©´ ê·¸ ë‚´ìš©ë¬¼ì€ ë§ˆì¹˜ 3ì°¨ì›ì˜ 물체처럼 ë³´ì¸ë‹¤. 하지만 ì‹¤ì œë¡œëŠ” ë‚´ìš©ë¬¼ì€ 2ì°¨ì›ì ì¸ ê²ƒì„ 3ì°¨ì›ì²˜ëŸ¼ ë³´ì´ê²Œ ë§Œë“ ê²ƒë¿ì´ë‹¤. ê·¸ë ‡ë‹¤ë©´ 어떻게 2ì°¨ì›ì ì¸ê²ƒì„ 3ì°¨ì›ì ì¸ê²ƒì²˜ëŸ¼ ë³´ì´ê²Œ 만들 수 있ì„까? 여러가지 ë°©ë²•ì´ ìž‡ì§€ë§Œ ê·¸ì¤‘ì— í•˜ë‚˜ëŠ” ì›ê·¼ë²•ì„ ì‚¬ìš©í•œë‹¤ëŠ” 것ì´ë‹¤. '''ì›ê·¼ë²•ì´ëž€ 가까히 있는 ê²ƒì€ í¬ê²Œ ë©€ë¦¬ìžˆëŠ”ê²ƒì€ ì¡°ê·¸ë§ˆí•˜ê²Œ í‘œí˜„í•˜ëŠ”ê²ƒì„ ë§í•œë‹¤.''' ë” ì •í™•ížˆ ë§í•˜ìžë©´ '''ì„ ì‚¬ì´ì˜ ê°ë„를 ì¡°ì ˆí•˜ì—¬ 3ì°¨ì›íš¨ê³¼ë¥¼ 내는 기법'''ì„ ë§í•œë‹¤. ì›ê·¼ë²•ì˜ ëŒ€í‘œì ì¸ ì˜ˆë¡œëŠ” 우리가 ìˆ˜í•™ì„ ë°°ìš¸ë•Œ 쉽게 보는 ì •ìœ¡ê°í˜• 그림ì´ë‹¤. === 색ìƒê³¼ 조명 ,ê·¸ë¦¼ìž ê·¸ë¦¬ê³ ì‰ì´ë”© === 3ì°¨ì›ì ì¸ ìš”ì†Œë¥¼ ë” ë‘드러지게 표현하기 위해서는 ì‰ì´ë”©ì„ 사용하면 ëœë‹¤. ì‰ì´ë”©ì´ëž€ '''ìž…ì²´ì ì¸ ë¬¼ì²´ì— ìŒì˜ì´ë‚˜ ìƒ‰ìƒ ë°ê¸° ë“±ì„ ìž˜ ì¡°ì ˆí•˜ì—¬ í‘œë©´ì— ìž…ížˆëŠ” 기법'''ì„ ë§í•œë‹¤. ì´ëŸ° ê¸°ë²•ì„ í†µí•´ì„œ ì •ìœ¡ê°í˜•ê°™ì€ ê²½ìš°ëŠ” ê° ë©´ì„ ë„드ë¼ì§€ê²Œ í‘œí˜„í• ìˆ˜ ìžˆê³ , ë”ìš± 실ê°ë‚˜ëŠ” 3ì°¨ì›ì ì¸ í‘œí˜„ì„ ê°€ëŠ¥ì¼€ 한다. attachment:texture.png === í…ìŠ¤ì³ ë§µí•‘ === 지오메트리(ë„형)ì´ ì¦ê°€í•˜ë©´ ì¦ê°€í• 수 ë¡ ê·¸ëž˜í”½í•˜ë“œì›¨ì–´ì—서 ì²˜ë¦¬í•´ì•¼í• ì¼ë“¤ì€ 많아진다. 만약 ì´ë ‡ê²Œ ë§Žì€ ì§€ì˜¤ë©”íŠ¸ë¦¬(ë„형)ì„ ì¼ì¼ížˆ ì‰ì´ë”© ìž‘ì—…ì„ í•œë‹¤ë©´ 실시간 ìž‘ì—…ì´ í•„ìš”í•œ 경우ì—는 ì†ë„ì €í•˜ì— ëŒ€í•œ ë¬¸ì œê°€ ë°œìƒí• 수가 있다. ì´ëŸ°ì ì—서 í…ìŠ¤ì³ ë§µí•‘ì€ í›Œë¥í•œ ëŒ€ì•ˆì±…ì´ ë 수 있다. '''í…ìŠ¤ì³ ë§µí•‘ì´ëž€ ê° ìž…ì²´ í‘œë©´ì— ë¯¸ë¦¬ì¤€ë¹„í•´ë‘” ì´ë¯¸ì§€ë¥¼ 입히는 ê²ƒì„ ì´ì•¼ê¸°í•œë‹¤.''' 여기서 준비해둔 ì´ë¯¸ì§€ë¥¼ '''í…스ì³'''ë¼ê³ 부르며, í…스ì³ì˜ ê° ìš”ì†Œë¥¼ '''í…ì…€''' , ì´ëŸ° í…ì…€ì„ ë¬¼ì²´ì˜ í‘œë©´ì— ë§žì¶° 입히는 ìž‘ì—…ì„ '''í•„í„°ë§''' ì´ë¼ê³ 부른다. === 블랜딩 === '''블랜딩(blending)'''ì´ëž€ 화면ìƒì— 색ìƒê³¼ 물체를 혼합하는 효과를 ì´ì•¼ê¸°í•œë‹¤. ì´ë¥¼ 사용하는 ê³³ì€ ì£¼ë¡œ ë‘ ì´ë¯¸ì§€ê°€ ê²¹ì³ìžˆëŠ” 효과를 내기위해서 사용한다. 예를 들어 ê±°ìš¸ì— ë¹„ì¹˜ëŠ” ë‚´ëª¨ìŠµì„ í‘œí˜„í• ë•Œë¥¼ ìƒê°í•´ë³´ë©´ 거울ì´ë¼ëŠ” ì´ë¯¸ì§€ì™€ ë‚´ ì–¼êµ´ì´ ë¹„ì¹˜ëŠ” ì´ë¯¸ì§€ë¥¼ 합치는 효과를 ìƒê°í•˜ë©´ ëœë‹¤(반사효과). === 안티 알리어싱 === 컴퓨터는 기계어ë¼ëŠ” 언어ë¼ëŠ” ì´ì§„ì ì¸ í‘œí˜„(ì´ì§„법ì ì¸ í‘œí˜„)ì„ ì‚¬ìš©í•œë‹¤. 한마디로 1011001ê³¼ ê°™ì€ í‘œí˜„ì„ ì˜ˆì‹œë¡œ 들 수 있는ë°, ì´ ë•Œë¬¸ì— ì—°ì†ì ì¸ í‘œí˜„ì„ ì‹¤ì§ˆì 으로 표현 í•˜ëŠ”ê²ƒì´ ë¶ˆê°€ëŠ¥í•˜ë‹¤. ì„ ì„ ê·¸ë¦°ë‹¤ê³ ë³´ë©´ ì´ëŠ” 실질ì 으로 ì ë“¤ì˜ ì§‘í•©ì— í•´ë‹¹í• ë¿ì´ê³ , ë³´ì´ê¸°ì— ì„ ì¼ ë¿ì´ì§€ ì ë“¤ì˜ ì¡°ë°€í•œ ì§‘í•©ì— ë¶ˆê°€í•˜ë‹¤. ê·¸ë¦¬ê³ ì»´í“¨í„°ì—ì„œì˜ ì ì˜ í‘œí˜„ì€ ì‚¬ê°í˜•ì˜ ì 으로 표현ì´ë˜ëŠ”ë° ê·¸ ì´ìœ 는 ì—°ì†ì ì¸ í‘œí˜„ì´ ë¶ˆê°€í•œ 컴퓨터로서는 ì™„ì „ížˆ ë™ê·¸ëž—게 ì´ì–´ì§„ ì›ì„ 그리기ì—는 ì‹¤ìˆ˜í‘œí˜„ì— í•œê³„ê°€ 있기 때문ì´ë‹¤.(무한 ì†Œìˆ˜ì˜ í‘œí˜„ì´ ë¶ˆê°€í•˜ë‹¤ê³ í•˜ëŠ”ê²Œ ë” ì˜³ì„ ìˆ˜ë„ ìžˆê²Ÿë‹¤.) 그래서 사ê°í˜•으로 표현ë˜ì–´ì§€ëŠ” ì 으로 ì›ì„ 그리게ë˜ë©´ '''계단현ìƒ'''ì´ ì¼ì–´ë‚œ ì›ì„ 보게 ë 것ì´ë‹¤. 안티 ì•Œë¦¬ì–´ì‹±ì€ ì´ëŸ¬ 란 계단현ìƒì„ 부드럽게 표현해주는 ë°©ë²•ì„ ë§í•œë‹¤. '''계단 í˜„ìƒ ê·¸ë¦¼''' attachment:antialiasing.png === 실시간 3D & 비실시간 3D === * 실시간 3D는 ë§ê·¸ëŒ€ë¡œ 사용ìžê°€ 화면 êµ¬ì„±ì— í•„ìš”í•œ ë°ì´í„°ë¥¼ ìž…ë ¥ 즉시 í™”ë©´ì— ë°˜ì˜í•˜ëŠ” ë°©ì‹ì„ ì´ì•¼ê¸°í•œë‹¤. 예를 들어 비행기 ì‹œë®¬ë ˆì´ì…˜ 프로그램ì´ë¼ë˜ê°€, ê²Œìž„ì„ ì˜ˆì‹œë¡œ 들 수 있다. * 비실시간 3D는 반대로 미리 구성해둔 3Dì´ë¯¸ì§€ë¥¼ í™”ë©´ì— ë³´ì—¬ì£¼ëŠ” ë°©ì‹ì„ ì´ì•¼ê¸°í•œë‹¤. 예시로는 ì• ë‹ˆë§¤ì´ì…˜ì´ë‚˜ ì˜í™”를 들 수 ìžˆê² ë‹¤. ê³ í’ˆì§ˆ 3Dì´ë¯¸ì§€ê°™ì€ 경우는 ì´ë¥¼ ëžœë”ë§í•˜ê³ 구성하는ë°ì—ë§Œ í•´ë„ ëª‡ì‹œê°„ì´ ê±¸ë¦´ ì •ë„로 ë§Žì€ ì‹œê°„ì´ ì†Œìš”ë˜ëŠ”ë°, ì´ë¥¼ 위한게 미리 3Dì´ë¯¸ì§€ë¥¼ 구성해ë‘ê³ í™”ë©´ì— ë„워주면 즉시 í™”ë©´ì— ë³´ì—¬ì¤„ 수 있어서 마치 실시간 ëžœë”ë§í•œ 것 처럼 보여줄 수 있다. === 즉시모드와 보류모드(씬그래프) === 실시간 3D ê·¸ëž˜í”½ì„ ìœ„í•œ API í”„ë¡œê·¸ëž˜ë° ë°©ì‹ì—는 즉시모드와 보류모드 ë‘가지 ë°©ë²•ì´ ìžˆë‹¤. * '''보류모드란, apiìƒì—서 미리 ì–´ë–¤ 기본ì ì¸ ë„í˜•ì˜ êµ¬ì„±ë°©ì‹ì´ë‚˜ 처리방ì‹ì´ ë‚´ë¶€ì 으로 ì •í•´ì ¸ìžˆëŠ” ìƒíƒœì—서 ë„í˜•ì„ êµ¬ì„±í•˜ëŠ” ë°ì´í„°ë¥¼ API ë˜ëŠ” íˆ´í‚·ì— ì œê³µí•¨ìœ¼ë¡œì¨ ë„í˜•ì„ êµ¬ì„±(ì´ë¯¸ì§€ 구성)하는 ë°©ì‹ì„ ì´ì•¼ê¸°í•œë‹¤.''' ìž¥ë©´ë‚´ì˜ ëª¨ë“ ë¬¼ì²´ë“¤ê³¼ ê·¸ 사ì´ì˜ 관계를 미리 만들어진 ë°ì´í„° 구조로 만들어ë‘ëŠ”ê²ƒì„ ì”¬ê·¸ëž˜í”„(scene graph)ë¼ í•œë‹¤. * '''즉시모드란, 그래픽 í”„ë¡œì„¸ì„œì— ì§ì ‘ì ì¸ ëª…ë ¹ì„ ì „ë‹¬í•´ì„œ ìƒíƒœë¥¼ 변경시켜 ì´ì–´ì§€ëŠ” ëª¨ë“ ëª…ë ¹ì— ê·¸ ìƒíƒœë¥¼ ë°˜ì˜í•˜ëŠ” ë°©ì‹ì„ ì´ì•¼ê¸°í•œë‹¤.''' ì´ ë°©ì‹ì€ 위ì—서 언급한 ì”¬ê·¸ëž˜í”„ì— APIì˜ ë‚´ë¶€ì ì¸ ë™ìž‘ì—ë„ ì´ ë°©ì‹ì´ ì“°ì¸ë‹¤. 즉시모드ì—서 ì´ë¯¸ ì‹¤í–‰ëœ ëª…ë ¹ì€ ê·¸ ë‹¤ìŒ ëª…ë ¹ì— ì˜í–¥ì„ 받지 ì•ŠëŠ”ë° ì˜ˆë¥¼ 들ìžë©´ í™”ë©´ì— í•˜ëŠ˜ì— ëŒ€í•œ í´ë¦¬ê³¤ì„ í…스ì³ë¥¼ 입힌뒤 ì´ í…ìŠ¤ì³ ìƒíƒœë¥¼ í•´ì œí•˜ê³ , ë•…ì— ì¡°ëª…íš¨ê³¼ì—를 주기 위해 조명효과 ìƒíƒœë¥¼ 변경시킨다면, 화면ì—는 í•˜ëŠ˜ì— ë¯¸ë¦¬ êµ¬ì„±ëœ í…스ì³ì—는 ë³€í•¨ì´ ì—†ìœ¼ë©° í•˜ëŠ˜ì— ì¡°ëª…íš¨ê³¼ê°€ ë°˜ì˜ì´ ë˜ê³ ë•…ì€ í…ìŠ¤ì³ ìƒíƒœê°€ ë°˜ì˜ì´ 안ë˜ê³ ì¡°ëª…íš¨ê³¼ì— ëŒ€í•œ 것만 ë°˜ì˜ì´ ë 것ì´ë‹¤. === 좌표체계 === * í™”ë©´ì„ êµ¬ì„±í•˜ëŠ” 좌표방ì‹ì€ 우리가 보통사용하는 ì§êµì¢Œí‘œê³„(ë°ì¹´ë¥´íЏ 좌표계)ë§ê³ ë„ ì—¬ëŸ¬ê°€ì§€ê°€ 있다. ì´ ì¢Œí‘œì²´ê³„ì— ë”°ë¼ì„œ ì´ë¯¸ì§€ 구성하는 ë°©ì‹ë„ ì™„ì „ížˆ 달ë¼ì§ˆ 수 있어서 ì´ë¥¼ 잘 ê³ ë ¤í•´ì„œ ì„ íƒí•´ì•¼í•œë‹¤. 하지만 지금 우리는 ì¼ë‹¨ ì§êµì¢Œí‘œê³„를 ê°€ì§€ê³ ë…¼í•´ë³¼ 것ì´ë‹¤. === ë·°í¬íЏ(viewport)와 í´ë¦¬í•‘(clipping) === * í´ë¦¬í•‘ì´ëž€, 우리가 í™”ë©´ì— ì´ë¯¸ì§€ë¥¼ 그리기 위해서는 openGLì—게 í™”ë©´ì˜ ì¢Œí‘œ ê¸°ì¤€ì„ ì•Œë ¤ì¤„ 필요가 있는ë°, openGLì—게 화면 좌표계 ì˜ì—ì„ ì •í•´ì£¼ëŠ” ê²ƒì„ í´ë¦¬í•‘ì´ë¼ê³ 한다. {{{: example) ì§ì‚¬ê°í˜• 좌측하단 (0.0) ~ ì§ì‚¬ê°í˜• 우측 ìƒë‹¨(100,100) 좌표로 구성ë˜ëŠ” ì§ì‚¬ê°í˜•ëª¨ì–‘ì˜ ì¢Œí‘œê³„ë¥¼ í´ë¦¬í•‘한다ë¼ê³ ë³´ë©´ ì´ ì¢Œí‘œê³„ ì˜ì—ì€ ì¤‘ì‹¬ì´ (50,50)ì¸ í´ë¦¬í•‘ ì˜ì—ì´ë¼ê³ 한다. 만약 ì¢Œí‘œì¤‘ì‹¬ì„ (0,0)으로 ë§Œë“¤ê³ ì‹¶ë‹¤ë©´ xì¶•ê³¼ yì¶•ì˜ +ì˜ì—좌표와 -ì˜ì—좌표를 대ì¹í˜•으로 만들어야한다. }}} * ë·°í¬íŠ¸ëž€, í™”ë©´ì˜ ì¢Œì¸¡ í•˜ë‹¨ì´ 0,0으로 ê¸°ì¤€ì„ ë‘ê³ ìš°ë¦¬ê°€ 눈으로 보는 윈ë„ìš° ì°½ì—서 ìž„ì˜ì˜ í¬ê¸°ë¥¼ í• ë‹¹í•´ì„œ ì´ë¯¸ì§€ ìž‘ì—…ì„ í• ìˆ˜ 있는 화면ì—ì„œì˜ ì‹¤ì§ˆì ì¸ ì´ë¯¸ì§€ 작업 ì˜ì—를 ì´ì•¼ê¸°í•œë‹¤. í´ë¦¬í•‘ê³¼ 연관지어 ì´ì•¼ê¸°í•˜ë©´, í´ë¦¬í•‘ì„ í™”ë©´ì— ì 용시키는 ì˜ì—으로 ë§í• 수 있겟다. ì´ ë·°í¬íŠ¸ëŠ” 보통 ì°½ ì „ì²´ë¥¼ ì„¤ì •í•´ë‘ê³ ìž‘ì—…í•˜ì§€ë§Œ, 특수한 경우 í™”ë©´ì˜ êµ¬ì„±ì„ ì„œë¡œ 다른 ì´ë¯¸ì§€ë¡œ 구성해야한다면, ë·°í¬íŠ¸ë¥¼ 나누어서 ìž‘ì—…í• ìˆ˜ 있다. === ì§êµ 투ì˜ê³¼ ì›ê·¼ íˆ¬ì˜ === * ê³ ë“±í•™êµ ê¸°í•˜ì™€ 백터단ì›ì„ 배울 때 projection(투ì˜)ì„ ë°°ì› ì„ ê²ƒì´ë‹¤. ì´ë•Œ ë°°ìš´ 투ì˜ì´ëž€, ì§êµ 투ì˜ìœ¼ë¡œ 2ì°¨ì›ìœ¼ë¡œ êµ¬ì„±ëœ ë©´ì— ìˆ˜ì§í•œ ì¶•ì„ ê¸°ì¤€ìœ¼ë¡œ ë„í˜•ì„ êµ¬ì„±í•˜ëŠ” ì ë“¤ì„ ë©´ìœ¼ë¡œ 수ì§í•˜ê²Œ 내리는 ê²ƒì„ ë§í•œë‹¤. ì§êµíˆ¬ì˜ì˜ íŠ¹ì§•ì€ ë¬¼ì²´ê°€ 멀리있는가 ì—†ëŠ”ê°€ì— ìƒê´€ì—†ì´ ê°™ì€ í¬ê¸° 비율로 í‘œí˜„ì´ ëœë‹¤ëŠ” ì ì´ë‹¤. * ì›ê·¼ 투ì˜ì€ ê°€ê¹Œì´ ìžˆëŠ”ê°€ ë©€ë¦¬ìžˆëŠ”ê°€ì— ëŒ€í•œ í‘œí˜„ì„ ê°€ëŠ¥ì¼€í•˜ëŠ” ë¹„ìœ¨ì„ ì 용한 투ì˜ìœ¼ë¡œ 한ì ì—서 í¼ì§€ëŠ” ë¹›ì„ ìƒê°í•˜ë©´ 쉽게 알 수 있다. '''ì›ê·¼íˆ¬ì˜ 그림 예시''' attachment:farprojection.png == Chapter 2. openGLì˜ ì‚¬ìš© == * ë“¤ì–´ê°€ê¸°ì „ì— openGLì€ í”„ë¡œê·¸ëž˜ë° ì–¸ì–´ê°€ 아닌 ''그래픽 하드웨어 ì œì–´ë¥¼ 위한 소프트웨어 ì¸í„°íŽ˜ì´ìФ''ì´ë‹¤. ê·¸ë¦¬ê³ ë†’ì€ ì´ì‹ì„±ì„ 지닌 그래픽&모ë¸ë§ ë¼ì´ë¸ŒëŸ¬ë¦¬ì´ë‹¤. 다시ë§í•´, OpenGLì€ ì–¸ì–´ê°€ 아닌 APIì´ë‹¤. === OpenGLì˜ ìž‘ë™ë°©ì‹ === * openGLì˜ ë‚´ë¶€ëŠ” ìƒíƒœë“¤ì˜ 변화를 통해서 ìž‘ë™í•˜ëŠ” 기계ìƒíƒœë¡œ ë™ìž‘한다. * openGLì—는 창관리, ìƒí˜¸ 작용 ì¸í„°íŽ˜ì´ìŠ¤ì— ëŒ€í•œ ì–´ë–¤ í•¨ìˆ˜ë„ ì—†ë‹¤. ì´ëŠ” '''ì¼ë°˜ì ì¸ ìž„í”Œë¦¬ë¨¼í…Œì´ì…˜(ì§€ì •ëœ ê·œì•½ì„ êµ¬í˜„í•œ 구현체)'''ì— ì 용하기 위해서ì´ë‹¤. Macì´ë‚˜ 리눅스 윈ë„ìš° ê°ê° í™˜ê²½ì— ëŒ€í•´ì„œ ëª¨ë‘ ì ‘ê·¼ì´ ê°€ëŠ¥ì¼€ 하기위함ì´ë¼ê³ 간단히 ë§í• 수 있다. * ì¼ë°˜ ì ì¸ ìž„í”Œë¦¬ë¨¼í…Œì´ì…˜ì´ë¼ëŠ” 용어를 약간 ìžì„¸ížˆ 설명하ìžë©´ ì´ ë§ì€ 그래픽 ì´ë¯¸ì§€ë¥¼ ì¶œë ¥í• ìˆ˜ 있는 시스템ì´ë¼ë©´ ì–´ë””ë“ ì§€ ì´ openGLì„ ì ìš©í• ìˆ˜ 있어야한다는 걸 함축하는 용어ë¼ê³ í• ìˆ˜ 있다. ''ì°¸ê³ ë¡œ ì¼ë°˜ì ì¸ ìž„í”Œë¦¬ë¨¼í…Œì´ì…˜ì€ 소프트웨어 임플리먼테ì´ì…˜ì´ë‹¤.'' * ê·¸ë ‡ë‹¤ë©´ ì´ openGLì€ êµ¬ì²´ì 으로 ì–´ë–¤ì‹ìœ¼ë¡œ 작용하는가? 윈ë„우를 예시로 들어보ìž. 윈ë„ìš° ê°™ì€ ê²½ìš° ì–´ë–¤ í™”ë©´ì— ì´ë¯¸ì§€ë¥¼ ì¶œë ¥í•˜ë ¤ë©´ '''GDI(graphic Device Interface)ë¼ëŠ” 그래픽 장치 ì¸í„°íŽ˜ì´ìФ'''를 통해서 ì¶œë ¥ìž¥ì¹˜ë¡œ ì¶œë ¥ë°ì´í„°ë¥¼ ë³´ë‚´ ì¶œë ¥í•œë‹¤. * openGLì€ ì–´í”Œë¦¬ì¼€ì´ì…˜ìœ¼ë¡œë¶€í„° êµ¬ì„±í•˜ë ¤ëŠ” ì´ë¯¸ì§€ì— 대한 ì •ë³´ë¥¼ 받아 ì´ë¯¸ì§€ë¥¼ 구성후 ì´ GDIì—게 구성한 ì´ë¯¸ì§€ë¥¼ ë³´ë‚´ ì¶œë ¥ìž¥ì¹˜ê°€ ì´ë¥¼ ì¶œë ¥í•˜ê²Œë”한다. 다른 ìš´ì˜ì²´ì œë„ 마찬가지로 윈ë„ìš°ì—서 GDIì— í•´ë‹¹í•˜ëŠ” 부분만 ë‹¤ë¥¼ë¿ ê³¼ì •ì€ ê°™ë‹¤. === openGLì˜ í•˜ë“œì›¨ì–´ 임플리먼테ì´ì…˜ === * openGLì€ í•˜ë“œì›¨ì 으로 처리ë˜ëŠ” ë¶€ë¶„ë„ ìžˆê³ ì†Œí”„íŠ¸ì›¨ì–´ì 으로 처리ë˜ëŠ” 부분ì´ìžˆë‹¤. 여기ì—서 ë§í•˜ê³ ìž í•˜ëŠ”ê²ƒì€ í•˜ë“œì›¨ì–´ì ì¸ ê²ƒì´ë‹¤. * openGLì˜ í•˜ë“œì›¨ì–´ 임플리먼테ì´ì…˜ì€ 그래픽 개발사ì—서 그래픽 카드 드ë¼ì´ë²„ 형태로 개발ë˜ê³ 사용ëœë‹¤. openGLì´ íŠ¹ì • 플랫í¼ì—서 시작하여 ì¼ë°˜ì ì¸ í”Œëž«í¼ìœ¼ë¡œ ì „í–¥í•˜ê³ ê°œë°©í™”ë¥¼ 실시했ì„때 ê° ê·¸ëž˜í”½ 드ë¼ì´ë²„ì— ëŒ€í•œ openGLì˜ ê°œë°œì€ í•˜ë“œì›¨ì–´ ì œìž‘ì‚¬ì—서 ì´ë£¨ì–´ì ¸ì•¼ í•œë‹¤ê³ ìƒê°í•˜ê³ 그리 시행했는ë°, ì´ëŠ” 매우 ì 합한 ì„ íƒì´ ë˜ì—ˆê³ ì´ë¡œ ì¸í•´ 하드웨어 임플리먼테ì´ì…˜ì€ 그래픽 개발사ì—서 맡게ë˜ì—ˆë‹¤. * 하드웨어ì ì¸ ë‚´ìš©ì„ ì„¤ëª…í•˜ë ¤ë©´ ìš°ì„ openGLì˜'''파ì´í”„ë¼ì¸'''ì— ëŒ€í•´ì„œ 설명해야한다. ê³ ë¡œ ê·¸ 파ì´í”„ë¼ì¸ì— 대해서 살펴보ìž. === 파ì´í”„ë¼ì¸ === * ì´ëŠ” 그림부터 ë³´ì—¬ì£¼ê³ ì„¤ëª…í•˜ê²Ÿë‹¤. attachment:pipeLine2.png * 1. ìš°ì„ ëª…ë ¹ 버í¼ì— openGLëª…ë ¹ì´ ìŒ“ì¸ë‹¤.(vertexë°ì´í„°ì™€ í…ìŠ¤ì³ ë°ì´í„°ê°€ 쌓ì¸ë‹¤.) * 2. ê·¸ 다ìŒ, vertexë°ì´í„°ì™€ í…ìŠ¤ì³ ë°ì´í„°ì— 대해서 조명, ë³€í™˜ê³¼ì •ì´ ì¼ì–´ë‚œë‹¤. ìžì„¸ížˆ 설명하ìžë©´, 물체를 구성하는 ì ë“¤ì— ëŒ€í•´ì„œ 좌표변환, ë°©í–¥ë³€í™˜ì„ ìˆ˜í–‰í•˜ê³ í…스ì³(ì´ë¯¸ì§€)ì— ëŒ€í•´ì„œ 조명ì´ë‚˜ 색ìƒì„ 변화시키는 ê³¼ì •ì´ë¼ê³ í• ìˆ˜ 있다. * 3. ê·¸ 후 변환ë°ì´í„°ë¥¼ ë ˆìŠ¤í„°ë¼ì´ì¦ˆ(í™”ë©´ì— ë‚˜íƒ€ë‚ í™”ìƒì„ 구성하는 단계)부분으로 보낸후, 외관과 ìƒ‰ìƒ í…스ì³, 지오메트리를 ëª…ë ¹ëŒ€ë¡œ 구성하여 í”„ë ˆìž„ 버í¼ë¡œ 보낸다. * 4. í”„ë ˆìž„ 버í¼ëŠ” 그래픽 ì¶œë ¥ìž¥ì¹˜ì˜ ë©”ëª¨ë¦¬ë¥¼ ì´ì•¼ê¸°í•˜ë©°, ì—¬ê¸°ì— ì˜¬ë¼ê°„다는 ì´ì•¼ê¸°ëŠ” í™”ë©´ì— ë³´ì—¬ì§„ë‹¤ëŠ” ì´ì•¼ê¸°ì™€ 같다. === ë°ì´í„° 타입 === * openGLì€ ë°ì´í„°íƒ€ìž…ì„ ë‚´ë¶€ì 으로 ì •ì˜ í•˜ê³ ë‚´ë¶€ì—서 ì“°ê³ ìžˆë‹¤. ì´ëŠ” ì—시 ì¼ë°˜ì ì¸ ìž„í”Œë¦¬ë¨¼í…Œì´ì…˜ì„ ê³ ìˆ˜í•˜ê¸° ìœ„í•´ì„œìž„ì€ ë‹¹ì—°í•œ 사실ì´ë‹¤.(ê° í™˜ê²½ë§ˆë‹¤ ë°ì´í„° 형ì‹ì´ 다르기 ë•Œë¬¸ì— ì´ë¥¼ 모ë‘수용하기 위해서는 ìžì²´ì 으로 ì •ì˜í•œ ë°ì´í„°í˜•ì‹ì„ 쓸 수 ë°–ì— ì—†ë‹¤.) * ê·¸ë¦¬ê³ ì´ ë°ì´í„°íƒ€ìž…ì€ openGLì— naming convention(ì´ë¦„ 규칙)ì— ë”°ë¼ ì •í•´ì ¸ì„œ ì€ê·¼ížˆ 외우기 쉽다. ì•„ëž˜ì˜ í‘œë¥¼ 살펴보ìž. || <openGLë°ì´í„° 타입> || <설명> || <ëŒ€ì‘ c언어 ë°ì´í„° 타입> || <변수 ì ‘ë‘ì–´ 규칙> || || GLbyte || 8비트 ì •ìˆ˜ || signed char || b || || GLshort || 16비트 ì •ìˆ˜ || short || s || || GLint, GLsizei || 32비트 ì •ìˆ˜ || long || l || || GLfloat, GLclampf || 32비트 실수 || float || f || || GLdouble, GLclampd || 64비트 실수 || double || d || || GLubyte, GLboolean || 부호없는 8비트 ì •ìˆ˜ || unsigned char || ub || || GLushort || 부호없는 16비트 ì •ìˆ˜ || unsigned short || us || || GLuint, GLenum, GLbitfield || 부호없는 32비트 ì •ìˆ˜ || unsigned long || ui || * openGLì„ ìƒì§•하는 GLì„ ì•žì— ë¶™ížˆëŠ”ê±´ ì´ë¿ë§Œì•„ë‹ˆë¼ í•¨ìˆ˜ì—ë„ ì ìš©ëœë‹¤ëŠ” ì‚¬ì‹¤ì„ í•˜ë‚˜ 알아ë‘ìž. * size ë¼ëŠ” 단어가 들어간 íƒ€ìž…ì€ ê¸¸ì´ë‚˜ 깊ì´ì™€ ê°™ì€ ê°’ì„ ë‹´ëŠ”ë° ì“°ì´ëŠ” 타입으ë¼ëŠ” ê²ƒì„ ë‚˜íƒ€ë‚¸ë‹¤. * clampë¼ëŠ” 단어가 ë¶™ì€ íƒ€ìž…ì€ í¬ê¸°ê°€ 0.0ì—서 1.0사ì´ë¡œ 범위가 ì œí•œë˜ëŠ” 타입ì´ë¼ëŠ” ì˜ë¯¸ë¥¼ 가진다. * enumì€ ì—´ê±°í˜• booleanì€ íŠ¸ë£¨ í´ìФ. * bitfield는 눈치 ì±„ì…§ë“¯ì´ ë°”ì´ë„ˆë¦¬ 비트필드 ê°’ì— ëŒ€í•œ 타입ì´ë‹¤. 앞서 ë§í•œ openGLì˜ ë‚´ë¶€ëŠ” ìƒíƒœì— 대한 기계ìƒíƒœì˜ 변화로 ì´ë£¨ì–´ ì§„ë‹¤ê³ í–ˆëŠ”ë° ì´ê²Œ ë‚˜ì¤‘ì— ìƒíƒœì— 대한 묶ìŒì„ í‘œí˜„í•˜ê³ ìƒíƒœë¬¶ìŒì„ 그때그때 편리하게 ë³€í™”í• ë•Œ ì“°ì¸ë‹¤. === 함수 ì´ë¦„ 규칙 === * 규칙 : <ë¼ì´ë¸ŒëŸ¬ë¦¬ ì´ë¦„><루트 ëª…ë ¹ì–´><(ì„ íƒì ) ì¸ìžì˜ 수><(ì„ íƒì )ì¸ìž 타입> * 위와 ê°™ì€ ë°©ì‹ìœ¼ë¡œ 함수 ì´ë¦„ì´ ì •í•´ì ¸ìžˆëŠ”ë° ì˜ˆë¥¼ 들어보ìžë©´ 다ìŒê³¼ 같다. * glColor3f(GLfloat a, GLfloat b, GLfloat c); ---->ì´ì™€ ê°™ì€ í•¨ìˆ˜ë¥¼ ë¶„ì„í•´ë³´ë©´, glì´ë¼ëŠ” ë¼ì´ë¸ŒëŸ¬ë¦¬ì— Colorë¼ëŠ” ëª…ë ¹ì„ ë‹´ë‹¹í•˜ëŠ” floatì¸ìžê°€ 3개있는 함수ì´ë‹¤.ë¼ê³ í•´ì„í• ìˆ˜ 있다. * ìœ„ì˜ ê·œì¹™ì—서 (ì„ íƒì )ì´ë¼ê³ ë˜ì–´ìžˆëŠ” ê²ƒì€ ì—†ì„ìˆ˜ë„ ìžˆê³ ìžˆì„ìˆ˜ë„ ìž‡ë‹¤ëŠ” ì´ì•¼ê¸°ì´ë‹¤. 위를 예를 ì´ìš©í•´ì„œ 설명하ìžë©´, glColor()ê°€ 있 ì„ ìˆ˜ 있다는 ì´ì•¼ê¸°ì´ë‹¤. * ''ì°¸ê³ ì‚¬í• : openGlì˜ ë‚´ë¶€ì ì¸ ë°ì´í„°íƒ€ìž…ì€ floatì„ ì‚¬ìš©í•˜ê³ ìžˆê¸° ë•Œë¬¸ì— ì™ ë§Œí•´ì„œëŠ” ì´ ë°ì´í„° íƒ€ìž…ì— ë§žê²Œ ë°ì´í„°ë¥¼ ì „ë‹¬í•´ì£¼ëŠ”ê²Œ ì •í™•ë„ ì¸¡ë©´ì´ë‚˜ ì „ì²´ì ì¸ ì„±ëŠ¥ í–¥ìƒì˜ 측면ì—서 ë” ì¢‹ë‹¤.''