ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • GLSL 강좌(1)
    3D Graphics/Shader 2007. 6. 23. 10:26
    728x90
    이번에 OpenGL에서 쉐이더를 사용하게 되면서 GLSL을 공부했습니다.

    아직 저도 배우는 중이지만 나름대로의 경험을 바탕으로 몇줄 적어보고자 합니다.

    GLSL이란 OpenGL에서 쉐이더를 지원하기 위해 나온 고급 언어입니다. 이미 Direct X에서는 HLSL이라는

    고급언어가 있고 Nvidia사에서 CG라는 고급 쉐이디 언어를 지원하기에 OpenGL 진영에서도 2.0부터 전격적으로

    도입했다더군요.

    뭐 사설은 여기까지 하고 일단 내 그래픽카드가 GLSL를 지원하나부터 알아봅시다.

    OpenGL의 고급기능을 쓰기 위해서는 확장기능을 이용해야 합니다. 이번 첫 강좌에서는 확장기능을 어떻게

    사용하는지 알아봅시다.

    printf("opengl 버전 : %s\n",glGetString(GL_VERSION));


    자 저기서 glGetString() 함수가 OGL에서 지원되는 기능을 알고자 할때 사용하는 함수입니다.

    인자에 GL_VERSION을 넣으면 현재 지원되는 버전이 나오게 되죠.

    다음은 고급기능을 지원하기 위한 Extension(확장)기능을 사용하는 법을 배워보도록 합시다.

    일단 확장기능을 사용하기 위해서는 glext.h 파일이 필요합니다.

    SGI OGL확장기능 관련 페이지 <- 여기로 가시면 확장기능에 대한 정보를 얻으실수가 있습니다.

    자 이제 확장기능이 지원되는지 알아보도록 할까요??

    char *extensionStr;
    extensionStr = (char *)glGetString(GL_EXTENSIONS);
    IsStr("GL_ARB_multitexture",extensionStr);

    방금 사용했단 glGetString()를 이용해서 확장기능의 문자열을 얻어옵니다.

    그리고 해당 문자열에서 원하는 확장기능이 있는지를 검사하면 되는거죠~

    bool IsStr(char *serchStr, char *str)
    {
        char *endOfStr;
        int idx=0;

        endOfStr = str + strlen(str);

        while(str < endOfStr)
        {
            idx = strcspn(str, " ");
            if (((int)strlen(serchStr) == idx) && (strncmp(serchStr, str, idx) == 0))
            {
                return true;
            }

            str+= (idx+1);
        }

        return false;
    }

    해당문자열이 있는지 알아내기위해 만든 함수입니다.

    자 이제 위에서 한거처럼 GLSL확장을 지원하는지 확인해 봅시다.

    extensionStr = (char *)glGetString(GL_EXTENSIONS);
     if (IsStr("GL_ARB_vertex_shader",extensionStr) && IsStr("GL_ARB_fragment_shader",extensionStr) &&
        IsStr("GL_ARB_shader_objects",extensionStr)&&IsStr("GL_ARB_shading_language_100",extensionStr)
    {
        //일단 여기는 보류~
    }

    저기서 그래픽카드에서 프래그먼트 쉐이더를 지원하지 못하는 경우도 있으니 그때는 따로 체크해주시면 됩니다.

    확장 기능을 사용하기 위해서는 또 해야할것이 있습니다. (아이고..뭐가 이리 많다죠?? ^^;)

    확장함수를 얻기위해 함수 포인터를 선언해야 합니다.

    PFNGLMULTITEXCOORD2FARBPROC        glMultiTexCoord2fARB = NULL;
    PFNGLACTIVETEXTUREARBPROC        glActiveTextureARB = NULL;
    PFNGLCLIENTACTIVETEXTUREARBPROC    glCliectActivetextureARB = NULL;
    PFNGLDELETEOBJECTARBPROC glDeleteObjectARB = NULL;
    PFNGLGETHANDLEARBPROC glGetHandleARB = NULL;
    PFNGLDETACHOBJECTARBPROC glDetachObjectARB = NULL;
    PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB = NULL;
    PFNGLSHADERSOURCEARBPROC glShaderSourceARB = NULL;
    PFNGLCOMPILESHADERARBPROC glCompileShaderARB = NULL;
    PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB = NULL;
    PFNGLATTACHOBJECTARBPROC glAttachObjectARB = NULL;
    PFNGLLINKPROGRAMARBPROC glLinkProgramARB = NULL;
    PFNGLVALIDATEPROGRAMARBPROC glValidateProgramARB = NULL;
    PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB = NULL;
    PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB = NULL;
    PFNGLGETINFOLOGARBPROC glGetInfoLogARB = NULL;
    PFNGLUNIFORM1FARBPROC glUniform1fARB = NULL;
    PFNGLUNIFORM1IARBPROC glUniform1iARB = NULL;
    PFNGLUNIFORM3FVARBPROC glUniform3fvARB;
    PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB = NULL;

    와 많죠?? 앞으로 하나씩 각 함수의 기능에 대해서 설명하도록 하겠습니다.

    자 함수포인터도 선언했으니 이제 확장함수의 주소를 얻어와야죠~.

    확장함수의 주소를 얻는데는 wglGetProcAddress()함수를 사용합니다. 인자로 해당 확장함수의 이름을 받죠~.

    사용하기 전에! 이 함수를 사용하기 위해서는 glaux.h파일을 포함시켜줘야 합니다~^^

    자 이제 확장기능를 체크하고 함수포인터까지 얻는 전체 소스를 보도록 하죠.


    다른 확장기능도 지금까지 했던 방법처럼 함수 포인터를 얻어서 사용할수가 있습니다.

    다음 강좌에서는 GLSL를 셋팅하고 간단한 정점 쉐이더를 적용시켜 보겠습니다.



    댓글

Designed by black7375.