Chapter 4 – OpenGL 상태들과 기본 도형들

Download Report

Transcript Chapter 4 – OpenGL 상태들과 기본 도형들

hapter 4 – OpenGL 상태들과 기본 도형
4. OpenGL 상태들과 기본 도형들
hapter 4 – OpenGL 상태들과 기본 도형
Index
OpenGL 상태 함수
• glGet() , glIsEnabled()
기본 도형 다루기
•
•
•
•
•
•
glBegin() , glEnd()
점 (찍기,크기 변경,antialiasing)
선 (긋기,굵기 변경, antialiasing,패턴)
삼각형(그리기,triangle strip)
사각형(그리기,quad strip)
다각형(그리기,면 제거,변 숨기기, antialiasing,패턴)
기본 도형 예제
• 소스 분석
• 실행
hapter 4 – OpenGL 상태들과 기본 도형
4-1. OpenGL 상태 함수들(1/2)
OpenGL 상태 기계
• 상태기계 (state machine)
– OpenGl에게 무엇을 할 것인지를 알려주는 상태들과 그것들을 관리
하는 것
OpenGL 상태 함수들
• glGet()
– 상태 기계들의 현재 상태를 조회하는 함수
조회하고자 하는 상태를 지정
hapter 4 – OpenGL 상태들과 기본 도형
4-1. OpenGL 상태 함수들(2/2)
• glGet() (계속)
– Example of pname
– Error Codes
• glIsEnabled()
– OpenGL 기능의 활성화를 알아보고자 할 때 쓰이는 함수
▪ GL_TRUE : 기능이 활성화 된 경우
▪ GL_FALSE : 기능이 활성화 되지 않은 경우
hapter 4 – OpenGL 상태들과 기본 도형
4-2. 기본 도형 다루기 (1/3)
OpenGL에서의 기본 도형
• 점,선,삼각형 등의 기하학적인 객체
OpenGl 함수
• glBegin() , glEnd()
기본 도형의 종류를 입력
– glBegin()
▪ mode의 도형을 그리겠다는 선언
– glEnd()
▪ glBegin()이 지정한 기본 도형의 랜더링을 마치겠다는 뜻
hapter 4 – OpenGL 상태들과 기본 도형
4-2. 기본 도형 다루기 (2/3)
• glBegin() , glEnd() (계속)
– Example of mode value
상수
설명
GL_POINTS
개별적인 점들
GL_LINES
연결되지 않은 선분들
GL_TRIANGLES
개별적인 삼각형들
GL_QUADS
개별적인 사각형들
GL_POLYGON
임의의 개수의 꼭지점을 가진 다각형
– glBegin()/glEnd() 쌍은 중첩되어서는 안됨
바른
바른사용
사용예
예
glBegin(GL_POINTS);
……
glVertex3f(0.0,0.0,0.0);
……
glEnd();
glBegin(GL_POINTS);
……
glEnd();
바르지 못한 사용 예
glBegin(GL_POINTS);
……
glVertex3f(0.0,0.0,0.0);
……
glBegin(GL_LINES);
……
glEnd();
glEnd();
hapter 4 – OpenGL 상태들과 기본 도형
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();
hapter 4 – OpenGL 상태들과 기본 도형
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();
hapter 4 – OpenGL 상태들과 기본 도형
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)
hapter 4 – OpenGL 상태들과 기본 도형
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);
hapter 4 – OpenGL 상태들과 기본 도형
4-4. 3차원 공간에서 선 긋기 (1/2)
선 긋기
• 선분의 양 끝을 지정하는 작업
3차원 공간에 선분 긋기
glBegin(GL_LINES);
glVertex3f(-2.0,-1.0,0.0);
glVertex3f(3.0,1.0,0.0);
glEnd();
• 지정된 정점의 수는 짝수여야 함
선의 Antialiasing
• Antialiasing On/Off
– On : glEnable(GL_LINE_SMOOTH);
– Off : glDisable(GL_LINE_SMOOTH);
• Antialiasing 확인 작업
– glGet() 을 GL_LINE_SMOOTH로 호출
– glIsEnable(GL_LINE_SMOOTH)
hapter 4 – OpenGL 상태들과 기본 도형
4-4. 3차원 공간에서 선 긋기 (2/2)
점선 패턴 지정
• 점선 패턴
– 선의 일부분이 그려지거나 그려지지 않게 하는 마스크
– 점선(dash line)같은 효과를 얻을 수 있음
• 사용방법
– 패턴 기능 켜기
▪ glEnable(GL_LINE_STIPPLE)
– glLineStipple(GLint factor,GLushort pattern) – 패턴 지정
▪ factor : 패턴의 각 비트가 반복되는 회수(range:1~256,default:1)
▪ Pattern : 16bit 비트맵 패턴
hapter 4 – OpenGL 상태들과 기본 도형
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
다각형의 내부를 현재의 색으로 칠한다.
hapter 4 – OpenGL 상태들과 기본 도형
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(시계 방향이 전면)
다각형 그리기(전면)
다각형 그리기(전면)
glBegin(GL_POLYGON);
glVertex3f(A);
glVertex3f(D);
glVertex3f(C);
glVertex3f(B);
glEnd();
D
A
D
전면
C
A
후면
B
C
B
glBegin(GL_POLYGON);
glVertex3f(A);
glVertex3f(B);
glVertex3f(C);
glVertex3f(D);
glEnd();
hapter 4 – OpenGL 상태들과 기본 도형
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 미적용
hapter 4 – OpenGL 상태들과 기본 도형
4-5. 3차원 공간에 다각형 그리기(4/6)
다각형 패턴 설정
• 다각형을 일정한 무늬로 채우도록 하는 것
• glEnable(GL_POLYGON_STIPPLE)
• void glPolygonStipple(const Glubyte *mask);
– mask 인자는 비트맵 패턴을 담고 있는 32*32 크기의 바이
트 배열에 대한 포인터
• 2차원에만 적용가능
• 다각형을 회전 시킬 경우 패턴은 회전하지 않음
hapter 4 – OpenGL 상태들과 기본 도형
4-5. 3차원 공간에 다각형 그리기(5/6)
삼각형
• 세 개의 꼭지점을 지정하여 생성
다각형 그리기(전면)
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();
• 순서대로 세 개씩의 정점들을 하나의 삼각형으로 그림
• 여분의 정점은 무시 됨
• Triangle strip (삼각형 띠)
– glBegin(GL_TRIANGLE_STRIP)
– 첫 번째 삼각형 : A,B,C 정점으로 삼각형을 그림
– 두 번째 삼각형 : 마지막 두 정점 B,C와 새로운 정점 D로 그림
• Triangle fan (삼각형 부채)
– glBegin(GL_TRIANGLE_FAN) , 하나의 꼭지점 공유
hapter 4 – OpenGL 상태들과 기본 도형
4-5. 3차원 공간에 다각형 그리기(6/6)
사각형
• glBegin(GL_QUADS)
• 사각형 띠
– GL_QUAD_STRIP
다각형
• glBegin(GL_POLYGON)
• glBegin()/glEnd() 쌍 안에서 하나의 다각형 만 그릴
수 있음
hapter 4 – OpenGL 상태들과 기본 도형
4-6. 기본 도형 예제 (1/10)
Main Message Loop
hapter 4 – OpenGL 상태들과 기본 도형
4-6. 기본 도형 예제 (2/10)
WndProc – Window message handler
hapter 4 – OpenGL 상태들과 기본 도형
4-6. 기본 도형 예제 (3/10)
윈도우 생성
hapter 4 – OpenGL 상태들과 기본 도형
4-6. 기본 도형 예제 (4/10)
Wgl함수의 사용(DC&RC 생성 및 제거)
hapter 4 – OpenGL 상태들과 기본 도형
4-6. 기본 도형 예제 (5/10)
GL_POINT , GL_LINE
hapter 4 – OpenGL 상태들과 기본 도형
4-6. 기본 도형 예제 (6/10)
GL_TRIANGLE,GL_TRIANGLE_STRIP,
GL_TRIANGLE_FAN
hapter 4 – OpenGL 상태들과 기본 도형
4-6. 기본 도형 예제 (7/10)
GL_QUAD
hapter 4 – OpenGL 상태들과 기본 도형
4-6. 기본 도형 예제 (8/10)
GL_POLYGON
hapter 4 – OpenGL 상태들과 기본 도형
4-6. 기본 도형 예제 (9/10)
Toggle Antialiasing
hapter 4 – OpenGL 상태들과 기본 도형
4-6. 기본 도형 예제 (10/10)
Toggle Stippling , Rotate
polygon mode
GL_POINT
GL_LINE
GL_FILL