4. OpenGL 상태들과 기본 도형들
Index OpenGL 상태 함수 기본 도형 다루기 기본 도형 예제 glGet() , glIsEnabled() glBegin() , glEnd() 점 (찍기,크기 변경,antialiasing) 선 (긋기,굵기 변경, antialiasing,패턴) 삼각형(그리기,triangle strip) 사각형(그리기,quad strip) 다각형(그리기,면 제거,변 숨기기, antialiasing,패턴) 기본 도형 예제 소스 분석 실행
4-1. OpenGL 상태 함수들(1/2) OpenGL 상태 기계 OpenGL 상태 함수들 상태기계 (state machine) OpenGl에게 무엇을 할 것인지를 알려주는 상태들과 그것들을 관리하는 것 OpenGL 상태 함수들 glGet() 상태 기계들의 현재 상태를 조회하는 함수 조회하고자 하는 상태를 지정
4-1. OpenGL 상태 함수들(2/2) glGet() (계속) glIsEnabled() Example of pname Error Codes glIsEnabled() OpenGL 기능의 활성화를 알아보고자 할 때 쓰이는 함수 GL_TRUE : 기능이 활성화 된 경우 GL_FALSE : 기능이 활성화 되지 않은 경우
4-2. 기본 도형 다루기 (1/3) OpenGL에서의 기본 도형 OpenGl 함수 점,선,삼각형 등의 기하학적인 객체 glBegin() , glEnd() glBegin() mode의 도형을 그리겠다는 선언 glEnd() glBegin()이 지정한 기본 도형의 랜더링을 마치겠다는 뜻 기본 도형의 종류를 입력
4-2. 기본 도형 다루기 (2/3) glBegin() , glEnd() (계속) Example of mode value 상수 설명 GL_POINTS 개별적인 점들 GL_LINES 연결되지 않은 선분들 GL_TRIANGLES 개별적인 삼각형들 GL_QUADS 개별적인 사각형들 GL_POLYGON 임의의 개수의 꼭지점을 가진 다각형 바른 사용 예 바른 사용 예 바르지 못한 사용 예 glBegin(GL_POINTS); …… glVertex3f(0.0,0.0,0.0); glEnd(); glBegin(GL_POINTS); …… glVertex3f(0.0,0.0,0.0); glBegin(GL_LINES); glEnd();
4-2. 기본 도형 다루기 (3/3) 기본 도형을 그리는 순서 ① glBegin(Glenum mode) 를 이용하여 어떤 도형을 그릴지 OpenGL에게 알려준다. ② glVertex() 등의 함수를 이용하여 점을 찍거나 선을 긋는다. ③ glEnd() 로 기본 도형의 랜더링을 끝낸다. 3차원 공간에 점을 찍는 소스 glBegin(GL_POINTS); for (int n = 0; n < 40; n++) { glColor3ub(rand() % 256, rand() % 256, rand() % 256); glVertex2i(rand() % g_width, rand() % g_height); } glEnd();
4-3. 3차원 공간 안에 점 찍기(1/3) 정점을 지정하는 함수 glVertex() 3차원 공간 상의 한 점을 지정 지정된 점은 glBegin(GLenum mode)에서 지정된 기본 도형의 종류에 따라 적절히 해석되어 표현 형식 : void glVertex[2,3,4] [d,f,I,s] [v] (…); [2,3,4] : 점의 차원 [d,f,I,s] : 데이터의 형식 [v] : 인자를 벡터로 전달 3차원 상의 0.0,0.0,0.0 과 0.0,1.0,0.0에 점을 하나 찍는 예제 GL_POINTS 로 지정되었으므로 각각의 점이 개별적으로 취급된다. glVertex glBegin(GL_POINTS); glVertex3f(0.0,0.0,0.0); glVertex3f(0.0,1.0,0.0); glEnd();
4-3. 3차원 공간 안에 점 찍기(2/3) 점 크기 변경 점의 Antialiasing void glPointSize(Glfloat size); 기본 크기는 1.0 현재의 점 크기는 GL_POINT_SIZE로 glGet()을 호출하여 확인 가능 점의 Antialiasing 공식적으로 점의 크기가 1.0인 것 만 가능 GL_POINT_SMOOTH를 인자로 하여 glEnable()호출 Antialiasing 확인 방법 GL_POINT_SMOOTH로 glGet()을 호출 glIsEnable(GL_POINT_SMOOTH)
4-3. 3차원 공간 안에 점 찍기(3/3) 점의 Antialiasing (계속) Antialiasing이 지원되는 크기 얻기 ① 점 크기의 최대/최소값을 얻는다. ② 인접한 지원 크기들 사이의 차이을 얻는다. 얻은 크기는 minPointSize , minPointSize+granularity , …. , maxPointSize 의 순이다. 인접한 antialiasing 크기 얻기 Glfloat sizes[2]; Glfloat granularity; glGetFloatv(GL_POINT_SIZE_RANGE,sizes); Glfloat minPointSize = sizes[0]; Glfloat maxPointSize = sizes[0]; glGetFloatv(GL_POINT_SIZE_GRANULARITY,&granularity);
4-4. 3차원 공간에서 선 긋기 (1/2) 선 긋기 선의 Antialiasing 선분의 양 끝을 지정하는 작업 지정된 정점의 수는 짝수여야 함 선의 Antialiasing Antialiasing On/Off On : glEnable(GL_LINE_SMOOTH); Off : glDisable(GL_LINE_SMOOTH); Antialiasing 확인 작업 glGet() 을 GL_LINE_SMOOTH로 호출 glIsEnable(GL_LINE_SMOOTH) 3차원 공간에 선분 긋기 glBegin(GL_LINES); glVertex3f(-2.0,-1.0,0.0); glVertex3f(3.0,1.0,0.0); glEnd(); glGetBooleanv(GL_LINE_SMOOTH, GLboolean *params )
4-4. 3차원 공간에서 선 긋기 (2/2) 점선 패턴 지정 점선 패턴 사용방법 선의 일부분이 그려지거나 그려지지 않게 하는 마스크 점선(dash line)같은 효과를 얻을 수 있음 사용방법 패턴 기능 켜기 glEnable(GL_LINE_STIPPLE) glLineStipple(GLint factor,GLushort pattern) – 패턴 지정 factor : 패턴의 각 비트가 반복되는 회수(range:1~256,default:1) Pattern : 16bit 비트맵 패턴
4-5. 3차원 공간에 다각형 그리기(1/6) 다각형의 기본 (삼각형,사각형,다각형) 다각형을 그리는 방법 여러 개의 점을 생성 각 점들이 특정한 영역을 생성 영역에 색을 칠함 다각형을 그리는 방법 void glPolygonMode(GLenum face, GLenum mode); face : 다각형의 전면과 후면을 구별 전면 : GL_FRONT 후면 : GL_BACK 양면 : GL_FRONT_AND_BACK mode 값 의 미 GL_POINT 각 정점이 개별적인 점으로 그려짐(glBegin(GL_POINTS)와 동일) GL_LINE 다각형의 각 변들이 선으로 그려짐 GL_FILL 다각형의 내부를 현재의 색으로 칠한다.
4-5. 3차원 공간에 다각형 그리기(2/6) 다각형의 면 제거(face culling) glEnable(GL_CULL_FACE) void glCullFace(Glenum mode); mode : GL_FRONT,GL_BACK,GL_FRONT_AND_BACK 다각형의 면 구분 polygon winding(감는 방법) 전면 : 반시계 방향 후면 : 시계 방향 void glFrontFace(Glenum mode); mode : GL_CCW(반시계 방향이 전면) , GL_CW(시계 방향이 전면) 다각형 그리기(전면) 다각형 그리기(전면) D A D A glBegin(GL_POLYGON); glVertex3f(A); glVertex3f(D); glVertex3f(C); glVertex3f(B); glEnd(); glBegin(GL_POLYGON); glVertex3f(A); glVertex3f(B); glVertex3f(C); glVertex3f(D); glEnd(); 전면 후면 C B C B
4-5. 3차원 공간에 다각형 그리기(3/6) 다각형의 변 숨기기 다각형의 Antialiasing glEdgeFlag() void glEdgeFlag(Glboolean isEdge); void glEdgeFlag(const Glboolean *isEdge); GL_TRUE : 변이 그려진다. (default) GL_FALSE : 변이 그려지지 않는다. 다각형의 Antialiasing glEnable(GL_POLYGON_SMOOTH) Default : Antialiasing 미적용
4-5. 3차원 공간에 다각형 그리기(4/6) 다각형 패턴 설정 다각형을 일정한 무늬로 채우도록 하는 것 glEnable(GL_POLYGON_STIPPLE) void glPolygonStipple(const Glubyte *mask); mask 인자는 비트맵 패턴을 담고 있는 32*32 크기의 바이트 배열에 대한 포인터 2차원에만 적용가능 다각형을 회전 시킬 경우 패턴은 회전하지 않음
4-5. 3차원 공간에 다각형 그리기(5/6) 삼각형 세 개의 꼭지점을 지정하여 생성 순서대로 세 개씩의 정점들을 하나의 삼각형으로 그림 여분의 정점은 무시 됨 Triangle strip (삼각형 띠) glBegin(GL_TRIANGLE_STRIP) 첫 번째 삼각형 : A,B,C 정점으로 삼각형을 그림 두 번째 삼각형 : 마지막 두 정점 B,C와 새로운 정점 D로 그림 Triangle fan (삼각형 부채) glBegin(GL_TRIANGLE_FAN) , 하나의 꼭지점 공유 다각형 그리기(전면) glBegin(GL_TRIANGLES); glVertex3f(-2.0,-1.0,0.0); glVertex3f(3.0,1.0,0.0); glVertex3f(0.0,3.0,0.0); glEnd();
4-5. 3차원 공간에 다각형 그리기(6/6) 사각형 다각형 glBegin(GL_QUADS) 사각형 띠 GL_QUAD_STRIP 다각형 glBegin(GL_POLYGON) glBegin()/glEnd() 쌍 안에서 하나의 다각형 만 그릴 수 있음
4-6. 기본 도형 예제 (1/10) Main Message Loop
4-6. 기본 도형 예제 (2/10) WndProc – Window message handler
4-6. 기본 도형 예제 (3/10) 윈도우 생성
4-6. 기본 도형 예제 (4/10) Wgl함수의 사용(DC&RC 생성 및 제거)
4-6. 기본 도형 예제 (5/10) GL_POINT , GL_LINE glColor3ub => 3은 red,green,blue u는 unsigned b는 byte
4-6. 기본 도형 예제 (6/10) GL_TRIANGLE,GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN 9개 정점 => 삼각형 7개 14개의 정점 => 삼각형 12개
4-6. 기본 도형 예제 (7/10) GL_QUAD
4-6. 기본 도형 예제 (8/10) GL_POLYGON 8각형
4-6. 기본 도형 예제 (9/10) Toggle Antialiasing
4-6. 기본 도형 예제 (10/10) Toggle Stippling , Rotate polygon mode GL_POINT GL_LINE GL_FILL