'라이브러리'에 해당되는 글 20건

보통 우리의 눈 이나 카메라는 보이는 물체의 모든것을 보지못한다. 그래픽스에서도 마찬가지로 보통 우리가 사용하는 출력 장치는 2D평면 이기 때문에 그리는 물체등의 앞면만 보이거나 다른물체에 가려 아예 안보일수도있다.

1. 후면제거
후면제거란 말그대로 시점에서 보이는 곳을 앞면으로 놓고 보이지 않는곳을 후면으로 놓은후 보이지 않는 후면을 제거하는 방법이다.

OpenGL의 면제거
먼저 glEnable로 GL_CULL_FACE(후면제거)모드를 활성화해야 한다.  그후 glCullFace 함수로 제거할 면을 설정 해주면 된다.
(GL_FRONT 앞면, GL_BACK 후면, GL_FRONT_AND_BACK 앞후면전부);

일반적으로 물체는 우리 눈에 보이는 겉 표면과 반대쪽에 이면으로 이루어져 있다.  OpenGL에서는 다각형을 그릴때 시계방향으로 그렸는지 반시계방향으로 그렸는지에 따라 표면과 이면을 구분한다. 이때 방향을 바꿈으로서 포면과 이면을 바꿀수 있는대 glFrontFace란 함수를 사용 하여 반시계방향(기본값)은 GL_CCW를 시계방향은 GL_CW를 넘겨 주면된다.
그리고 OpenGL은 보통 표면과 이면을 같은 방식으로 그리지만 glPolygonMode함수를 통해 표면과 이면을 다른방식으로 그릴수 있다.

void glPolygonMode(GLenum face, GLenum mode)
face에는 GL_FRONT, GL_BACK, GL_FRONT_AND_BACK 중 하나를 mode에는 GL_POINT, GL_LINE, GL_FILL중 하나를 넘겨준다. 

OpenGL에서는 시야에 의한 절단외에 따로 직접 glClipPlane이라는 함수를 사용 하여 절단면을 설정할 수 있다.

void glClipPlane(GLenum plane, GLdouble* equation)
plane은 절단면의 식별자로 GL_CLIP_PLANE0번부터 5번까지 6개가 있으며 하드웨어에 따라 다를수도 있다.
equation에는 평면방정식의 계수이다. ( 예 : Ax+By+Cz+D = 0 이면 A,B,C,D를 배열에 차례대로 넣고 배열명을 넘겨주면된다.)

2. 은면제거
은면제거는 보이지 않는 면을 제거하기 위한 마지막 작업으로 다른 물체면에 가려서 보이지 않는 면을 제거하는 작업이다. 이 작업은 물체 정점의 깊이 즉, z좌표를 필요로 하기 때문에 2차원 투상 이전에 해야 한다.

 OpenGL에서는 GL_DEPTH_TEST를 활성화 시켜서 깊이버퍼를 활성화 시킬수 있다. 그리고 새로은 프레임을 그릴때는 항상 초기화 해주는 것이 좋다. OpenGL에서는 보통 Z값이 작으면 통과를 시키는대 이 테스트 조건을 glDepthFunc 함수를 통해 바꿀수 있다. 만약 프로그램 실행 도중 깊이버퍼의 쓰기를 금지 하려면 glDepthMask 함수를 호출하여 GL_FALSE는 쓰기 금지 GL_TURE는 쓰기 허용을 할수 있따다.

void glDepthFunc(GLenum func);
func에는 GL_NEVER, GL_LESS, GL_LEQUAL, GL_EQUAL, GL_GREATER, GL_NOTEQUAL, GL_GEQUAL, GL_ALWAYS중 하나를 사용하며 기본 값은 GL_LESS이다.



'라이브러리 > OpenGL' 카테고리의 다른 글

