상세 컨텐츠

본문 제목

안드로이드 Android 오픈지엘 OpenGL 또는 OpenGL ES 2.0 기본적인 흐름도. 관련

스마트기기개발관련/OpenGL (그래픽, 게임)

by AlrepondTech 2012. 11. 13. 15:46

본문

반응형


출처: http://gogorchg.tistory.com/entry/Android-Opengl-es-20-%EA%B8%B0%EB%B3%B8%EC%A0%81%EC%9D%B8-%ED%9D%90%EB%A6%84%EB%8F%84


Opengl es 2.0 에 대해 ,
우선 제가 공부를 하면서 어느 정도 이해한 부분을 적어보고자 합니다.
정석의 내용이 아니라 제가 생각되는 점으로 적었다는 것을 먼저 알리고 싶습니다.
틀린 점이 있으면 주제 말고 적어주셨으면 합니다.

먼저, Opengl es 2.0을 사용하기 위해서는 가장 크게 3가지로 구분이 되는 것 같더군요.

Program : Opengl es 2.0 에서 가장 큰 단위 입니다. 밑에 나오는 VertexShader와 FrameShader가 합쳐져서 위 Program이 되는 거죠.

VertexShader : 물체의 모양이나 크기, 위치등 Vertex 배열을 이용해서 작성해주는 Shader입니다.

FrameShader :  물체의 색깔, 질감등에 대해 설정을 해주는 Shader입니다.

 
위 세가지가 주축이 되어서 그립니다.
즉, VertexShader, FrameShader을 만들고, Program에 적용을 시키는 형태입니다.
 

        // VertexShader 생성

        vertexShader = LoadShader(GLES20.GL_VERTEX_SHADER, vShaderStr);
        // FrameShader 생성 

        fragmentShader = LoadShader(GLES20.GL_FRAGMENT_SHADER, fShaderStr);


        // Program을 생성
      // Program이 생성되고, 그 생성된 주소 값을 넘겨 받는 다고 생각하시면 됩니다. 

        programObject = GLES20.glCreateProgram();


        // Program이 잘못 만들어 졌으니 나가라!

        if (programObject == 0)

            return;


        // VertexShader를 Program에 적용 ( Program 주소 값에 VertexShader 적용 )

        GLES20.glAttachShader(programObject, vertexShader);
        // FrameShader를 Program에 적용 ( Program 주소 값에 FrameShader적용 )

        GLES20.glAttachShader(programObject, fragmentShader);


        // Opengl에 생성한 Program을 연결 시킨다.

        GLES20.glLinkProgram(programObject);


        // linked는 new int[1] 형태임. 위 배열에 상태값을 넣어준다.

        GLES20.glGetProgramiv(programObject, GLES20.GL_LINK_STATUS, linked, 0);

        // linked가 제대로 되어 있지 않았으므로 로그 값과 에러 상태를 출력해줍니다.

         if (linked[0] == 0)

        {

            Log.e(TAG, "Error linking program:");

            Log.e(TAG, GLES20.glGetProgramInfoLog(programObject));

            GLES20.glDeleteProgram(programObject);

            return;

        } 


위 소스는  [ OpenGL ES 2.0 Programming Guide ] 란 도서의 샘플 소스를 이용한 것입니다.
 이와 같이 이해하게 되면 우선 가장 큰 틀은 이해가 된거라고 생각합니다.

그 다음 필요한 부분이  위 LoadShader를 만드는 함수 안쪽부분인데요.

 // type : 만들 Shader의 종류를 지정 -> VertexShader나 FrameShader 둘중에 하나가 가겠죠^^

// shaderSrc : Shader를 만들 때, 사용될 Native 코드를 넘긴다. (저두 이 부분은 이해 중에 있습니다....) 

