3D Web Developer/computer_graphics

[ 컴퓨터 그래픽스 ] Open GL의 개념을 정리해보기.

안다미로 : 담은 것이 그릇에 넘치도록 많게. 2024. 10. 15. 17:20

 

 

 

[ 컴퓨터 그래픽스 ] Open GL의 개념을 정리해보기.

 


∇ Open GL의 개념 정리.

 

목 차

1. OpenGL이란?
2. OpenGL의 장단점.
3. Legacy OpenGl vs Mordern OpenGL
4. OpenGL의 세부 개념들.

 

 


 

   1. Open GL이란?


 

       √ Open GL.

               - OpenGL이란,  "Open Graphics Library"로 Graphics 프로그래밍을 위한 API입니다.

                    ( 이름과 다르게, Library가 아닌 API )

 

              - OS는 OpenGL 인터페이스를 제공하고, GPU는 OpenGL implementation인 그래픽 카드 드라이버를 제공합니다.

                 예를 들어, 윈도우 운영 체제에서는 opengl32.dll을 제공하고, GPU는 Nvidia driver 등을 제공합니다.

 

 

             √ 참고 : Library vs API 의 차이점 비교.

                   

                        ∵ Library.

                                - Collection of functions, pre-copiled routines or reusable components of code

                                        = > 코드 그 자체를 모아 놓은 것.

                                - 코드의 반복을 줄이고 재사용을 할 수 있도록 합니다.

                                - 프로그래밍 속도를 단축시킬 수 있습니다.

   

                        ∵ API [ Application Programming Interface ].

                                - Collection of software protocols

                                        = > 인터페이스를 모아 놓은 것.

                                - 라이브러리들로 구성되어 만들어졌을 수도 있습니다.

                                - a set of tools and protocols prescribed by a computer operating system

                                  or another app by which a developer writing a program can make request

 

 


   2. Open GL의 장단점.


 

      ∇ 장점.

                - 크로스 플랫폼 활용 : Windows, OS X, Linux, ios, Android 등 플랫폼에 구애받지 않고 OpenGL를 사용 가능.

                - Language Independent : C, Python, Java, JavaScript 등 많은 언어에서 활용 가능합니다.

 

 

      ∇ 단점.

                - Only Drawing things.

                      - Low-level drawing operation에서 강력한 기능을 보입니다.

                      - Creating windows, OpenGL contexts, handling events 등을 처리할 수 없습니다.

 

                - 다른 기능을 수행하기 위해 다른 utility library가 필요합니다.

                      -  GLFW, FreeGLUT : OpenGL을 위한 Utility Library

                      -  Fltk, wxWidgets, Qt, Gtk

                                - 범용적인 GUI framework

                                - 강력하지만 OpenGL을 학습하기 위해서는 무거운 면이 있습니다.

 

 


   3. Legacy OpenGL vs Mordern OpenGL


   

 

  ∇ Legacy OpenGl

 

                      -  Fixed-function hardware만 사용할 수 있을 때 개발되었습니다.

                      -  Shader를 사용할 수 없습니다.

                                - Shader: 소프트웨어 명령의 집합으로 주로 그래픽 하드웨어의 렌더링 효과를 계산하는데 쓰입니다.

                      -  배우기에 쉽고 빠른 프로토타입의 개발에 적합하지만 OpenGL 3.0 이후로는 업데이트 X.

                                - 전망이 어둡다, 점점 없어질 전망.

 

 

  ∇ Mordern OpenGL

 

                      -  현재의 하드웨어 수준에서 개발이 되었습니다.

                      -  Shader를 사용할 수 있습니다.

                      -  더 유연하고 강력하지만 프로그래밍이 Legacy OpenGL에 비해서는 어렵습니다.

 

 


   4. OpenGL의 세부 개념들


 

         4 -1. 정점( Vertext )

                   - 좌표이며 색상정보를 가지고 있습니다.

                   - 2D는 x,y   /  3D는 x,y,z로 표시되며 

                       색상은 RGBA(red, green, blue, alpha) 로 표시됩니다.

 

 

         4 -2. 폴리곤 ( Polygon )

                    - 정점을 연결해서 만든 면( ex. 3개를 연결하면 삼각형 )

                             

                    - 폴리곤 매쉬(Polygon Mesh)

                              - 폴리곤이 모여있는 집합. 흔히 Mesh라 불림.

 

 

         4 -3. 쉐이더( Shader )

 

                    - 정점을 바탕으로 화면을 그려주는 프로그램 코드.

                    - 정점 쉐이더(Vertex Shader)와 프레그먼트 쉐이더(Fragement Shader)가 있습니다.

 

                           - 정점 쉐이더(Vertex Shader)

                                 - 정점의 최종 위치를 계산하는 역할

                                 - 정점마다 한 번 씩 실행되며 정점이 모여 점,선,면을 이루게 됩니다.

 

 

                           - 프레그먼트 쉐이더(Fragment Shader)

                                 - 정점 쉐이더로 생성된 점, 선, 면(삼각형)의 최종 색상을 계산.

                                      각 프레그먼트마다 한 번 실행됩니다.

 

 

         

         4 -4. 래스터화(Rasterization)

                   - 정점 쉐이더를 통해 변환된 데이터를 프레그먼트 쉐이더에서 처리할 수 있도록 

                        데이터를 변환해주는 작업.

                   - 정점 쉐이더로 만들어진 면은 래스터화를 거쳐 프레그먼트 쉐이더에서 색상이 생성.

 

 

 

         4 -5. 텍스쳐(Texture)

                   - 화면에 그려질 이미지 데이터, 쉐이더를 거쳐 화면에 그려집니다.

 

 

     

         4 -6. 렌더링 파이프라인(Rendering Pipeline)

                   - 데이터가 정점에서부터 시작되어 면이 되고, 색상이 입혀져 화면에 그려지기 까지의 처리과정.

       

                           

 

         4 -7. 벡터 ( Vector )

 

                        하나의 정점은 하나의 벡터로 표현 될 수 있으며 방향이나 크기를 나타낼 수 있습니다.

                                   - 방향 : 원점에서 벡터(50,50,0)까지의 방향

                                   - 거리 : 원점에서 벡터(50,50,0) 까지의 거리.

 

                         OpenGL에서 vec3는 부동소수점(x,y,z)를 의미하고

                                               vec4는 부동소수점(x,y,z,w)를 의미함.

                                               여기서 w는 동차좌표로 나타내기 위해 사용합니다.

 

 

                                       √ 동차좌표 ( Homogeneous Coordinates )

                                              - 벡터(x,y,z)는 위치를 뜻하기도 하지만, 방향을 뜻하기도 합니다.

                                              - 위치값인지 방향값인지 구별하기 위해 생겨난 것이 w가 있는 동차좌표입니다.

     

                               

                         

  • w=1 이면, (x,y,z,1)는 공간상에서의 위치.
  • w=0 이면, (x,y,z,0)는 방향.
  • 표현 시 w값이 1인 이유는 x, y, z 값이 나중에 w로 나뉘게 되는데 해당 값이 1이어야 값이 변하지 않기 때문.
  • 동차좌표는 벡터(x, y, z)를 4x4 매트릭스와 곱하기 위해 요소를 늘려주는 용도로도 사용함.

 

         4 -8. 매트릭스(Matrix)

          

                  - 3차원 이미지를 2차원 평면에 그려내기 위해 사용되는 행렬입니다.

                  - OpenGL은 4*4 정방행렬을 주로 사용합니다.

 

                      오브젝트를 인터렉션하게 움직이게 하기 위해선 정점(Vertex)을 수정하고 버퍼를 재구성 해야합니다.

                        이를 위해 사용되는 것이 매트릭스입니다.

                       매트릭스를 벡터와 곱하게 되면 새로운 벡터값을 만들 수 있습니다( 곱하는 순서가 중요!)

 

                        

                     √ 단위 행렬 ( Identity Matrix)

 

                         임의의 벡터를 행렬과 곱해도 벡터가 변하지 않는 행렬을 단위행렬이라고 합니다.

                           벡터(x,y,z,w)를 매트릭스와 곱해도 여전히 (x,y,z,w,)이므로 위 행렬은 단위 행렬.

 

 

                     √ 평행이동 행렬(Translation Matrix)

                             정점을 어느 방향으로 이동 시킬 수 있는 행렬.

                       위 행렬은 x,y,z 값을 입력하면 해당 값만큼 x,y,z 축으로 이동시킬 수 있습니다.

                            위 예시의 경우 정점(10,10,10)을 x 방향으로 10만큼 이동시킨 결과.

 

 

 

 

                     √ 확대/축소 행렬(Scaling Matrix)

                 

                          벡터값을 확대/축소 시킬 수 있는 행렬.

                           위 행렬의 x,y,z 값에 값을 넣으면 해당 값 만큼 x,y,z 축으로 확대/축소 시킬 수 있습니다.

 

 

                     √ 회전 매트릭스 ( Rotation Matrix )

 

                       -  벡터 값을 삼각함수를 통해 한 축을 기준으로 회전시킬 수 있는 행렬.

                       - 한 축을 기준으로 어느 각(쎄타)만큼 이동시킬 때 아래와 같은 매트릭스가 사용됩니다.

 

                        오브젝트를 x,y,z 축으로 모두 회전 시킬 때, 

                          위에서 구한 행렬 값을 순서대로 곱하면 됩니다 ( 오일러 값)  - 순서 매우 중요.

 

                          x,y,z,축은  서로 종속적이기 때문에 한 축이 회전할 때 다른 축에도 영향을 줍니다.

                           곱하는 순서에 따라서 최종 방위가 달라지기 때문에 순서를 지켜야 합니다.

 

                          일반적으로 ZXY(Roll - Pitch - Yaw) 또는 XYZ 회전이 주로 사용됩니다.

 

 

         4 -9. MVP 매트릭스( MVP Matrix)

 

            3D 공간에서 오브젝트를 표현하기 위한 매트릭스, Model - View -  Projection의 약자.

 

 

                  √ Model

                        - 그리고자 하는 대상인 물체, 위 사진상의 구체들.

 

                  √ View

                        - Model을 바라보는 시점 ( = 카메라 )

 

                  √ Projection

                        - 카메라가 모델을 볼 수 있는 화각, 카메라에서 뻗어나가는 사각뿔 모양의 절두체가 Projection임

                                프로젝션은 2가지.

 

                                   - Perspective Projection

                                       : 원근법을 적용하여 모델을 표현, 사람의 눈으로 보는 것과 동일,

                                   - Orthograpic Projection

                                       : 프로젝션 안의 모든 모델들을 원근감 없이 표현,

                                           왜곡이 없기 때문에 압축해서 보여주는 느김이 듬.

 

 

 

         4 -10.  MVP 매트릭스 사용 예시.

 

 

               OpenGL은 가로가 넓은 스크린 비율에 매핑시 우측 사진처럼 왜곡이 발생하게 됩니다.

                      MVP 매트릭스를 통해 이 왜곡을 교정 할 수 있습니다.

 

10.1. Model
삼각형이 원점에 위치하므로 Model을 움직일 필요가 없음 > 단위행렬 지정.

10.2. View
카메라도 원점에 있으면 삼각형을 보기 힘드므로 z 축으로 일정거리 멀어져야 함.

 

 

10.3. Projection
선택사항이나 일반적인 Perspective로 지정.

 

10.4. MVP 적용

  • 10.4.1. MVP 계산
    mvp = p v m (곱하는 순서 중요함)
    Matrix.multiplyMM(vpMatrix, 0, projectionMatrix, 0, viewMatrix, 0);

 

  • 10.4.2. 정점쉐이더에 적용