일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 회전판
- 공학인증
- 호주 이민
- game engine
- flutter progress dialog
- StatefulWidget
- rotate circle
- first_app
- ABEEK
- Engineer Australia
- BlurDrawable
- first flutter app
- reverse proxy
- OpenGL
- PowerMockup
- c++
- flutter
- HTML 게임 엔진
- nginx
- 맨붕
- StatelessWidget
- ipad
- 블러 효과
- 앱 기획
- 기술인증
- c
- Android
- quintus
- progress
- 플러터
- Today
- Total
우동우동우's note
[OpenGL] Study Note 5 : OpenGL Draw Triangle (삼각형 그리기) 본문
[OpenGL] Study Note 5 : OpenGL Draw Triangle (삼각형 그리기)
우동우동우 2013. 11. 22. 14:51이번 예제는 다음 사이트를 참조하였음을 밝힌다. (http://ogldev.atspace.co.uk/)
위 사이트에서는 리눅스 기반에서 작성한 예제이다. 본인은 이예제를 윈도우에서 다시 컴파일 하여 올린다.
이번 예제를 실행하기 위해서 GLUT와 GLEW가 설치되어있어햐한다. 이는 Study Note 1과 Study Note 4에서 볼 수 있다. 지금 셋팅이 되어 있지 않다면 Study Note 1 부터 시작하시길 바란다.
오늘 해볼 건 삼각형을 그려보는 것이다. Study Note 2, 3 에서도 삼각형을 그렸으나 이번엔 최신 API를 활용해서 그려볼 것이다.
아래 소스를 받자.
압축을 풀면 main.cpp와 math_3d.h 이렇게 2개의 파일만이 있을 것이다. math_3d.h 파일에는 3차원 꼭지점를 나타내는 간단한 구조체 하나가 선언되어 있다. 아마 파일을 보면 바로 이해가 될것으로 생각된다.
main.cpp파일에서 실제 GLEW, GLUT, OpenGL을 사용하여 구현한 소스가 나타나있다. main.cpp에서 사용한 소스의 코드에서 사용한 함수를 보면서 설명을 하겠다.
void glGenBuffers(GLsizei n,GLuint * buffers)
OpenGL에서는 glGen* 형태의 함수들은 두가지 파라미터를 받는데 하나는 개수를 의미하고, 다른 하나는 생성한 객체를 저장할 포인터를 의미한다. glGenBuffers는 버퍼를 생성한다는 말이다. glGen*의 다른 함수는 다음과 같다. 우선 참고용으로 링크를 걸어두었다.
void glBindBuffer(GLenum target,GLuint buffer)
이제 이 함수를 활용해서 buffer에 target을 할당하게 된다. target의 값에는 여러가지 값이 들어갈 수 있다. 즉, buffer의 값에 들어갈 값의 유형을 설정해주는 것으로 생각해도 무방한 것 같다. target에 들어갈 수 있는 값만 종류가 14가지나 된다. 우선 여기서 사용하는 GL_ARRAY_BUFFER의 경우꼭지점 값이 들어간다는 의미이다. 또, glBindBuffer 함수는 바로 다음에 나올 glBufferData()함수에 에서 할당할 데이터를 넣는다는 뜻이 되기도 한다. 다른 타겟은 API 문서를 보면 알 수 있다.
그리고 마지막으로 glBind*함수에 들어올 GLuint * 값들은 glGen* 함수에서 생성된 값들이 들어가게 된다는 걸 알아두자. Bind 되기 전에 glGen*함수로 선언을 먼저 하는 것이다.
void glBufferData( GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage)
void glEnableVertexAttribArray(GLuint index) & void glDisableVertexAttribArray(GLuint index)
저장된 꼭지점(Vertex)을 사용가능하게 하는 것이다. 다른 말도 하게되면 특정 함수들에게 연결을 시키는 것이다. OpenGL Refference를 참조하면 다음의 함수들에서 지정한 값을 사용할 수 있다고한다. index는 꼭지점 데이터 배열의 index 를 의미한다. 그런데 여기서 사용하는 index를 shader라는 것을 사용할 때 부터 중요한 의미를 지닌다. 현 예제에서는 0으로 쓰면된다.
- glDrawArrays
- glDrawElements
- glDrawRangeElements
- glMultiDrawElements
- glMultiDrawArrays.
이 함수는 꼭지점 값을 읽을 때 값을 어떻게 프로그램에서 이해해야하는지 정해주는 함수이다. index는 꼭지점 데이터 배열의 index 를 의미한다. 그런데 여기서 사용하는 index를 shader라는 것을 사용할 때 부터 중요한 의미를 지닌다. 현 예제에서는 0으로 쓰면된다. size는 꼭지점에서 사용하는 파라미터의 개수이다. 여기는 1,2,3,4가 들어갈 수 있다. type은 해당 꼭지점 배열을 읽을 때 읽을 데이터 타입을 지정한다. normalize는 데이터에 대해서 정규화를 할지에 대한 결정을 하는 것이다. 데이터의 범위를 [-1, 1]로 변경을 하는 것이다. 현재는 중요하게 생각하지 않아도 될 것 같다. 그리고 stride와 pointer는 offset을 의미한다. 나중에 사용할 때 자세히 알아보도록 하자.
void glDrawArrays(GLenum mode, GLint first, GLsizei count)
glEnableVertexAttribArray함수에서 지정한 꼭지점 배열을 활용하여 draw한다는 뜻의 함수이다. mode 파라미터는 그려지는 도형에 대해 나타낸다. 우리 예제에서는 GL_TRIANGLES를 사용하였다. 다른 값들도 있으니 API 문서에서 참조하여 필요한 것들을 참조하여 사용하자. first는 배열에서 참조할 시작 index를 의미하여, count는 읽어드릴 개수를 의미한다.
기존의 2.x 버전의 API에서 지원하는 glBegin(), glEnd()형태가 사라져서 많이 복잡해진 듯한 느낌이다. 왜 삭제를 했는지는 모르지만... 이유가 있을 것으로 생각된다. API에 대한 위 설명을 참조하면서 예제 소스를 보면 조금 이해가 될 것으로 생각된다. 그냥 무작정 소스를 보려고 한다면 아마 많이 어렵지 않을까 생각이된다. 일단 사용방법이 조금 어려운 것 같다. 순서는 다음과 같다.
1. glGen* 함수를 통해서 값을 생성하고
2. glBind* 함수를 통해서 변수에 Binding을 하고,
3. glBufferData 함수로 값을 저장하고,
4. Display에 대한 Callback을 받았을 때, glEnableVertexAttibArray() 함수를 통해 사용할 배열을 활성화시키고,
5. glVertexAttribPointer()함수를 통해 값을 어떻게 읽을지에 대해서 파라미터 지정을 하고,
6. 마지막으로 glDrawArray()함수를 통해 그리고 glDisableVertexAttribArray()함수를 통해 배열을 비활성화 시킨다.
'C & C++ > OpenGL Study' 카테고리의 다른 글
[OpenGL] Study Note 4 : GLEW(OpenGL Extension Wrangler Library) 세팅 방법 Win + Visual Studio 2010 (0) | 2013.11.22 |
---|---|
[OpenGL] Study Note 3 : 나의 첫번째 OpenGL App In Window (0) | 2013.11.19 |
[OpenGL] Study Note 2 : 나의 첫번째 OpenGL App In Mac (2) | 2013.11.18 |
[OpenGL] Study Note 1 : 개발 환경 설정 (Window) (0) | 2013.11.18 |