// shader : 만들어진 Shader의 주소값을 넘긴다. 
private int LoadShader(int type, String shaderSrc)

    {

        int shader;

        int[] compiled = new int[1];


        // type에 맞게 Shader 생성

        shader = GLES20.glCreateShader(type);


         // 생성에 대한 예외 처리

        if (shader == 0)

            return 0;


      // Shader 생성 시 , 적용 시킬 소스 설정

        GLES20.glShaderSource(shader, shaderSrc);


       // shaderSrc를 컴파일
       // C프로그램 컴파일 하는 것과 같다고 생각하시면 됩니다.
       // 컴파일 시 에러가 뜨면 만들어 지지 않겠죠?? (문법 오류 등등 ㅋ)

        GLES20.glCompileShader(shader);


        //  컴파일 상태 확인

        GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0);


        //  컴파일이 제대로 안되면 예외 처리

        if (compiled[0] == 0)

        {

            Log.e(TAG, GLES20.glGetShaderInfoLog(shader));

            GLES20.glDeleteShader(shader);

            return 0;

        }

 

        return shader;

    }



이렇게 하면 Shader가 완성이 되는 것이고~ Opengl을 사용할 수 있게 되는 것이죠. 
Native Code는 형태가 다음과 같이 되어 있습니다.

 String vShaderStr = 

                  "attribute vec4 vPosition;    \n"

                + "void main()                  \n"

                + "{                            \n"

                + "   gl_Position = vPosition;  \n"

                + "}                            \n";


        String fShaderStr = 

                  "precision mediump float;   \n"

                + "void main()                                  \n"

                + "{                                            \n"

                + "  gl_FragColor = vec4 ( 1.0, 0.0, 0.0, 1.0 );\n"

                + "}  


C 코드라고 보시면 됩니다. ㅎㅎ

vPosition은 위에서 보셨죠? ㅋㅋ 위치를 설정해주는 변수라고 보시면 되구요.
위치를 0으로 해놓은 걸 보니 한 가운데가 되겠군요.
기본적으로 Drawing했을 때 색깔을 빨간색으로 지정했네요.

이렇게 기본적인 틀에 대해서 알아보았습니다.
이것만 보고는 이해하기고 힘들고!
무엇보다 샘플을 보고 싶으실 분들이 많을 듯 한데요.


[ OpenGL ES 2.0 Programming Guide ] 책에서 샘플이 오픈인지 아닌지 몰라서;;;
올려드릴 수 없다는 게 아쉽네요.

그럼 먼가 궁금하시거나 물어보실점 있으면 댓글 달아주세요.

아는 부분이 있으면 알려드리도록 하겠습니다.

저 또한 열심히 공부하는 중이니 서로 정보 공유를 했으면 더 좋겠네요..^^;; 


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



여기서 알아볼 내용은 다음과 같다.

1. openGL은 Microsoft 에선 어떻게 지원할까?

MS의 OpenGL 내용 = MS의 OpenGL MSDN page

간단히 정리하면 windows 2000부터 wgl 로 시작하는 함수로 지원하며,

#include <wingdi.h>, 그리고 opengl32.lib로 link하고, opengl32.dll 을 불러 시행한다.

사용 language는 C/C++ 을 지원한다.

M도 openGL의 확장에 기여를 하고 있으나 사실상 경쟁제품인 DirectX를 가지고 있어 그리 적극적이지는 않다.

- state 변수 : http://msdn.microsoft.com/en-us/library/dd369056(v=VS.85).aspx

- GL 함수 : http://msdn.microsoft.com/en-us/library/dd374211(v=VS.85).aspx

- GLU 함수 : http://msdn.microsoft.com/en-us/library/dd374158(v=VS.85).aspx

 

(header 및 lib file은 windows SDK에서 제공, dll file은 windows 에서 제공)

c:\program files\microsoft SKs\windows\(v7.0A or V7.1)\include\gl\gl.h

c:\program files\microsoft SKs\windows\(v7.0A or V7.1)\include\gl\glu.h

c:\program files\microsoft SKs\windows\(v7.0A or V7.1)\lib\gl\Opengl32.lib

c:\program files\microsoft SKs\windows\(v7.0A or V7.1)\lib\gl\glu32.lib


c:\windows\system32\opengl32.dll   -- 697KB, 2008.4.14

c:\windows\system32\glu32.dll        -- 120KB, 2008.4.14

* MS에서 glut 는 제공하지 않음. (이미 이에 해당하는 기본 library들이 다른데 있으니깐.)

* Visual Studio 2003 까지는 VS에서 header file과 library file을 제공했음. 지금은 Windows SDK로 제공 위치가 옮겨져있음.

 

2. openGL은 3D graphics 에 관심 없을때 공부할 필요가 없을까?

