본문 바로가기

Programming/OpenGL

OpenGL primitives_1

일단, Primitives 가 뭔지 알아야 겠죠? :-D 사전적인 의미는 찾아보시면 아시겠지만, (물건 따위가 덜 발달하고 불편하여) 원시적인 (참조 : 네이버 사전ㅋ) 이란 의미를 가지고 있어요. 서적에서 얘기하는 예시는 "덜 사회적인 사람(an unsophisticated person)" (음???????) 이라고 하는데... 뭔 소리인지는 잘 모르겠어요 :-D(외쿸문화란...ㅋ)
   
간단히 얘기하면 가장 근본이 되는 것들 입니다. 우리는 OpenGL을 이용해서 그럴싸한 뭔가를 그리려고 하는 것이잖아요? 그린다의 가장 기본은 뭘까요?
   
점 이겠죠? :-D
   
그 점이 이어진 것이 선 이겠고, 그 선들이 이어진 게 면, 그 면들이 이어지면 부피가 있는 물체가 될 것이고~ 가장 기본적인 것들을 그려주는 겁니다.
   
그 시작과 끝은 아래와 같은 형식으로 만들어 지게 됩니다. 저 중간에 해당하는 Primitive를 형식에 맞게끔 만들어 주면 되겠죠?
   
  • 함수 원형
    void glBegin(GLenum mode);
    void glEnd();   
  • mode의 인자
    /* glBegin params */
    GL_POINTS			// Single points
    GL_LINES			// Non-connected lines
    GL_LINE_STRIP		// Series of connected lines
    GL_LINE_LOOP		// Closed loop of connected lines
    GL_TRIANGLES		// Single triangles
    GL_TRIANGLE_STRIP	// Series of connected triangles
    GL_TRIANGLE_FAN		// Set of triangles containing a common central vertex
    GL_QUADS			// Quadrilaterals
    GL_QUAD_STRIP		// Series of connected quadrilaterals
    GL_POLYGON			// Polygon with an arbitrary number of vertices
  • 사용법
    glBegin(mode);
    	// do something
    glEnd();
위 의 사용법에서 예시를 들어서 아시겠지만, 우리가 코딩을 할 때 {}로 블록을 표시 하잖아요? 마찮가지에요. glBegin()/glEnd()가 블록을 표현 하는 겁니다.

   
구지 저 처럼 들여쓰기를 하지 않아도 상관은 없어요 :-D 전 제가 보기 편하려구요ㅎ 그럼 위에서 주석처리된 do something에서는 정보를 전달해 주어야 겠죠. 그리는 것에 관련된 정보니까 좌표가 될 거에요. 이때는 glVertex..(..)라는 함수를 사용해서 정보를 OpenGL에 넘겨주게 됩니다.
   
원형은 아래와 같아요. [] 내부에 있는 것은 그것들 중 하나가 나와야 한다는 소리입니다. [v]는 포함 될 때가 있고, 아닐 때가 명확히 있기 때문에 있거나 없을 수 도 있지만, 앞의 두개[][]는 내부의 것 중 하나가 포함 되야 해요:-D
void glVertex[2, 3, 4][d, f, i, s][v](..);

   
한꺼번에 적히니까 알아보기 힘드네요. 좀 풀어 볼까요?
void glVertex[2, 3, 4][d, f, i, s][v](..);

void glVertex2d(GLdouble x, GLdouble y);
void glVertex2f(GLfloat x, GLfloat y);
void glVertex2i(GLint x, GLint y);
void glVertex2s(GLshort x, GLshort y);

void glVertex3d(GLdouble x, GLdouble y, GLdouble z);
void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
void glVertex3i(GLint x, GLint y, GLint z);
void glVertex3s(GLshort x, GLshort y, GLshort z);

void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
void glVertex4f(GLfloat x, GLfloat y, GLfalot z, GLfloat w);
void glVertex4i(GLint x, GLint y, GLint z, GLint w);
void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w);

void glVertex2sv(const GLshort *v);
void glVertex2fv(const GLfloat *v);
void glVertex2iv(const GLint *v);
void glVertex2sv(const GLshort *v);
void glVertex3sv(const GLshort *v);
void glVertex3fv(const GLfloat *v);
void glVertex3iv(const GLint *v);
void glVertex3sv(const GLshort *v);
void glVertex4sv(const GLshort *v);
void glVertex4fv(const GLfloat *v);
void glVertex4iv(const GLint *v);

void glVertex4sv(const GLshort *v);

   
구분이 되도록 나누었습니다. 숫자는 차원을 의미 합니다. 그 다음 나오는 것은 타입을 이야기 하는 것이죠. 마지막에 나오는 v는 배열로 인자를 넘길 때 사용하게 됩니다.
   
그럼 몇 가지를 보도록 할게요.
  • Drawing Points in 3D(3차원상에 점 그리기)
    (뭐 직역이 다소 촌스럽긴 해도) 그림의 가장 기본이 되는 점을 그려보도록 하겠습니다.
    glBegin(GL_POINTS);
    	glVertex3f(0.0, 0.0, 0.0);
    glEnd();
    

       
    (휴우...) 다 됐어요 :-D 뭐 일단 표현을 하자면,
    점을 그리자! : GL_POINTS
    좌표는 이거야... : (0.0, 0.0, 0.0)
    점 그리기 끝 : glEnd()
       
    여러 개의 점을 그리고 싶다면, 위의 내용을 여러 번 반복 하면 되겠죠.
    glBegin(GL_POINTS);
    	glVertex3f(0.0, 0.0, 0.0);
    glEnd();
    glBegin(GL_POINTS);
    	glVertex3f(0.0, 1.0, 0.0);
    glEnd();
    

       
    위의 내용은 사실 최악의 코드 랍니다. 점의 경우에는 찍으면 되니까 한번에 표현 해주어도 되어요. 바로 아래 처럼..
    glBegin(GL_POINTS);
    	glVertex3f(0.0, 0.0, 0.0);
    	glVertex3f(0.0, 1.0, 0.0);
    glEnd();
    

       
       
  • Drawing Lines in 3D(3차원상에 선 그리기)
    역시 촌스러운 직역(ㅋㅋ :-D) 선이기 때문에 최소한 "두 개" 이상의 점들의 좌표가 필요 하겠죠? 기본이 되는 코드는 아래와 같습니다.
    glBegin(GL_LINES);
    	glVertex3f(0.5, 0.5, 0.0);
    	glVertex3f(-0.5, -0.5, 0.0);
    glEnd();
    
    결과는 아래와 같이 나오네요.

     

       
       
이번 포스팅은 양이 많아서 두 개로 나누었습니다. :-D
   
참조 : OPENGL GAME PROGRAMMING(Foreword by Mark J.Kilgard)

'Programming > OpenGL' 카테고리의 다른 글

Understanding Coordiante Transformations  (0) 2012.03.13
OpenGL primitives_2  (2) 2011.12.24
OpenGL states  (0) 2011.12.22
Basic OpenGL programming Full-Screen  (0) 2011.12.12
Basic OpenGL programming in Windows_2  (0) 2011.12.01