프래그먼트와 GL의 버퍼  (0) 2009.06.12
텍스쳐  (0) 2009.04.03
에일리어싱과 앤티-에일리어싱  (0) 2009.04.03
조명과 음영  (0) 2009.03.24
OpenGL의 투영과 뷰포트 변환  (0) 2009.03.24
OpenGL의 모델변환 및 행렬스택  (0) 2009.03.22
기하 변환  (0) 2009.03.22
3차원 물체의 표현  (0) 2009.03.22
디스플레이 리스트  (0) 2009.03.22
정점배열  (0) 2009.03.22
Posted by crownog
,

조명 : 물체 정점의 색을 부여 하는 작업. 즉 광원과 물체 특성을 감안하여 정점에서의 빛 세기를 계산하는 작업이다.
음영 : 위에서 결정된 정점 색을 기준으로 해당 물체면 내부 곳곳마다 색을 부여 하는 작업이다.

전역 조명모델 : 다른 물체면에서 반사되어 압사되는 빛 까지 고려한 조명 모델로 장면 내의 물체 상호 간의 반사까지 고려한 모델이다.

지역 조명모델 : 전역 모델을 단순화한 것으로 다른 물체에서 반사된 빛은 일체 감안하지 않는다. 즉 물체색을 결정하는데 있어서 광원으로부터 직접 물체에 부딪쳐 우리눈에 들어오는 빛만 고려한다.

면적광원 : 백열등 처럼 물체면 상의 점 P에 도달하는 빛은 전구 표면의 모든 점에서 나온 빛을 감안해야 한다. 이 처럼 면적을 지닌것을 면적 광원이라한다. 그러나 현재의 일반적인 컴퓨터로는 계산량이 너무 많아 구현하기가 힘들다.

점광원 : 이것은 빛이 한 점에서 나온다고 간주하는 것이다.

반사광의 세기는 광원의 위치, 시점의 위치, 물체면이 서 있는 방향 등의 요인에 의해 결정 된다. 이것들을 계산하기 위해서는 점에서 표면에 수직인 법선벡터, 광원을 향하는 광원 벡터, 시점을 향하는 시점벡터가 필요하다.  광원이 물체면에 입사할 떄의 입사각은 광원벡터와 법선벡터가 이루는 각이다.

주변반사(Ambient)는 광원에 직접 노출되지 않는 면에 밝기를 부여하는 것이다. 이 주변 반사에 의해 우리 눈으로 반사되는 빛을 주변광 이라 한다.(예 : 주변 벽을 부딫히고 반사되는 빛)

확산반사(Diffuse)는 물체면과 광원과의 공간적인 관계에 따라 명암을 부여 하는 것이다. 기본적으로 확산반사는 광원에서 나온 빛이 직접 물체면에 부딪쳐 여려향으로 확산되는 난반사에 해당한다. ( 예 : 물체에서 반사할수 있는 빛 )

경면반사(Specular)는 반질반질한 표면에서 반사되는 빛이다. 경면광에 의해 물체면에 형성된 반짝이는 이미지를 하이라이트라한다. 경면반사는 빛의 정반사에 의한 것이다. ( 예 : 광택)

방향광( W = 0)
방향성광원 또는 지향성 광원은 광원에서 나온 빛이 물체면을 향하여 일정한 방향으로 진행하는 광원을 말한다.
( 광원의 색상, 물체의 색상이 필요)

위치광 ( W = 1)
위치성 광원은 옴니라이트 라고도 하며 이 광원은 나가는 빛이 모든 방향으로 방사형으로 펴저나가는 광원을 말한다.
(광원의 색상, 물체의 색상 등)

집중광 ( W = 1)
무대 등에서 보면 한 배우만 비치는 스포트라이트 같은 광을 말한다.
( 공의 방향(방향 벡터), 원뿔의 크기 )

람베르트 법칙
광원벡터와 면의 법선벡터가 이루는 각즉 입사각의 코사인에 정비례하여 밝기가 바뀐다.

음영

1. 플랫 셰이딩
플랫 세이딩은 배우 빠르고 간단한 방법으로 상수 셰이딩 또는 깍은 면 셰이딩 이라고도 한다. 주어진 하나의 다각형 전체를 동일한 색으로 칠한다. 이 방법은 일반적으로 광원이나 시점이 조금 먼거리에 있다고 가정한다.

