Geek's mimic!/OpenGL2018.10.15 13:30


Linux에서 QT Creator를 이용한 OpenGL 프로그래밍에 대해 글을 올릴 예정이다.


한참을 삽질하다가 좋은 강의 영상을 발견하였고, 해당 저작권자에게 허락을 맡았기에 그 영상을 기초로 OpenGL 프로그래밍에 대해 설명할 예정이다.


총 17개의 강의가 준비되어 있기에 해당 내용을 모두 실습해보고 차근차근 올리도록 하겠다.


아래 URL은 제1강의 URL이다. 글이 올라오기전 탐독하고 싶은 독자들을 위해 남겨둔다.


https://www.youtube.com/watch?v=HgoKrrf4iks


I would like to thank Dmitry Tikhonkikh for sharing the lesson.





'Geek's mimic! > OpenGL' 카테고리의 다른 글

QT Creator를 이용한 OpenGL  (0) 2018.10.15
QT - OpenGL ES , QT Widget과 Shader  (0) 2018.10.12
OpenGL ES, Shader  (0) 2018.10.10
Posted by kasaku
Geek's mimic!/OpenGL2018.10.12 23:19

QOpenGLWidget

 QT에서 OpenGL 그래픽을 렌더링하기 위한 위젯 클래스로써 QOpenGLWidget은 OpenGL 작업을 수행하기 위해 클래스에서 다시 구현할 수 있는 세 가지 편리한 가상 함수를 제공합니다( paintGL(), resizeGL(), initializeGL() ).

paintGL 

 - OpenGL 화면을 렌더링해주는 함수이며 위젯이 업데이트될 때마다 호출된다.

  * paintGL 함수 외에 다른 곳에서 렌더링 과정을 수정해야할 경우 update() 함수를 이용하여 paint 함수를 호출해주어야 한다. ( QT widget 의 update 함수를 호출하게 되면 결과적으로 QT의 Widget 클래스를 상속하고 있는 QOpenglWidget의 paintGL 함수가 호출되는 것을 의미 )


resizeGL

 - OpenGL 뷰포트, 프로젝션 드을 설정하며 위제싀 크기를 조정할때마다 호출된다. 또한 위젯의 resize 함수와 같이 처음 실행될때도 호출된다.

initialzeGL

 - OpenGL 리소스와 상태를 설정하는 함수이다. resizeGL 또는 paintGL이 처음 호출되기 전에 단 한번 호출된다.


 QOpenGLWidget의 보다 자세한 설명이 필요하다면 아래 링크를 참고하기 바란다.

 - http://doc.qt.io/qt-5/qopenglwidget.html#details


**(Added 181129)

 개인 프로젝트를 만드는 도중 initializeGL(), paintGL() 이 서로 다른 스레드에 의해 동시호출이 된다는 것을 알게 되었다. ( QT Version 4.x )

 정확하게는 initializeGL()를 먼저 호출하지만, initializeGL() 함수를 수행한흔 도중 paintGL() 함수 내용이 실행되었고 그로 인해 충돌이 일어나는 현상을 겪게 되었다.


Shader

 OpenGL에서 Shader는 아래 그림과 같이 Vertex와 Fragment 두가지 형태로 나뉘어져 있다.

각각의 Shader는 결과물을 저장하기 위한 전역 변수인 gl_Position과 gl_FragColor가 존재한다,


gl_Position

 - Vertex Shader에서 자동으로 선언되는 내장변수로, 뷰포트 위치를 지정하는 변수이다.


gl_FragColor

 - Fragment Shader에서 자동으로 선언되는 내장변수로 GLSL 3.1 이후엔 사라졌다. 픽셀의 결과값을 저장하는 변수이다.


이 외에도 Shader에서 자동으로 선언되는 내장변수들이 있지만 기초 강의에서는 사용될 일이 없기에 차후 언급될때 설명을 붙일 예정이며, 참고자료가 필요한 독자분들은 아래 링크를 참고하시기 바란다

 Vertex Shader - https://www.khronos.org/opengl/wiki/Vertex_Shader

 Fragment Shader - https://www.khronos.org/opengl/wiki/Fragment_Shader