CUDA를 이용한 계산과 이의 결과물의 표시에서 CUDA를 이용하는 것은 CUDA C를 이용하여 프로그래밍 하면 되고, 이의 결과를 graphics로 화면에 그릴려고 할때는 openGL 이나 openCL로 그리면 된다고 이해했다.

 

3. 비슷한 기술들은 무엇이 있을까? 그들과의 차이는?

(DirectX, WPF, OpenCL, ...)

OpenGL과 Direct3D의 차이 : Wiki

MS에서 열거한 Graphics 관련 기술들

같은 저수준 API인 DirecX에 비해 GL이 사실 표준으로 인정 받는 이유는 단순하디. GL은 너무 많은 일은 하지 않는다. GL은 이미 설계된 물체를 그려낼 뿐이다. 물체를 설계하거나, 원도우를 조작하거나, 세련된 에니메이션을 가하거나, 소리를 추가하는 일은 GL의 범위가 아니다. (Direct X는 한다는 의미) 그러나 렌더링에 관한 한 GL은 충분한 능력을 가지고 있어 다양하고 유용한 기능을 고속으로 처리한다. (GL의 source는 공개되어 있다.)

 

OpenCL (Open Computing Language)

- GPU를 graphic에 한정하여 지원하는 openGL과는 달리 범용 GPU의 역량을 제대로 지원하는 산업계의 개방 표준 API 이다.

따로 정리한 내용

 

 

4. openGL은 NVIDIA에서 어떻게 지원하나?

(GPU Driver 270.61 이후)
•GeForce 8 시리즈 이상의 모든 GPU에 대해 OpenCL 1.0(Open Computing Language)을 지원합니다. 
•GeForce 8 시리즈 이상 GPU에 대해 OpenGL 3.3을 지원합니다. 
•GeForce 400 시리즈 이상 GPU에 대해 OpenGL 4.1을 지원합니다.

 

--\NVIDIA GPU Computing SDK 4.0\shared\inc\gl.h,

--\NVIDIA GPU Computing SDK 4.0\shared\inc\glu.h,

--\NVIDIA GPU Computing SDK 4.0\C\Common\Inc\GL\glut.h

 

gl.lib, glu.lib는 없다. -- windows 것을 사용해야 ..

--\NVIDIA GPU Computing SDK 4.0\C\Common\lib\freeglut.lib 가 있고

 

gl.dll 및 dlu.dll 도 없다. -- windows 것을 사용해야..

--\NVIDIA GPU Computing SDK 4.0\C\Common\bin\win32\freeglut.dll 이 있다.)

--> NVIDIA GPU SDK를 깔면 OpenGL 중의 GLUT가 install 된다.

 

 (사실 gl, glu 는 MS 것을 사용하고, 나머지 glut 는 NVIDIA것을 사용하는 구조이다.)

 

 Example :

c:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.0\C\src 아래에 여러개의 file에서 openGL의 예제가 있다. (예 : CudaDecodeGL project 등 50개 file)

 

5. openGL은 어디까지 발전해 있고, 어디서 주도하나?

Wiki 내용

OpenGL homepage

http://www.opengl.org/registry/  (마지막 update(Ver. 4.2) 2011.8.8 임)

http://www.khronos.org/files/opengl41-quick-reference-card.pdf (4.1)

http://www.opengl.org/sdk/docs/man4/ (4.2)

openGL 은 verison 4.2 까지 나와 있고

openCL은 version 1.1 까지 나와 있다.

 



국제 표준(IEEE)으로 2D쪽은 유럽측에서 GKS를 발전 시켰고 3D 쪽은 미국측에서 PHIGS를 제안 발전 시켰다. 그리고 Silicon graphic (SGI)에서 사용한 GL을 여러회사로 확대하여 사용한 OpenGL이 있는데 이를 합쳐 Open Inventor로 발전 계승되었다. 이후 VR을 나타내는 VRML 에 이것이 영향을 주고, 마지막으로 JAVA에 영향을 주어 JAVA 3D가 나오기 되었다. OpenGL은 저수준언어로서 그 이후에 나오는 고수준언어의 구현을 이 OpenGL로 하고 있다. 그래서 우리가 OpenGL을 공부하는 것이다.

 