2. 구로 셰이딩
이것은 다각형 내부를 서로 다른 색으로 보간하여 채우는 방법이다. 그러나 이경우 다각형 내부에는 무한개의 점이 있어서 모든 점에 대해서 조명모델을 가해서 색을 계산한다는 것은 힘들 기 때문에  광원에서 나온 빛이 다각형 정점에 입사한다고 보는 것이다. 이 방법은 하나의 나각형 내에서도 음영을 달리 하기 때문에 부드러운 음영 변화를 보여준다.

3. 퐁 셰이딩
구로 셰이딩이 색을 보간한다면 퐁 셰이딩은 법선벡터를 보간하여 하는 것이다. 그러나 이 경우 모든 법선벡터에 대해 조명등을 전부 다시 계산해야 하므로 구로 셰이딩보다 더 많은 계산을 필요로 하므로 속도가 느려진다. OpenGL에서는 기본적으로 이 퐁 셰이딩을 지원하지 않으며 GLSL에 의해 구현할수 있다.

OpenGl의 조명과 음영
OpenGL에서 조명과 음영을 가하기 위해서는 몇가지 작업이 필요하다.

1. 조명기능 활성화
먼저 glEnable로 조명기능을 활성화 시킨다. 파라미터로 GL_LIGHTING를 넘겨준다.

2. 광원 활성화
그 다음으로는 광원을 활성화 해줘야하는대 OpenGL에서는 기본적으로 0~7번 까지의 8개의 광원을 사용 한다. 1번과 같이 glEnable함수를 사용 하여 GL_LIGHT 뒤에 원하는 조명번호를 넣어 활성화 하면 된다.
현재 자신의 하드웨어가 몇 개의 광원을 지원하는지 알기 위해서는 glGetIntegerv함수에 GL_MAX_LIGHT와 저장할 GLint형 포인터를 넘겨 주면 된다.

3. 광원의 종류및 위치등 설정
마지막으로 사용할 광원의 위치와 광원의 종류등을 설정 해주면 되는대 glLight 함수를 사용 하며 이함수의 마지막 파라미터는 GLfloat형과 GLfloat형배열 GLint형과 GLint형배열 4가지를 지원하며 배열은 끝에 v를 붙여 준다.
void glLight(f,i,fv,iv)( GLenum light, GLenum pname, TYPE Value);
이함수의 첫번째 파라미터인 light는 GL_LIGHT0등 설정할 광원의 아이디이고 두번째에는 위치를 설정할건지 빛을 설정할건지등 설정할 종류이며  마지막 파라미터는 설정할 값이다.

4. 광원의 색
OpenGL의 광원은 주변광, 확산광, 경면광에 대해서 입사광의 크기를 R, G, B, A로 나누어서 정의한다.

 파라미터 명  기본 값  의미 
 GL_POSITION  (0, 0, 1, 0)  광원의 (X,Y,Z,W) W는 0이면 방향광
 1이면 위치광을 뜻한다.
 GL_SPOT_DIRECTION  (0, 0, -1)  스포트라이트의 방향 벡터
 GL_SPOT_CUTOFF  180.0  조명각
 GL_SPOT_EXPONENT  0  코사인 승수
 GL_AMBIENT  (0, 0, 0, 0)  주변반사 광원의 RGBA
 GL_DIFFUSE  (1, 1, 1, 1)  확산반사 광원의 RGBA
 GL_SPECULAR  (1, 1, 1, )  경면반사 광원의 RGBA
 GL_CONSTANT_ATTENUATION  1  상수 계수 (전체적인 밝기 분포)
 GL_LINEAR_ATTENUATION  0  1차 계수  (거리에 따른 밝기)
 GL_QUADRATIC_ATTENUATION  0  2차 계수


음영모드
OpenGL은 플랫 셰이딩과 구로 셰이딩을 지원한다.

