OpenGL

[OpenGL-2] OpenGL 시작하기

zamezzz 2016. 10. 20. 00:01

안녕하세요.


오늘부터 본격적으로 코드와 함께 OpenGL을 다시 공부하겠습니다.


오늘의 순서는 대략적으로 아래와 같습니다.



2. 1. 렌더를 위한 3가지 접근방법

2. 2. OpenGL Version Setting

2. 3. VBO & VAO




  2.1 렌더를 위한 3가지 접근방법


렌더링을 위해 크게 3가지 접근방법으로 나누어 볼 수 있습니다. 


예제 이미지와 함께 보겠습니다.



위와 같은 이미지를 그리기 위해서는 어떻게 해야 할까요?


저의 기억으로는 3가지 방법으로 나누어 볼 수 있습니다.


1. Immediate mode

2. Retained mode

3. GPU based mode


먼저 Immediate mode는 하나하나 계산해서 정보를 얻자마자 즉시 그리는 방법입니다.


이 방법은 매우 작은 일이 반복되는 경우 매우 비효율적입니다. 특히 계산 정보를 보내는 시간이

오래 걸리는 경우에 가장 비효율적입니다 


다음 Retained mode는 보내는 시간을 단축하기 위해 고안된 방법으로, 모든 정보를 계산 완료 후

한 번에 전달하는 방식입니다. 계산을 다 하고 보내기 때문에, 이전에 같은 이미지가 있더라도

다시 계산해야 한다는 단점이 있습니다.


마지막 GPU based mode는 계산과 디스플레이 기능을 분할하는 방법입니다. GPU에서 계산한 정보를 받아 단순히 디스플레이만 하기 때문에 효율적인 방법입니다. 이미 가지고 있는 정보 또한 활용이 가능하다는 단점이 있습니다.


3가지 경우를 보니... 앞으로 우리가 공부해야 할 것은 세번째 방법이라는 것을 알 수 있습니다.




  2.2 OpenGL Version Setting


opengl 사용을 위해 두 가지 라이브러리가 필요합니다.


freeglut : http://freeglut.sourceforge.net/

glew : http://glew.sourceforge.net/


다운로드 후 환경변수 설정을 해주어야 하는데... 다른 라이브러리 설치 방법과 동일합니다!

(잘 모르시는 분은 ... 환경변수 설정법을 구글링 해주세요 ㅠㅠ)


int main(int argc, char ** argv)

{

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA);  //single , RGB모델 사용

glutInitWindowSize(512,512);  //512, 512 사이즈의 윈도우 창 생성


glutInitContextVersion(4,3);    //opengl 4.3버전

glutInitContextProfile(GLUT_CORE_PROFILE);  //4.3 이상의 최신만 사용


glutCreateWindow("Many Points GPU");


glewExperimental = true;     //오류 예외 처리

glewInit();                      //glew 라이브러리 초기화


glutDisplayFunc(display);    //display 함수에 계산된 값을 디스플레이

glutMainLoop();               //종료시까지 디스플레이를 계속 보여준다


return 0;

}


OpenGL Setting을 위한 main입니다.


주석 참고하셔서 가볍게 이해하시면 될 것입니다. 앞으로의 기본 디폴트 설정 값입니다.


그럼 어떻게 디스플레이가 될까요? 지난 시간의 파이프라인을 기억하시나요 ?


다시 한 번 상기 시키고 다음 단계로 넘어가겠습니다.



먼저 Shader를 생성합니다. 각 Shader는 아래와 같은 역할을 합니다.

Vertex Shader는 화면 상의 x, y 가 어디로 갈 지, 어떤 방식으로 표현할지 결정합니다.

Fragment Shader는 점의 색은 무엇일까? 어떤 방식으로 점을 칠할까를 결정합니다.


이 후, Buffer object를 만들고 데이터를 여기에 적재합니다.

다음으로 데이터의 위치와 Shader의 변수 값을 연결시키고 렌더링을 하면 완성입니다.


  2.3 VBO & VAO


VBO가 무엇이고 VAO가 무엇일까요?


VBO : Vertex Buffer Objects

VAO : Vertex Array Objcets


각 Vertex의 정보는 어떠한 방식으로 보여질지 결정되어 VBO에 저장됩니다. 

(점, 선, 곡선, 면 등등)


그리고 VBO는 VAO에 저장됩니다.


자동차 객체를 그린다고 가정 할게요.


그렇다면 VBO에는 자동차의 작은 객체 하나하나가 저장됩니다.


VBO가 자동차이고 여기에는 바퀴, 문, 핸들 등등의 각 정보가 저장됩니다.

VAO에는 자동차1, 자동차 2, 자동차 3 등등이 저장되겠죠.


어떤 이야기 인지 좀 이해가 되나요?


이렇게 사용하는 이유는 opengl이 객체를 보다 쉽게 관리하기 위해서입니다.


VBO와 VAO를 통해 데이터가 전송이 되는 것입니다. 


이를 통해 버퍼에 데이터가 쓰이고 이를 바탕으로 우리가 보는 화면에 객체가 보이는 원리에요.




이번 시간에는 기본적인 opengl 세팅과 데이터 전송 방식, 그리고 파이프라인 구조에 대해서


알아보았습니다.


다음 시간에는 Cube를 예로 들어 객체에 대해 설명하겠습니다.


그리고 Shader 작성을 위한 언어인 glsl에 대해서도 알아볼게요.


금방 돌아오겠습니다. 감사합니다.

반응형

'OpenGL' 카테고리의 다른 글

[OpenGL-6] Model View Matrix  (2) 2016.11.13
[OpenGL-5] Cube Control Program  (1) 2016.11.02
[OpenGL-4] Callback and Transformation  (0) 2016.10.30
[OpenGL-3] GLSL이란  (0) 2016.10.24
[OpenGL-1] OpenGL이란  (2) 2016.10.13