E D R S I H C RSS
ID
Password
Join
ê³ í–¥ì´ëž€ ì˜ˆì „ì— ê·¸ê³³ì—서 ì‚´ì•˜ë˜ ì‚¬ëžŒë“¤ë¡œë¶€í„° 가장 ì‚¬ëž‘ì„ ë°›ëŠ” 듯. ―W.D.T.

목차 #

Contents

1 목차
2 머리글
3 Extensionì˜ ì‚¬ìš©
4 마치며

2 머리글 #

  • 현재 버젼 : 0.3
  • Extensionì´ëž€ OpenGL 기본 í•¨ìˆ˜ì™¸ì— ê°€ì†ê¸° 제작회사나 intelê°™ì€ ê³³ì—서 ë‚˜ë¦„ëŒ€ë¡œì˜ ì•Œê³ ë¦¬ì¦˜ì„ ê°œë°œí•˜ì—¬ ê¸°ëŠ¥ì„ ì§€ì›í•˜ëŠ” í”ŒëŸ¬ê·¸ì¸ ê°™ì€ ê²ƒì„ ë§í•©ë‹ˆë‹¤. 그냥 코딩하면 물론 사용할 수 없으므로 지금 설치ë˜ì–´ìžˆëŠ” 시스템 하드웨어(특히 그래픽 카드)ê°€ ì§€ì›í•˜ëŠ”ì§€ 여부를 알아내야 합니다. 다ìŒì€ OpenGL사ì´íЏì—서 찾아 ì˜ì—­í•œ 내용입니다. (제가 ì˜ì–´ì‹¤ë ¥ì´ íƒì›”하지 않다는 ê²ƒì„ ì—¼ë‘ì— ë‘시길...B) 몇몇 ë¬¸ìž¥ì€ ì œê°€ ìž„ì˜ë¡œ ì˜ì—­í–ˆìœ¼ë¯€ë¡œ ë²ˆì—­ê¸€ì— ëŒ€í•´ ë§˜ì— ì•ˆë“œì‹œë©´ ì´ë©œì£¼ì‹œë©´ 수정하겠습니다.)

  • ì›ë¬¸ : http://oss.sgi.com/projects/ogl-sample/registry/doc/rules.html#using