고수준 언어 (OpenInventor등)

 |

저수준 언어 (OpenGL) -- version 4.1

|

Device Driver software -- driver version 270.81

|

Grahipic Cards -- NVIDIA CUDA VGA card

 

GL의 표준은 구조심사위원회(ARB) 가 결정한다. 이 표준회의에는 Microsoft, HP, IBM, Silicon graphics, NVIDIA등이 들어 있다.

 

6. OpenGL에 관련된 좋은 책은?

1. i-phone 3D programming [2010.10]

2. OPENGL을 이용한 컴퓨터 그래픽스 [2009.3] - 5판

3. 컴퓨터 그래픽스 wit OPENGL [2006.3]

4. OpenGL로 배우는 컴퓨터 그래픽스 [2006.1] - IT CookBook [추천]

5. OpenGL programming guide [2005.1] - 4판

 

7. openGL의 구체적인 내용은 무엇인가?

 GL은 200여개의 함수로서 구성되어 있는데 단지 렌더링 기능만 수행할 뿐, 입력장비를 통해 사용자 입력을 받아들이거나(*1) 렌드링 결과를 출력하위해 화면에 window를 생성하는 것(*2)등은 GL 이 할수 있는 일이 아니다. 이런 것들은 주위에 있는 다른 것들이 GL을 지원하게 된다.

 

*****GLUT**** *GLU** GL

**Win32** *****GL********   (Win32 대신 Linux 나 MAC O/S가 들어갈수도 있다.)

********Driver************

********Hardware********

 

위에서 (*1, *2)에 해당하는게 GLUT = OpenGL Utility Toolkit 인데 이는 운영체제가 실행하는 기능이다.

그리고 GLU는 OpenGL Utility Library는 50여개의 함수로 되어 있는데 GL library의 도우미 역할을 한다. 이는 GL의 고급기능(예:2차 곡면 기능, 다각형 분할, Projection등)을 제공하는데 내부에 GL 함수호출을 통해 구현된다. 따라서 이는 GL의 일부로 취급되기도 한다.

고로 programmer는 GLUT, GLU, GL을 이용하여 programming을 하면 된다.

 

Windows 운영체제에서 Visual C를 사용하고 있을시, openGL, GLU는 이미 깔려 있으니 GLUT만 더 download 받으면 된다.

확인해보자. (Windows XP) : 6개가 기본적으로 존재해야 하는데 4개만 있다.

c:\windows\system32\opengl32.dll   -- 697KB, 2008.4.14

c:\windows\system32\glu32.dll        -- 120KB, 2008.4.14

 

Visual Studio

--\VC\LIB\opengl32.lib

--\VC\LIB\glu32.lib