1. 먼저 glShadeModel이라는 함수를 사용해 플랫 셰이딩을 할려면 GL_FLAT 구로 셰이딩을 할려면 GL_SMOOTH를 파라미터로 넘겨준다. 기본 값은 GL_SMOOTH이다.

조명에서 반사광의 세기를 계산하기 위해서는 법선벡터가 필수 적이다. 그러나 법선벡터에 관한 OpenGL의 기능은 상당히 제한적이다. 해당 정점의 반사광의 세기를 계산할 뿐 둘러싸인 면이 광원을 향한 면인지 그 안쪽 면인지에 대한 개념이 없다. 그리고 정점의 법선벡터는 반드시 단위 벡터이여야 한다
OpenGL에서는 glNormal3 뒤에 사용할 데이터형을 적은뒤 배열이면 그뒤에 v를 붙여서 호출하면된다. GLbyte, GLdouble, GLfloat, GLint, GLshort형을 지원한다.( 예 : GLfloat형을 쓸때 glNormal3f)) OpenGL에서는 정점의 법선벡터를 명시할때는 정점선언 이전에 해야 한다. GL_NORMALIZE라는 기능을 활성화 시키면 모델뷰 변환이 가해진 후 모든 법선벡터가 자동으로 정교화 된다.

물체면의 특성
여기서 물체의 특성이란 물체면의 색, 물체면의 매끄러움등을 말하고, 물체의 색이란 반사의 종류별로 물체면에서 어떤 크기로 빛을 반사하는지를 말한다. 또 매끄러움은 경면광의 광택계수를 말한다. OpenGL에서는 glMaterial 함수를 이용해 설정할수 있다.
OpenGL에서는 발광체도 지원을 하는대 발광체란 광원이 없어도 스스로 빛을 내는 물체를 말한다.

void glMaterial*( face, pname, value)

 Face(첫번째 파라미터)  기본 값  의미
 GL_FRONT    
 GL_BACK    
 GL_FRONT_AND_BACK    
 Pname( 두번째 파라미터)    
 GL_AMBIENT  (0.2, 0.2, 0.2, 1)  주변반사에 대한 물체색
 GL_DIFFUSE  (0.8, 0.8, 0.8, 1)  확산반사에 대한 물체색
 GL_AMBEINT_AND_DIFFUSE    주변반사와 확산반사에 대한 물체색
 GL_SPECULAR  (0, 0, 0, 1)  경면반사에 대한 물체색
 GL_SHINESS  0  경면반사의 광택 계수
 GL_EMISSION  (0, 0, 0, 1)  물체의 발광색

( 물체의 GL_AMBIENT는 광원의 GL_AMBIENT에 대한 흡수율,  물체의 GL_DIFFUSE는 광원의 GL_DIFFUSE에 대한 반사율을 의미한다. 물체의 GL_SPECULAR는 광원의 GL_SPECULAR에 대한 광택의 흡수율)

조명을 활성화 시킨 상태에서 그냥 glColor함수로 물체를 바꿀 꼉우 바뀌지 않는대 이경우
glEnable함수로 GL_COLOR_MATERIAL 을 활성화 시키면 각 물체의 색을 바꿀수 있다.

OpenGL의 1.2버전 이후에 조명모델과 관련해 몇가지가 더 추가 되었다 여기서는 일단 3가지만 소개 해보겟다.
이 3가지기능은  glLightModel* 함수를 사용 하며 두개의 파라미터를 받는다.

전역 주변광
일반적인 주변광은 광원으로부터 주변물체에 부딪쳐서 들어오는 빛을 감안한 것이다. 이와는 달리 광원에 무관하게 전체적으로 조명을 올리기 위해 사용하는 것이 전역 주변광이다

시점 위치
경면광의 경우 시점의 위치,에 따라 하이라이트의 세기가 좌우댄다. 이 것을 사용해 물체를 매우 가까운것으로 간주하게 할수도 있고 무한대 거리에 있는것으로 간주 하게 할 수 있다.