3 Extensionì˜ ì‚¬ìš© #


  • 특정 OpenGL extensionë“¤ì„ ì‚¬ìš©í•˜ê³ ìží•˜ëŠ” í”„ë¡œê·¸ëž˜ë¨¸ë“¤ì€ ì»´íŒŒì¼ ì •ì˜ìš”소들 (extensionì„ ì§€ì›í•˜ëŠ” 회사ì—서 제공한 ë¼ì´ë¸ŒëŸ¬ë¦¬ì—서 ì§€ì›ë˜ëŠ”ì§€ 여부를 알아내기위해서)ê³¼ glGetString() í•¨ìˆ˜ì— ì˜í•´ 반환ë˜ëŠ” extension 문ìžì—´(ëžœë”ë§ì‹œ ì§€ì›ë˜ëŠ”ì§€ 여부를 알기위해서) ì–‘ìª½ì„ ê²€ì‚¬í•´ì•¼ë§Œ 합니다. 윈ë„ìš° ìƒì—서는 extensionì— ê´€ë ¨ëœ í•¨ìˆ˜ë“¤ì„ ì¼ë°˜ì ìœ¼ë¡œ ë§í¬ 실행시ì—는 ì •ì˜ë˜ì§€ 않고, wglGetProcAddress()함수를 호출하여 확장 APIë“¤ì˜ í•¨ìˆ˜ í¬ì¸í„°ë“¤ì„ 얻는 ë°©ë²•ì„ ì·¨í•©ë‹ˆë‹¤.

  • 예를 들ìžë©´, ë‹¤ìŒ ì½”ë“œëŠ” 현재 ì‹œìŠ¤í…œì˜ ëžœë”러가 "GL_EXT_new_extension"ì´ë¼ 불리는 OpenGL extensionì„ ì§€ì›í•˜ëŠ”ì§€ 여부를 검사하는 코드입니다.
    static GLboolean CheckExtension(char *extName, const char *extString)
    {
        /*
         ** extensionë“¤ì´ ë‹´ê¸´ 문ìžì—´ë‚´ì—서 extNameì„ ì°¾ëŠ”ë‹¤.
         */
        char *p = (char *)extString;
        char *end;
        int extNameLen;
    
        extNameLen = strlen(extName);
        end = p + strlen(p);
    
        while (p < end) {
            int n = strcspn(p, " ");
            if ((extNameLen == n) && (strncmp(extName, p, n) == 0)) {
                return GL_TRUE;
            }
            p += (n + 1);
        }
        return GL_FALSE;
    }
    
    const GLubyte *ext_string;
    int new_ext_supported = GL_FALSE;
    
    if (CheckExtension("GL_EXT_new_extension", glGetString(GL_EXTENSIONS)))
        new_ext_supported = GL_TRUE;
    


  • ë§Œì¼ ëžœë”러가 주어진 extensionì„ ì§€ì›í•œë‹¤ë©´, 실행중 ê·¸ ê²ƒì„ ì‚¬ìš©í•˜ëŠ” ê²ƒì€ ì•ˆì „í•©ë‹ˆë‹¤. 컴파ì¼ì´ 실행ë ë•Œì—는 ë§í¬í•˜ë ¤ëŠ” ë¼ì´ë¸ŒëŸ¬ë¦¬ê°€ extensionì— ê´€ë ¨ëœ í•¨ìˆ˜ë¥¼ ì‹ë³„ë„ë¡ ì •ì˜í•˜ëŠ” ê²ƒì´ í•„ìš”í•©ë‹ˆë‹¤. 예를 들면,
    #ifdef GL_EXT_new_extension
        if (new_ext_supported)
            glNewExtensionEXT()
    #endif
    
  • 윈ë„우즈 OpenGLì—서는 extensionì€ ì¼ë°˜ì ìœ¼ë¡œ ì •ì ìœ¼ë¡œ ë§í¬ë˜ê¸°ë³´ë‹¤ëŠ” 디바ì´ìФ 드ë¼ì´ë²„로부터 ë™ì ìœ¼ë¡œ 로딩ë©ë‹ˆë‹¤. extensionì—서 제공하는APIë“¤ì˜ í•¨ìˆ˜ í¬ì¸í„°ë“¤ì€ wglGetProcAddress()함수를 사용하여 얻고, extensionì„ ì‚¬ìš©í•˜ê¸° 위해 ê·¸ í•¨ìˆ˜ë“¤ì„ ì‚¬ìš©í•˜ë©´ ë©ë‹ˆë‹¤. 예를 들면,
    typedef void (WINAPI *PFNGLNEWEXTENSIONEXTPROC)();
    PFNGLNEWEXTENSIONEXTPROC *glNewExtensionEXT = NULL;
    
    /* 함수í¬ì¸í„°ë¥¼ 선언한 í›„ì— ì´ê²ƒì„ 한번 실행한다. */
    #ifdef GL_EXT_new_extension
        if (new_ext_supported)
            glNewExtensionEXT = (PFNGLNEWEXTENSIONEXTPROC)
                wglGetProcAddress("glNewExtensionEXT");
    #endif
    
    /* extensionì„ í˜¸ì¶œí•  때는 ì´ê²ƒì„ 사용한다. */
    #ifdef GL_EXT_new_extension
        if (new_ext_supported)
            glNewExtensionEXT();
    #endif
    


4 마치며 #

  • ë²ˆì—­ì´ ì¢€ 그렇죠? ì–´ëŠì •ë„ ê±´ë„ˆë›´ ê²ƒë„ ìžˆêµ¬... 짬짬히 ê³ ì³ë†“겠습니다. ìš”ì ì •리하ìžë©´ glGetString()ê³¼ wglGetProcAddress()함수를 사용하여 함수í¬ì¸í„°ë¥¼ 얻고 ì •ì˜í•´ì„œ 사용하면 ëœë‹¤ëŠ” 뜻입니다.
  • [http]http://www.uni-karlsruhe.de/~uli2/ - ì—¬ê¸°ì— í˜„ìž¬ê¹Œì§€ 나온 extension ëª¨ë‘ í—¤ë”í™”ì¼ê³¼ libí™”ì¼ë¡œ 만들어 ë†“ì€ í™”ì¼ì´ 있습니다. [http]여기를 눌러 다운받으시면 ë©ë‹ˆë‹¤. 하지만, 그저 extensionì— ëŒ€í•œ 선언만 있으니 해당 함수를 사용하는 ê²ƒì€ ê° extensionì„ ì°¸ê³ í•´ì•¼í•©ë‹ˆë‹¤.

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2010-10-28 12:42:54
Processing time 0.3236 sec