'라이브러리/OpenGL'에 해당되는 글 18건

프래그먼트란 해당화소의 색, 깊이, 텍스쳐 등 하나의 화소를 채우기 위해 필요한 정보를 지닌 기본 단위로 래스터 변환 후 프레임버퍼에 기록 되기 전까지의 정보들이 이에 해당한다.

그리고 이러한 데이터에 연산을 가하는 것을 프로그먼트 연산이라 하는데 이 연산에는 여러 연산이 있는대 그중 몇가지만 알아보자

1. 시저테스트
시저 테스트란 하나의 뷰포트 영역에 원하는 크기의 사각형 모양으로 한번 더 절단하여 출력하도록 하는 연산이다.

2. 깊이 테스트
Z-버퍼 알고리즘이 가해지는 부분으로, 시점에 가까운 프로그먼트의 깊이만 버퍼에 기록되도록 한다.

3. 블렌딩
블렌딩은 말 그대로 색을 혼합 하는 것으로  보통 투명한 물체를 구현할때 사용 한다.
블랜드 공식

(혼합인수란 해당 색을 얼마나 반영할껀지의 가중치를 뜻한다)

4. 스텐실 테스트
스텐실테스트란 과자를 만들때 별모양등 특정 모양을 내기 위해 찍는 틀 처럼 원하는 영역에만 그려지도록 하는 연산이다.

OpenGL의 버퍼
기본적으로 OpenGL의 버퍼는 프레임 버퍼로 쓰이는 프론트버퍼백버퍼, 스텐실테스트에 사용되는 스텐실 버퍼, 깊이테스트에 사용되는 깊이 버퍼가 있으며 A버퍼라는 특수용도의 버퍼, 보조버퍼, 컬러인덱스 버퍼등이 있다. 이 버퍼들은 대부분 알고 있으므로 처음 보는 A버퍼에 대해서만 설명하겟다.

A버퍼
보통 A버퍼는 프레임 버퍼, 깊이 버퍼, 알파 채널 등의 기능을 통합한 하드웨어 를 뜻한다. 그러나 OpenGL의 A버퍼는 약간 다르다.
OpenGL의 A버퍼는 단일 버퍼로서 복수개의 영상을 누적적으로 저장하는 버퍼를 의미한다. 이를 통해 모션블러 같은 효과나 카메라처럼 초점에 따라 선명함이 다른 영상을 만들수도 있다.



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