양면조명
우리가 보는것은 보통 겉 표면 이지만 다각형에는 안쪽에 또다른 이면을 가지고 있다. 만약 원구를 반으로 잘라내면 안쪽의 이면도 보이기 때문에 이면 역시 조명을 설정해 줘야 한다. 그 조명의 활성화 여부를 설정할수 있다.


 파라미터   기본값   의미
 GL_LIGHT_MODEL_AMBIENT  (0.2, 0.2, 0.2, 1)  전역 주변반사의 RGBA
 GL_LIGHT_MODEL_LOCAL_VIEWER  GL_FALSE  시점벡터 계산 여부
 GL_LIGHT_MODEL_TWO_SIDE  GL_FALSE  이면 조명 여부





'라이브러리 > OpenGL' 카테고리의 다른 글

프래그먼트와 GL의 버퍼  (0) 2009.06.12
텍스쳐  (0) 2009.04.03
에일리어싱과 앤티-에일리어싱  (0) 2009.04.03
가시성 판단  (0) 2009.03.31
OpenGL의 투영과 뷰포트 변환  (0) 2009.03.24
OpenGL의 모델변환 및 행렬스택  (0) 2009.03.22
기하 변환  (0) 2009.03.22
3차원 물체의 표현  (0) 2009.03.22
디스플레이 리스트  (0) 2009.03.22
정점배열  (0) 2009.03.22
Posted by crownog
,

투영은 3차원 물체를 2차원 화면으로 사상(맵핑)하기 위한 작업으로 가시변환(Viewing Transformation)이라고도 한다.

1. 평행 투영
물체로 부터 무한대의 거리에 시점이 있다하고, 투상선을 나란히 가져가는 방법. 아무리 멀리 있어도 같은 크기로 표시 된다.

2. 원근 투영
물체로부터 유한한 거이에 시점이 있다고 간주하고 모든 투상선이 시점에서 출발하여 방사선 모양으로 퍼져나가는 방법이다.
사람의 눈이 물체를 포착하는 것처럼 멀리 있는 물체는 작게 보인다.

투영을 할떄는 항상 투영 범위를 제한 해야 한다. 투영 범위를 가시부피 라고 하고, 시점에 가까운 쪽을 전방 절단면, 멀리 떨어진 면을 후방 절단면 이라 한다. 전방,후방 절단면에 의해 그 밖에 있는 물체는 보이지 않는다.


OpenGL에서는 투영을 설정 하려면 먼저 glMatrixMode(GL_PROJECTION)으로 행렬을 투영행렬로 바꿔 줘야한다. 만약 평행 투영을 하려면 OpenGL에서는 glOrtho라는 함수를 사용해서 평행 투영을 지원한다. 그리고 원근 투영은 OpenGL에서 제공하는
 glFrustum함수와 GLU에서 제공하는 gluPerspective함수 2가지중 하나를 사용 할수 있다.

void glOrtho( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);
제일 왼쪽부터 왼쪽, 오른쪽, 아래쪽, 위쪽, 앞쪽, 뒤쪽으로 넘겨받은 파라미터로 육면체를 만들어 평행투영을 시킨다.

void glFrustum( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);
제일 왼쪽부터 왼쪽, 오른쪽, 아래쪽, 위쪽, 앞쪽, 뒤쪽으로 넘겨받은 파라미터로 육면체를 만들어 원근투영을 시킨다.

void gluPerspective( GLdouble fov, GLdouble aspect, GLdouble near, GLdouble far);
fov는 투영을 시키는 시야 각이고, aspect는 뷰 윈도우의 종횡비이고, near과 far은 전방 후방 절단면이다.

주의할점은 near, far은 항상 양의 값을 가줘야 한다.

뷰포트 변환
뷰포트 변환 이란 정규화 장치좌표계에서 화면 좌표계로 가는 작업이다.

OpenGl에서는 glViewport라는 함수를 사용해 뷰포트를 설정 할 수 있다.

