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