--\VC\INCLUDE\GL\opengl.h 가 있다고 했는데 없는데???

   (1번 질문의 답으로 winGDI.h 를 include 한다고 했다. 이는 c:\program files\microsoft SKs\windows\(v7.0A or V7.1)\include 에 있다. 열어서 도중에 보면 // OpenGL wgl prototypes 이라고 해서 약 150줄에 걸쳐 함수들이 보인다.)

   (gl.h를 현재 내 PC에서 찾아 보면 다음에 있다.

--\NVIDIA GPU Computing SDK\shared\inc\gl.h,

c:\program files\microsoft SKs\windows\(v7.0A or V7.1)\include\gl\gl.h

android-ndk-r5b/platforms/android-(4,5,8,9)/arch-arm/usr/include/gles/gh.h )

 

--\VC\INCLUDE\GL\glu.h 가 있다고 했는데 없는데??? --> windows SDK로 이전

c:\program files\microsoft SKs\windows\(v7.0A or V7.1)\include\gl\glu.h

위 gl directory엔 2개의 file만 있다. gl.h, glu.h 뿐.

만약 이게 자기 PC에 없다면 MS homepage에서 windows SDK version 7.1 을 download 받아서 까세요.

 

glut 에 대해 Download를 받아라.. 어디서 받지?? (windows SDK엔 없음 --> NVIDIA에서 download 받아져 있음)

(PC에 찾아 보면

--\NVIDIA GPU Computing SDK\C\Common\Inc\GL\glut.h 가 있고

--\NVIDIA GPU Computing SDK\C\Common\lib\freeglut.lib 가 있고

--\NVIDIA GPU Computing SDK\C\Common\bin\win32\freeglut.dll 이 있다.)

 

다음은 VC++의 include path 이다.

$(VCInstallDir)include;

$(VCInstallDir)atlmfc\include;

$(WindowsSdkDir)include; <-- 이놈에 의해 gl/l.h, gl/glu.h 가 including 이 된다.

$(FrameworkSDKDir)\include;

 

including 순서... 이 순서를 바꾸면 error 발생함.

#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glu.h>

 

[7.1] OpenGL 명령은 다음과 비슷하게 되어 있다.

 

gl + [명령종류] + n + type + option (x, y, z)

gl -- openGL 명령 이라는 내용

[명령종류] -- GL 함수

n -- parameter 갯수

type -- parameter의 data type (

f = 32bit floating point, d = 64bit floating point

d = 64bit integer, i = 32bit integer, ui = unsigned 32bit integer,

s = 16bit integer, b = 8bit integer, ub = unsigned 8bit integer)

option -- v = vector : iv (32bit integer vector)

 

[7.2] GLUT 명령 = 원도우 초기화 + 윈도우 관리

 

원도우 초기화

glutinit() -- 윈도우 운영체제와 SESSION과의 연결

glutinitWindowPosition(x, y) -- 원도우 위치 설정 :

GLUT 좌표체계 = Windows 좌표체계 != GL 좌표체계

glutinitWindowSize() -- 원도우 크기 설정

glutinitDisplayMode() -- dosplay mode 설정

Color 체계 및 Buffer (단일 buffer, double buffer ) 설정

윈도우 관리

glutSetWindowTitle() -- 원도우 타이틀 설정

glutCreateWindow() -- 새로운 윈도우 생성

glutReshapeWindow(w, h) -- 크기 변동에 따른 윈도우 조정 (OnSize)

glutPostRedisplay() -- 현 윈도우가 재생되어야 함을 알려줌 (Invalidate() -> OnDraw)

glutSwapBuffers() -- 현 frame buffer 변경 (double buffering에서 사용)

active buffer와 back buffer의 swap

 

[7.3] GLUT 의 상태 변수 = system 제어 상태 변수 + system 고정 상태 변수

 

system 제어 상태 변수

GLUT_INT_WINDOW_X / _Y -- integer -- glutinitWindowPosition에서 설정

GLUT_INT_WINDOW_WIDTH / _HEIGHT -- glutinitWindowsSize 에서 설정

GLUT_INT_DISPLAY_MODE -- bitmask -- glutinitDisplayMode에서 설정

system 고정 상태 변수

GLUT_SCREEN_WIDTH / _HEIGHT -- int -- 모니터 화면 폭 / 높이

GLUT_HAS_KEYBOARD -- boolean

GLUT_HAS_MOUSE -- boolean

GLUT_NUM_MOUSE_BUTTONS -- integer - 마우스 버턴 수

 

 

8.Extended GL 이란 무엇인가? 

gl.h 에 들어가지 못하는데 graphics card 회사에서 추가로 기능을 더 확장했을때는 glext.h 에 담아서 배포를 한다. glext.h 내의 어떤 기능이 많은 회사에서 제공한 다면 그것은 다음 규격회의에서 gl.h로 들어갈 수 있을 것이다.

내 PC를 scan 해보니 다음에 깔려들 있었다.

--\NDIVIA GPU Computoing SDK 4.0\

shared\inc\GL\glext.h  [370KB]

C\common\inc\GL\glext.h

CUDALibraries\common\inc\GL\glext.h

C:\program files\Android\android-ndk-r5b/platforms/android-(4/5/8/9)/arch-arm/usr/ include/GLES/gtext.h [30KB]

 

그런데 NVIDIA 쪽은 같은 곳에 wglext.h [31KB] 가 있다. 그리고 Android는 eglext.h [12KB] 가 있다. (EGL = Embedded System Graphic Library)

NVIDIA에선 CUDA Tools SDK\CUPTI\include\GL에선 glext.h [467KB], wglext.h [31KB]로 기존 것 보다 더 용량이 많네..

 

9. OpenGL ES 란 무엇인가?

Embedded System 으로 핸드폰 등의 작은 system에서의 3D 지원 tool을 의미하는 것 같다.

Android 내에서 지원을 하는데 android-ndk-r5b/platforms/android-(4/5/8/9)/arch-arm/usr/ include/GLES 에서 제공한다.

 

c:\program files\android\android-sdk-windows\docs\reference\android\opengl 에 많은 자료들이 들어 있다. 특히 GLES(10/11/20).html, GLES(10/11)Ext.html 을 참조하라.

 

C:\program files\Android\android-ndk-r5b/platforms/android-(4/5/8/9)/arch-arm/usr/ include/GLES (2) 아래에 실제 header file들이 들어 있다.

 

android엔 NDK example 도 들어 있다.

android_opengl_GLES10.cpp, GLES10Ext.cpp, GLES11.cpp, GLES11Ext.cpp, GLES20.cpp, GLES20TriangleRender.java, GLES20Activity.java

 

Android - API demo : Graphics - OpenGL ES - 이 아래에 11개의 demo 가 있음.

Compressed Texture - CompressedTextureActivity.java

Cube Map - cubeMapActivity.java

Frame Buffer Object - FrameBufferObjectActivity.java

GLSurfaceView - GLSurfaceActivity.java

Kube - cube.java + kube\*.java

Matrix Palette Skinning - MatrixPalletActivity.java

OpenGL ES 2.0 - GLES20Activity.java + GLES20TriangleRenderer.java

Spite Text - spritetext\SpriteTextActivity.java

Textured triangle - TriangleActivity.java

Touch Rotate - TouchRotateActivity.java

Translucent GLSurfaceView - TranslucentGLSurfaceViewActivity.java + GLSurfaceViewActivity.java

 

 

10. OpenGL을 이용한 간단한 프로그램을 보자.

 

철칙 1. 타 OS와의 호환성을 유지하기 위해 MS에서 제공하는 library등을 사용하지 않도록 한다. 그래서 Visual studio로 project를 만들때도 console - 빈 project로 생성 한다.

 

철칙 2. compiler에 link를 opengl32.lib, glu32.lib, glut32.lib 를 연결해주어야 한다.

 

Example은 어디에 있나?

c:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.0\C\src 아래에 여러개의 file에서 openGL의 예제가 있다. (예 : CudaDecodeGL project 등 50개 file)

 

같은 program이 Windows 7/NVIDIA, XP/Notebook, Android/Handphone에서 각각 돌도록 해보자.

 

자 이제 하나를 만들어 보자.

 1.선언

#include <glut.h>

#include <gl.h>

#include <glu.h> 

 2.시작

void MyDisplay {

    glClear(GL_COLOR_BUFFER_BIT);

    glBegin(GK_POLYGON);

 3.본문

    glVertex3f(-0.5f, -0.5f, 0.0f);

    glVertex3f(0.5f, -0.5f, 0.0f);

    glVetex3f(0.5, 0.5, 0.0);

    glVertex3f(-0.5, 0.5, 0.0);

    glEnd();

 4.마자막 정리

    glFlush();

}

 5.main program

int main() {

    glutCreateWindow("OpenGL Drawing Example");

    glutDisplayFunc(MyDisplay);

    glutMainLoop();

    return 0;

}

 

5. main에서 GLUT에게 새로운 window를 만들어라는 명령 -- glutCreateWindow

   그다음 dispay 를 하려면 MyDisplay를 불러라는 callback 함수를 등록하고

   그다음 message loop를 돌아라.

1.선언에서 OpenGL을 이용하겠다는 선언이며

2. 시작에서 만들어진 window를 clear 시키고 -- glClear

3. 본문에서 begin - end 에 의해 백색 사각형을 정의하고 있다. begin에서 폴리곤(다각형)을 정의한다는 것을 말하고 있다. 여기서 다각형은 glVertex 에 의해 정의된다. 좌표는 화면의 중앙이(0.0,0.0, 0.0) 이고 우상단이 (1.0, 1.0, 0.0)이다. -- 기본 윈도우/삼각법에 의한 좌표다.

4. 마지막 정리에서 gl command는 주는데로 동작하지 않고 일정 분량을 모아서 한꺼번에 파이프라인 프로세서에게 전달하는데, glFlush()는 강제로 전달하라는 명령이다.

 

콜백 함수는 다양한 event에 의해 호출된다. 이들에 대한 콜백함수를 미리 등록해놓고 glutMainLoop()를 수행하면 된다.

event = DISPLAY, MOUSE, KEYBOARD, RESHAPE, IDLE, MENU, Timer, ..

 

11. GL에서의 좌표

모델좌표 -> 전역좌표 -> 시점좌표 -> 절단좌표 -> 정규좌표 -> 화면좌표

여기서 GLUT의 원도우 기능에서 정규좌표와 화면좌표를 사용ㅎㄴ다.

 

정규 좌표

3차원에서 2차원으로 projection을 해야 하는데 정규좌표로 변환되면서 발생된다. 이의 좌표는 화면의 가운데를 (0,0)으로 보고 수학에서 1~4분면으로 나눌때와 같은 방식으로 오른편 상단 모서리를 (1.0, 1.0)으로 여긴다. 다시말해 한 화면의 크기를 가로 2.0, 세로 2.0으로 mapping시킨다.

 

화면 좌표

이는 장치좌표계 또는 윈도우 촤표계라고도 불리움. 좌상단을 (0,0)으로 하고 우하단의 좌표가 화면크기와 동일한 좌표를 갖는다. (예 (1280, 1024)). 화면좌표의 X = 화면폭 * (정규좌표 + 1.0)*0.5 로 계산을 한다. 절단좌표계에서 화면좌표계로 바로 계산을 할수도 있으나 (정규좌표 + 1.0)*0.5 의 부분이 계산이 된후 우리가 원하는 화면 해상도만 곱해주면 화면좌표가 나오니 정규좌표계를 사용하는 이유다.

 

View Port

원도우내에서 정의한 작은 화면을 이미한다.

glViewport(x1, y1, width, height); == window 내부의 view port 크기 지정

 

glutInitDisplayMode(GLUT_RGB); == display mode (PGB)

glutInitWindowSize(300, 300); == view port의 화면 크기

glutInitWindowPosition(0, 0); == view port의 화면 위치

 

glutCreateWindow("OpenGL sample"); == view port window의 title

glClearColor(0.0, 0.0, 0.0, 1.0); == 전체에 미치는 초기화값으로 (0,0,0) = 흑색이며, alpha 값이 1 = 100% 이므로 완전불투명으로 처리하라는 의미

 

glClear(GL_COLOR_BIT); == 이는 위 glClearColor에서 지정한 색으로 clear를 수행하라는 내용임.

GLUT가 사용하는 좌표계는 화면좌표계를 사용하지만, GL 내부에서 사용하는 좌표계는 좌하단을 원점으로 하는 (정규좌표의 1사분면) 좌표계를 사용한다. -- 좌표계가 같으면 수학이나 도형에 나오는 계념을 쉽게 GL에 접목시킬수 있다.

 

위으 경우 윈도우 크기와 view port의 크기가 같으므로, view port가 window 전체 면적을 다사용하는 경우이다. view port의 폭과 높이를 전체 window 화면의 폭과 높이의 비율을 낮추어야 한다. (aspect ratio)

 

GLUT 모델링

GLUT는 사전에 만들어진 물체를 제공한다.

정육면체(cube), 원구(Sphere), 원환체(Torus), 원뿔(Cone), 정사면체(Tetrahedron), 정팔면체(Octahedron), 정12면체(Dodecahedron), 정이십면체(lcosahedron), 차주전자(Teapot) 등이다.

void glutSolidCube(GLdouble size); -- 겉면이 칠해져 있는 형태

void glutWireCube(GLdouble size); -- 물체 뼈대만 선으로 표시한 형태

 

void glutSoild[이름]

void glutWire[이름]

 

원구는 radius, slices, stacks 3개의 parameter가 있고

원환체는 innerRadius, outRadius, nsides, rings 의 4개 parameter 가 있다.

원불면 HEIGHT, SLICES, STACKS 3개

정사면체/정20면체는 0 파라메터

차 주전지

void glSoldidTeaport(GLdoucle size);

 

 

 

12. 현재 PC/Handphone에서 OpenGL을 test로 돌려볼려면?

 

이상.

반응형


관련글 더보기

댓글 영역