void glViewport(GLint left, GLint bottom, GLsizei width, GLsizei height);
left, bottom은 좌하단의 좌표 이고 이것을 기준으로 폭을 width, 높이를 height만큼의 사각형을 정희 한다.





'라이브러리 > OpenGL' 카테고리의 다른 글

프래그먼트와 GL의 버퍼  (0) 2009.06.12
텍스쳐  (0) 2009.04.03
에일리어싱과 앤티-에일리어싱  (0) 2009.04.03
가시성 판단  (0) 2009.03.31
조명과 음영  (0) 2009.03.24
OpenGL의 모델변환 및 행렬스택  (0) 2009.03.22
기하 변환  (0) 2009.03.22
3차원 물체의 표현  (0) 2009.03.22
디스플레이 리스트  (0) 2009.03.22
정점배열  (0) 2009.03.22
Posted by crownog
,
OpenGL에서 모든 변환은 변환행렬로 대신한다. 예를 들어 모델변환은 모델행렬로, 시점변환은 뷰행렬로, 투영변환은 투영행렬등으로 사용한다.

OpenGL에서는 모델변환행렬뷰변환행렬을 합쳐서 모델뷰변환행렬로 사용하게 되어있다. 원래는 뷰행렬과 모델행렬이 곱해져 모델뷰를 이루지만 물체를 보기위해 카메라를 옮기는거나 물체를 옮기는 거나 최종 결과 모습은 동일 하기 때문이다.

변환을 할려면 행렬을 지정해주어야 하는대 OpenGL에서 glMatrixMode라는 함수를 사용해 지정해 줄 수 있다. 그리고 glLoadIdentity라는 함수를 실행하여 CTM을 항등행렬로 초기화 해준다. 초기화 해주지 않으면 그 전 행렬을 그대로 가지고 있기 때문에 원하는 결과와 다르게 나올수도 있으므로 상황떄라 적절히 사용해 주어야한다.

OpenGL에서는 이라는 것을 이용하여 CTM을 변환 시키는 방법이 크게 3가지로 사용된다.

(OpenGL은 열우선순위 배열을 사용 하므로 배열로 데이터를 넘겨주고 할때는 2차원 배열이아닌 1차원 배열로 선언 하는 것이 좋다. 왜냐하면 우리가 프로그래밍에쓰는 배열은 행우선 순위 이므로 순서가 달라려 원하는 결과와는 다른 결과가 나올 수 있기때문이다.)
1. glLoadMatrix 라는 함수를 사용 해서 배열을 넘겨 CTM을 그 배열 값으로 채울 수 있다. 이 함수는 넘겨받을 배열의 데이터 형을 GLfloat과 GLdouble을 지원 하며 위의 함수명마지막에 데이터 형에 따라 f 또는 d를 명시해 주어야 한다.

2. glMultMatrix 라는 함수는 CTM에 파라미터로 넘겨주는 배열 M을 곱하는 함수이다. 이 곱셈은 후위곰셈으로 CTM = CTM * M 이므로 행렬의 곱셈은 교환 법칙이 성립하지 않으므로 주의를 요한다. 이 함수도 1과 같이GLfloat과GLdouble을 사용 가능하므로 함수명 마지막에 f 또는 d를 명시해주어야 한다.

3. 마지막으로 OpenGL에서 제공하는 이동, 회전, 크기조절등의 함수를 이용하는 것이다. 이 방법을 이용할때 주의할 점은 OpenGL 에서는 변환을 Stack을 이용해 전역 좌표를 기준으로 변환을 하기 때문에 물체를 이동후 회전을 하고 싶으면 OpenGL에서는 회전후 이동을 해야 원하는 결과를 얻을 수 있다.

(끝에 d가 붙는건 넘겨받을 파라미터가 GLdouble f는 GLfloat형을 뜻한다.)

