1. 화소 연산

기하 기본 요소가 처리되는 파이프라인과는 별도로 화소 파이프라인이 존재한다.
메인 메모리로부터 읽혀진 영상의 화소는 GL의 처리 형식에 부합하도록 변환된다. 이후 이 화소는 래스터 변환, 프래그먼트 연산 등을 거쳐 프레임 버퍼로 입력된다. 역으로 프레임 버퍼에 있는 화소를 화소 파이프라인을 거쳐 메인 메모리로 보낼 수도 있다.
위 그림은 이러한 과정을 나타낸 것이다. 그림에서 화소 파이프라인이 행하는 연산을 화소 연산(Pixel Operation) 이라 한다.

메인 메모리에 화소 데이터를 저장하는데는 다양한 형식이 사용된다. 윈도우의 경우 압축된 형식을 사용한다. 따라서 이러한 메인 메모리 저장 형식을 프레임 버퍼 저장 형식으로 바꾸려면 타입 변환이 필요하다.

1) 화소 저장 모드(Pixel Storage Mode)
: 영상을 효율적으로 저장하고 검색하기 위해 데이터 경계선을 몇 바이트로 할 것인지(Memory Alignment), 몇 행을 띄고 읽을 것인지(Row Skip), 주소를 어떻게 지정할 것인지(Addressing Mode)등을 말한다. 
이는 다음 함수로 제어할 수 잇다.

void glPixelStore{if} (GLenum pname, TYPEparam);

2) 화소 변환 연산(Pixel Transfer Operations)
: 색 값을 어떻게 변경할 것인지에 관한 것이다.
일반적으로 GL의 컬러는 [0.0, 1.0] 범위의 값으로 표현된다. 다른 그래픽 시스템에서 읽은 컬러 값이 다른 범위에 있다면 이를 이 범위로 사상(Color Map)시킬 필요가 있다. 
이는 다음 함수로 제어할 수 있다.

void glPixelTransfer{if} (GLenum pname, TYPEparam);

화소 기본 요소는 화소별 색 정보로 이루어진 기본 요소다. 이는 비트맵과 화소맵(Pixmap, Image)라는 2가지 타입으로 나뉜다. 다시말해 GL은 비트맵과 화소맵을 구분하여 별도로 정의한다. 


위 그림은 화소 파이프라인에서의 읽기와 쓰기 명령별로 거치는 파이프라인을 나타낸다.

1- 비트맵
: 화소당 1비트만 할애한 것으로, 어떤 화소를 변경할 것인지를 결정하는 일종의 마스크에 해당한다.
비트맵이나 화소맵을 프레임 버퍼에 쓰기 위해서는 래스터 위치(Raster Position)을 설정해야 한다. 여기서 래스터 위치는 화면 좌표계 기준의 좌표를 말한다. 
현 위치를 검색하려면 glGetFloatv(GL_CURRENT_RASTER_POSITION)을 호출하면 된다.

void glRasterPos{234}{sifd}v (TYPE x, TYPE y, TYPE z, TYPE w);

위 함수로 래스터 현재 위치를 설정한다. 

voidglBitmap(GLsizei width, GLsizei height, GLint xo, GLint yo, GLint xi, GLint yi, GLubyte *bitmap);

위 함수로 비트맵을 그린다.

2- 화소맵
: 화소당 여러 비트를 할애한 것으로서 실제 영상의 색에 해당한다. 화면의 사각형 블록의 폭을 Width, 높이를 Height라 할 때 이 블록은 pixels[height][width][3] 이라는 배열로 선언할 수 있다.
GL은  이 블록을 대상으로 읽기, 쓰기, 복사라는 3가지 작업을 허용한다. 

void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);

읽기는 프레임 버퍼의 내용을 메인 메모리에 쓰는 작업이다. 위 함수에 의해 호출된다. 

void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);

쓰기는 메인 메모리에 있는 내용을 프레임 버퍼에 기록하는 작업으로, 위 함수에 의해 호출된다. 

void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);

복사는 프레임 버퍼 내부의 한 블록을 다른 블록으로 복사하는 작업으로, 위 함수에 의해 호출된다. 

* GL의 영상 처리 기능은 이 밖에도 특정 색이 화면에 나타나는 빈도(Frequency)를 추적하는 히스토그램(Histogram) 기능, 영상 필터로서의 컨벌루션(Convolution) 기능, 영상 확대(Pixel Zoom) 기능, 행렬을 사용한 컬러 값의 선형 변환(Color Matrix) 기능 등 다양한 기능을 포함한다. 


2. A-버퍼
:  A-버퍼의 일반적 정의는 프레임 버퍼, 깊이 버퍼, 알파 채널, 앤티 에일리어싱 등의 기능을 통합한 하드웨어를 A-버퍼라 부른다. 
: GL의 A-버퍼는 일반 정의와는 의미가 약간 다르다. 이는 단일 버퍼로, 복수 개의 영상을 누적하여 저장하는 버퍼를 의미 한다. 
아래 함수로 A-버퍼를 제어한다.

void glAccum(GLenum op, GLfloat value);

밑에 표는 파라미터 op에 대한 설명이다.

glAccum(GL_RETURN, 1.0) 함수를 호출하면 A-버퍼의 내용이 프레임 버퍼로 보내진다.

1) 화면 앤티 에일리어싱

위 그림처럼 시점 위치가 약간 바뀌면 영상의 위치도 약간 이동된다. 이는 영상의 떨림과도 유사한데, 이를 이용해서 화면 앤티 에일리어싱(Full Screen Anti-aliasing)을 구현할 수 있다.
임의로 하나의 영상을 약간씩 변위시켜서 여러 영상을 만들어 낸후 평균을 내어 그리면 에일리어싱이 약화된다. 

2) 필드 깊이 조절
: GL 프로그램에 의해 성성된 영상은 완전히 초점이 잡힌 영상이다. 그러나 일반 카메라에 의한 영상은 초점 거리로부터 물체가 멀어질수록 흐려보인다. 이러한 효과를 구현하기 위해서 초점 평면(Focal Plane)과 함께 필드 깊이(Depth of Field)에 따른 변화를 주어야 한다.

3) 모션 블러

위 그림과 같은 효과도 A-버퍼를 통해 영상을 중첩시키면서 구현 가능하다.

4) 소프트 섀도(Soft Shadow)
: A-버퍼는 여러 개의 광원에 의한 소프트 섀도 효과를 내는 데 이용할 수 있다. 한번에 하나의 광원만 활성화하여 그림을 그려낸 후, 이들 각각을 누적하여 그려내면 소프트 섀도가 드려진다.


 

Posted by 홍성곤
,