280 likes | 852 Views
4. OpenGL 상태들과 기본 도형들. Index. OpenGL 상태 함수 glGet() , glIsEnabled() 기본 도형 다루기 glBegin() , glEnd() 점 ( 찍기 , 크기 변경 ,antialiasing) 선 ( 긋기 , 굵기 변경 , antialiasing, 패턴 ) 삼각형 ( 그리기 ,triangle strip) 사각형 ( 그리기 ,quad strip) 다각형 ( 그리기 , 면 제거 , 변 숨기기 , antialiasing, 패턴 ) 기본 도형 예제 소스 분석 실행.
E N D
Index • OpenGL 상태 함수 • glGet() , glIsEnabled() • 기본 도형 다루기 • glBegin() , glEnd() • 점 (찍기,크기 변경,antialiasing) • 선 (긋기,굵기 변경, antialiasing,패턴) • 삼각형(그리기,triangle strip) • 사각형(그리기,quad strip) • 다각형(그리기,면 제거,변 숨기기, antialiasing,패턴) • 기본 도형 예제 • 소스 분석 • 실행
조회하고자 하는 상태를 지정 4-1. OpenGL 상태 함수들(1/2) • OpenGL 상태 기계 • 상태기계 (state machine) • OpenGl에게 무엇을 할 것인지를 알려주는 상태들과 그것들을 관리하는 것 • OpenGL 상태 함수들 • glGet() • 상태 기계들의 현재 상태를 조회하는 함수
4-1. OpenGL 상태 함수들(2/2) • glGet() (계속) • 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 • glBegin()/glEnd() 쌍은 중첩되어서는 안됨 바른 사용 예 glBegin(GL_POINTS); …… glVertex3f(0.0,0.0,0.0); …… glBegin(GL_LINES); …… glEnd(); glEnd(); glBegin(GL_POINTS); …… glVertex3f(0.0,0.0,0.0); …… glEnd(); glBegin(GL_POINTS); …… 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에 점을 하나 찍는 예제 glVertex glBegin(GL_POINTS); glVertex3f(0.0,0.0,0.0); glVertex3f(0.0,1.0,0.0); glEnd();
4-3. 3차원 공간 안에 점 찍기(2/3) • 점 크기 변경 • 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이 지원되는 크기 얻기 ① 점 크기의 최대/최소값을 얻는다. ② 인접한 지원 크기들 사이의 차이을 얻는다. 인접한 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);
3차원 공간에 선분 긋기 glBegin(GL_LINES); glVertex3f(-2.0,-1.0,0.0); glVertex3f(3.0,1.0,0.0); glEnd(); 4-4. 3차원 공간에서 선 긋기 (1/2) • 선 긋기 • 선분의 양 끝을 지정하는 작업 • 지정된 정점의 수는 짝수여야 함 • 선의 Antialiasing • Antialiasing On/Off • On : glEnable(GL_LINE_SMOOTH); • Off : glDisable(GL_LINE_SMOOTH); • Antialiasing 확인 작업 • glGet() 을 GL_LINE_SMOOTH로 호출 • glIsEnable(GL_LINE_SMOOTH)
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
다각형 그리기(전면) 다각형 그리기(전면) 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) • 다각형의 변 숨기기 • 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
4-6. 기본 도형 예제 (6/10) • GL_TRIANGLE,GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN
4-6. 기본 도형 예제 (7/10) • GL_QUAD
4-6. 기본 도형 예제 (8/10) • GL_POLYGON
4-6. 기본 도형 예제 (9/10) • Toggle Antialiasing
GL_POINT GL_LINE GL_FILL 4-6. 기본 도형 예제 (10/10) • Toggle Stippling , Rotate polygon mode