회전
glRotated, glRotatef( angle, x축, y축, z축)
이 함수는 모델 좌표계를 젼역 좌표계로 부터 angle만큼 반 시계방향으로 회전 시킨다. angle의 단위는 도(Degree)이고 그 다음은 전역 좌표계의 어느 축을 기준으로 회전을 할껀지 정하고 회전할 축의 값을 1로 준다.(주의! 모델좌표계가 기준이 아니다)

이동
glTranslated,glTranslatef( x축, y축, z축)
이 함수는 모델 좌표계를 전역 좌표계로부터 X,Y,Z축 방향으로 x,y,z 만큼 이동 시킨다.

크기 조절
glScaled, glScaledf(x, y, z);
이 함수는 모델 좌표계의 X,Y,Z축의 눈금이 전역 좌표계 눈금의 x,y,z 배만큼 되도록 크기를 조절한다. 이 함수를 사용시 주의 해야할 점은 기본 크기가 1 이기 때문에 하나의 축만 조절할때 나머지는 0이 아닌 1을 줘야 한다.
(만약 위함수를 사용해서 전역 좌표계 한 눈금이 0.1cm이고 x가 2일 때 모델 좌표계의 한 눈금은 0.2cm가 되어 좌표는 똑같이
1이지만 0.1cm가 아닌 0.2cm를 가기 때문에 크기는 2배가 된다.)

행렬 스택
OpenGL에서는 CTM을 설정한 후 그려지는 모든 물체는 CTM의해 3차원 공간에 그려지게 된다. 그러기 때문에 어느 한 곳에서 CTM을 변환 하면 다른 모든 물체도 영향을 받는다. 그래서 OpenGL에서는 행렬 스택이라는것을 이용해 CTM에 변화를 주지 않으면서 변환을 할수 있게 해준다.

행렬 스택의 실행방식은 이름에도 있듯이 스택을 이용해 CTM을 스택에 저장 하고 꺼내는 방식이다.
먼저 glPushMatrix라는 함수를 사용하면 CTM스택에 저장 한다. 그러면 스택에는 변환하기 전의 CTM이 저장되어있고 CTM의 복사본이 CTM으로 설정 되어있다. 그 후부터 나오는 모든 변환 및 렌더링은 CTM의 복사본에 일어난다. 그리고 glPopMatrix라는 함수를 사용하여 변환하기 전에 저장한 CTM을 불러와 CTM으로 복원한다.
(스택에 저장할수 있는 행렬의 갯수는 하드웨어 마다 다르지만 모델뷰는 최소 32개, 투상은 최소 2개이다)

void glMatrixMode(GLenum mode);
mode에는 GL_MODELVIEW, GL_PROJECTION, GL_TEXTURE 등 을 사용할 수 있다. 이 함수를 사용하면 지정한 행렬을 현재 행렬로 설정 한다.

void glLoadIdentity(void)
CTM을 항등행렬로 초기화 시킨다.

void glLoadMatrixd(const GLdouble *m),void glLoadMatrixf(const GLfloat *m)
CTM의 값들을 m의 값들로 바꾼다.

void glMultMatrixd(const GLdouble *m),void glMultMatrixf(const GLfloat *m)
CTM과 m을 곱한 후 곱한 값을 CTM에 넣는다.

void glPushMatrix(void);
CTM을 스택의 데이터가 없는 곳에서 제일 아래쪽에 저장한다.

void glPopMatrix(void);
스택에 저장되어 있는 제일 위의 CTM 저장본을 꺼내서 CTM으로 설정한다.

'라이브러리 > OpenGL' 카테고리의 다른 글

텍스쳐  (0) 2009.04.03
에일리어싱과 앤티-에일리어싱  (0) 2009.04.03
가시성 판단  (0) 2009.03.31
조명과 음영  (0) 2009.03.24
OpenGL의 투영과 뷰포트 변환  (0) 2009.03.24
기하 변환  (0) 2009.03.22
3차원 물체의 표현  (0) 2009.03.22
디스플레이 리스트  (0) 2009.03.22
정점배열  (0) 2009.03.22
GLUT 모델링  (0) 2009.03.21
Posted by crownog
,