텍스쳐  (0) 2009.04.03
에일리어싱과 앤티-에일리어싱  (0) 2009.04.03
가시성 판단  (0) 2009.03.31
조명과 음영  (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
,

텍스쳐

라이브러리/OpenGL 2009. 4. 3. 23:49

지금까지 앞에서 한 조명등만 설정하면 물체가 인위적인 느낌이 든다. 여기에 텍스쳐라는 것을 도입함으로써 좀더 사실감을 줄수 있다. 텍스쳐란 일반적으로 재질 혹은 질감등의 의미로 사용되며 그래픽스에서도 비슷하게 물체에 재질이나 질감을 사실적으로 표현하기 위해 물체 표면에 입히는 영상(이미지,동영상등)을 텍스쳐 또는 텍스쳐맵 이라 한다.
일반적으로 텍스쳐 좌표는 정규화 형태로 표현한다. 이렇게 정규화 좌표로 표현된 텍스쳐를 X,Y,Z좌표로 된 물체면으로 사상(맵핑, Mapping)하는것을 Texture Mapping 이라고 한다. 그리고 텍스쳐를 구성하는 배열의 요소 각각을  텍셀이라하고 텍셀과 픽셀은 확장관계 또는 축소 관계라고 한다. 텍셀보다 작은 크기의 텍스쳐가 한 픽셀로 Mapping되는 것을 확장 관계라 하고 여러 텍셀이 하나의 픽셀에 Mapping되는것을 축소 관계라 한다.

범프 맵핑(Bump Mapping)
텍스쳐를 사용하여 법선벡터를 조작하여 높낮이를 구현하는 방법

범프맵
범프 맴핑에 사용되는 텍스쳐로 주로 흑백으로된 이미지의 밝기로 간단한 높낮이를 구현하는대 이용된다.

노말맵(법선맵)
범프맵의 개량형?으로 범프맵과는 다르게 RGB값을 노말값으로 사용하여 좀저 높은 질감을 표현하는 텍스쳐

라이트 맵핑(Light Mapping)
조명모델에 의해 물체면의 밝기를 계산하는 대신 조명의 결과 영상을 직접 물체면에 입히는 것을 말한다. 결과 영상을 Light Map 이라 한다.

주변 맵핑(Environmental Mapping)
거울에 주위가 반사되는 것처럼 물체 위부환경이 해다아 물체에 반사되어 보이도록 하는 방법이다.  


밉 맵핑( MIP Mapping )
텍셀과 픽셀의 축소관계의 경우 텍셀의 평균을 구하여 해당 픽셀을 칠함으로써 앤티 에일리어싱 효과를 기할 수 있는대, 텍스쳐 영역에서 이러한 계산을 미리 수행해서 저장함으로써 처리 속도를 높이는 방법

OpenGL의 텍스쳐 매핑

1. 먼저 사용할 텍스쳐의 종류를 glEnable함수로 활성화를 해준다.
(주로 사용 하는것은 2D는 GL_TEXTURE_2D로 하면된다)

2. 그 후 텍스쳐로 사용할 그림을 불러오거나 배열로 임의의 텍스쳐 행렬을 생성한다. 아직 그림을 불러오는 법을 모르니 일단 행렬을 사용한다. 간단한 텍스쳐 행렬은 배열명[넓이][높이][3] 으로 끝에 3은 텍스쳐의 RGB 세가지 색의 값을 각 하나씩 구성하기 때문이다.

3. 그 후 배열에 저장된 데이터를 텍스쳐로 사용 하기 위해 2D를 예로 glTexImage2라는 함수를 호출하여 사용한다.
(자세한 파라미터는 아래에서 살펴본다.)

4. 그리고 Mapping을 2D텍스쳐를 사용할때를 예로 들면 일일이 위치를 명시해줄때는 glTexCoord2함수를 보간에 의해 자동적으로 Mapping을 할려면 glTexGen이라는 함수를 사용 하면된다.

* 추가로 에일리어싱을 방지하기위해서 원근에 따른 텍스쳐 보정을 가하려면 glHint함수를 사용할수 있다. 그러나 하드웨어나 드라이버에 따라 다르게 해석되므로 무시되는 경우도 있다.

5.  그리고 텍스쳐 파라미터를 설정해줘아하는대 파라미터에는 크게 두 종류로 구분할 수 있다. 첫번째로 주어진 텍스쳐를 어떻게 확장할 것인가를 결정하는 것과, 주어진 픽셀의 텍스쳐를 어떻게 계산할 것인가를 결정하는 파라미터 이다. 이 설정은
glTexParameter 라는 함수로 설정해준다.

6. 마지막으로 텍스쳐를 물체면에 그대로 입힐 수도 있지만 물체색과 조합할 수도 있다. 이때 glTexEnv 라는 함수를 사용 하여 완전히 텍스쳐색으로만으로 할수도 있고 물체면의 색과 텍스쳐의 색을 혼합하거나 할수도 있다.

void glTexImage2D( GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* texture);

target은 GL_TEXTURE_2D 같은 텍스쳐의 타입을 의미하며, level은 밉맵의 레벨을 의미한다.
그리고 width와 height는 텍셀 단위의 텍스쳐의 폭과 높이이며, border텍스쳐를 둘러싸는 윤곽선을 별도로 칠할수 있는대 이때 윤곽선의 두계를 몇 텍셀로 할것인지를 의미한다.

internalformat은 텍셀을 기술하는데 사용되는 요소 이다.

 상수명  텍셀 구성요소
 GL_RGBA  R, G, B, A
 GL_RGB  R, G, B
 GL_ALPHA  A
 GL_LUMINANCE  intensity
 GL_LUMINANCE_ALPHA  intensity, A
이 외에도 더 많은 형식을 지원하는대 여기서 정리하기에는 너무 많아 자주 쓰이는 몇개만 정리 하였다.

format, type 상수
 파라미터  상수명   의미
FORMAT  GL_COLOR_INDEX  컬러 인덱스
 GL_RGB  R, G, B
 GL_RGBA  R, G, B, A
 GL_RED  Red
 GL_GREEN  Green
 GL_BLUE  Blue
 GL_ALPHA  Alpha
TYPE  GL_UNSIGNED_BYTE  Unsigned 8bit  정수
 GL_BYTE  Signed 8bit      정수
 GL_UNSIGNED_SHORT  Unsigned 16bit  정수
 GL_SHORT  Signed 16bit      정수
 GL_INT  Signed 32bit  정수
 GL_FLOAT  single precision 부동소수

자동 매핑
void glTexGen{i,f,d}[v](GLenum coord, GLenum pname, GLint param)
 coord  pname   param
GL_S
GL_T
GL_R
GL_Q
 GL_TEXTURE_GEN_MODE  GL_OBJECT_LINEAR
 GL_EYE_LINEAR
 GL_GL_SPHERE_MAP
 GL_OBJECT_PLANE  Plane Arry
 GL_EYE_PLANE  Plane Arry

위 함수를 사용할때는 위 파라미터들을 설정한후 만약 GL_S를 사용 한다면 glEnable함수로 GL_TEXTURE_GEN_S를 활성화 시켜줘야 한다. SPHERE_MAP 은 환경맵핑을 할때 사용되며, OBJECT_MAP은 물체에 고정된 텍스쳐를 입힌다. 그리고 EYE_LINEAR는 물체가 아닌 좌표계에 텍스쳐를 입힐때 사용한다.

void glTexEnv{i,f}(GLenum target, GLenum pname, TYPE param)
TYPE는 앞에 i인지 f인지에 따라 GLint또는 GLfloat이 될수도 있다. 그리고 첫번째 파라미터인 target은 꼭 GL_TEXTURE_ENV로 해야 한다.

 pname  param
 GL_TEXTURE_ENV_MODE  GL_DECAL
 GL_GL_REPLACE
 GL_MODULATE
 GL_BLEND
 GL_TEXTURE_ENV_COLOR  RGBA배열

GL_TEXTURE_ENV_MODE의 param 설명
 param  GL_RGB  GL_RGBA
 GL_REPLACE  C = Cb, A = Aa  C = Ca, A = Aa
 GL_MODULATE  C =  CaCb, A = Aa  C =  CaCb, A = AaAb
 GL_DECAL  C = Cb, A = Aa  C = Ca(1-Aa) + CbAb,  A = Aa
 GL_BLEND  C = Ca(1-Cb) + CcCb, A = Aa  C = Ca(1-Cb) + CcCb, A = AaAb

Ca는 텍스쳐의 RGB Aa는 텍스쳐의 알파값,  Cb는 물체의 RGB, Ab는 물체면의 알파 값 이다.(Cc는 아직 모름)


텍스쳐도 하나의 상태변수이므로 텍스쳐도 모델뷰니 투영같이 행렬스택이 존재하므로 glMatrixMode 함수로 텍스쳐 행렬을 불러와 여러가지 변환을 가할수 있다. 그리고 마찬가지로 glPushMatrix 등의 함수도 사용할수있으며 텍스쳐도 디스플레이 리스트와 같은 미리 저장을 해놓고 불러올수 있는 함수를 제공한다.

먼저 glGenTextures함수로 사용할 갯수와, 객체명을 저장할 배열을 넘겨준다. 그리고 glBindTexture함수를 호출하고 파라미터로를 사용할 텍스쳐의 종류와 좀전에 Gen의로 받은 객체명을 넘겨준다. 그리고 사용할 텍스쳐의 설정함수들을 호출해주면된다.
사용할때도 똑같이 glBindTexture함수를 사용한다.



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

프래그먼트와 GL의 버퍼  (0) 2009.06.12
에일리어싱과 앤티-에일리어싱  (0) 2009.04.03
가시성 판단  (0) 2009.03.31
조명과 음영  (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
,


1. 에일리어싱(Aliasing)
에일리어싱이란 래스터변환단계에서 필연적으로 발생하는 현상으로 비트맵 파일을 확대해보면 계단처럼 보이는 그러한 현상을 뜻한다. 이 현상의 원인은 언더 샘플링에 의해 원래 신호를 정확하게 복원하지 못해 왜곡이 일어나는 것이다.

a. 포인트 샘플링
픽셀의 정 중앙 또는 임의 위치에서의 물체색을 해당 픽셀의 색으로 취하는 방법

2. 앤티-에일리어싱(Anti-Aliasing)
앤티-에일리어싱이란 에일리어싱 문제를 최소화 하기 위한 기법이다.

a. 수퍼 샘플링(Super Sampling)
픽셀을 더 작은 단위로 분할을 한다. 포인트 샘플링에 보다 배 이상의 시간이 걸린다.

b. 영역 샘플링(Area Sampling)
픽셀 밝기를 면적에 비례하게 하는 방법.

c. 동일 가중치 샘플링(Unweighted Area Sampling)
영역 내부 모든 곳에 동일한 가중치를 부여하는 방법.

d. 피라미드 가중치 샘플링(Pyramid-Weighted Area Sampling)
픽셀 중심에 걸쳐 들어가는 부분에 높은 가중치를 부여하는 방법.

e. 원뿔 가중치 샘플링(Cone-Weighted Area Sampling)
피라미드 가중치 방식을 개선한 것으로 원뿔 바닥 내부에 있는 모든 물체를 대상으로 가중치를 부여하는 방법.



OpenGL의 앤티-에일리어싱

OpenGL의 앤티-에일리어싱은 혼합함수를 사용 한다.

1.먼저 glEnable함수로 GL_BLEND를 확성화 시킨다.

2. 그후 glBlendFunc 함수로 혼합모드를 설정한다.

3. 마지막으로 점을 부드럽게 할려면 GL_POINT_SMOOTH를 활성화 시키고 선을 부드럽게 할려면 GL_LINE_SMOOTH를 활성화 시키면 된다.

OpenGL의 앤티-에일리어싱은 항상 뒤 물체의 색과 앞 물체의 색을 혼합하여 구현된다. 그러기 때문에 바로 뒤의 물체와 혼합하기 위해서는 반드시 미리 모든 물체를 먼 곳에서 가까운 곳 순으로 정렬을 해야한다. 그러나 장면이 복잡해질수록 거의 불가능 해진다. 그래서 OpenGL에서는 1.3버전부터 멀티 샘플링이 추가 되었다. 이는 수퍼 샘플링에 해당되는 것이다.
이 기능은 glEnable(GL_MULTISAMPLE)의로 활성화 시킬수 있다.



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

프래그먼트와 GL의 버퍼  (0) 2009.06.12
텍스쳐  (0) 2009.04.03
가시성 판단  (0) 2009.03.31
조명과 음영  (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
,

보통 우리의 눈 이나 카메라는 보이는 물체의 모든것을 보지못한다. 그래픽스에서도 마찬가지로 보통 우리가 사용하는 출력 장치는 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
,