'Geek's mimic! > OpenGL' 카테고리의 다른 글

QT Creator를 이용한 OpenGL  (0) 2018.10.15
QT - OpenGL ES , QT Widget과 Shader  (0) 2018.10.12
OpenGL ES, Shader  (0) 2018.10.10
Posted by kasaku
Geek's mimic!/OpenGL2018.10.10 17:29

OpenGL 에서 Shader란?


Shader?

Shader는 Shade에서 파생된 말로써 Shade는 [U, C] 그늘, 색조, 음영 을 비롯해  (그림 등에) 음영을 넣다 와 같은 뜻을 가지고 있다.


이와 비슷한 의미로 OpenGL에서 Shader는 화면상에 출력할 객체에 대한 픽셀의 위치와 색상 및 질감 등을 계산하는 역할을 의미한다.


Graphics Pipeline과 Vertex Shader, Fragment Shader


OpenGL에서는 Shader에 대해 Vertex Shader와 Fragment Shader로 구분되어지며, Shader에 대해 보다 자세한 설명을 하기 위해서는 아래 GPU Pipeline에 대한 개념을 알고 있어야한다. 


Graphics Pipeline?

그래픽스 파이프라인이란 3D 이미지를 디스플레이하기 위한 과정을 의미한다. OpenGL에서 3D 객체를 디스플레이하기 위해 아래 그림과 같은 과정을 거치며, 그 중 Tessellation은 GL 4.x 부터, Geometry Shader는 GL 3.x 부터 지원하고 있다.


OpenGL Graphics Pipeline 과정 , 출처 #1


이 중에서 Shader에 대한 개념을 잡기 위해서는 아래 그림과 같이 네 과정만 이해해도 충분하다고 생각하기에 이번 글에서는 그 부분에 대해 설명하도록 한다.


간략화한 OpenGL Graphics Pipeline 과정 , 출처 #2


우선 이 글을 보는 독자라면 Vertex라는 말이 생소할 수도 있다고 생각한다. Vertex는 정점, 꼭짓점을 의미하며, 객체를 이루는 꼭짓점의 공간좌표, 객체좌표, 색상 등을 포함하고 있다. ( 여기서는 객체의 꼭짓점이라고만 이해해자 )


Vertex Specification은 꼭짓점에 대한 명세를 하는 부분으로 객체를 이루는 꼭짓점의 갯수만큼 input을 해주는 과정이다. ( Input Assembler에 해당 )


Vertex Shader는 Vertex 정보를 디스플레이하기 위한 과정으로 Vertex Specification 단계에서 작성한 Vertex 집합들을 2D 화면에 맞춰 배치해주는 과정이다. 이 과정에서 3D World Coordinates 를 2D Display Coordinates로 변경해준다. ( 즉, 3D 객체를 2D 화면으로 보일 수 있도록 변경해주는 것이다 )


Rasterization은 입력된 Vertex 집합을 2차원 프래그먼트로 변환하는 것으로, 화면에 그려질 수 있는 픽셀로 변경하는 과정을 의미한다.


마지막으로 Fragment Shader는 래스터변환 단계를 거친 객체에 대해 색 정보 혹은 질감(텍스처) 을 적용해주는 단계이다.


이처럼 OpenGL에서 3D 장면을 구현하기 위한 단계를 보면 Vertex, Shader, Fragment와 같은 단어들이 자주 언급되는 것을 알 수 있듯이 OpenGL 프로그래밍을 할때 이들을 위한 Shader Programming을 해주어야 한다.


Shader Programming은 앞으로 소개될 드미트리씨의 강의를 통해 접해보고 알아나가면 될 것이다.




출처 목록

#1 https://www.khronos.org/opengl/wiki/Rendering_Pipeline_Overview

#2 본인

'Geek's mimic! > OpenGL' 카테고리의 다른 글

QT Creator를 이용한 OpenGL  (0) 2018.10.15
QT - OpenGL ES , QT Widget과 Shader  (0) 2018.10.12
OpenGL ES, Shader  (0) 2018.10.10
Posted by kasaku