픽셀 , 비트맵 , 폰트 , 이미지 그리기
DESCRIPTION
픽셀 , 비트맵 , 폰트 , 이미지 그리기. 내용. 비트맵과 폰트 이미지 이미지 파이프라인 픽셀 사각형을 읽고 그리기 픽셀 그리기 비율을 개선하는 팁들 ( 비법 ) 이미지의 서브셋. 비트맵과 이미지. 둘 다 픽셀 사각형 배열 형식 비트맵 폰트에 있는 문자에 전형적으로 사용됨 각 픽셀에 대한 단일한 비트 정보로 구성 이미지 데이터 스캔되거나 계산될 수 있다 . 각 픽셀마다 여러 개의 데이터 조각 (R, G, B, A 포함 ). 비트맵과 폰트. 비트맵과 폰트 - PowerPoint PPT PresentationTRANSCRIPT
픽셀 , 비트맵 , 폰트 , 이미지 그리기
2010-2 학기 가상현실 2
내용
비트맵과 폰트
이미지
이미지 파이프라인
픽셀 사각형을 읽고 그리기
픽셀 그리기 비율을 개선하는 팁들 ( 비법 )
이미지의 서브셋
2010-2 학기 가상현실 3
비트맵과 이미지
둘 다 픽셀 사각형 배열 형식
비트맵 폰트에 있는 문자에 전형적으로 사용됨 각 픽셀에 대한 단일한 비트 정보로 구성
이미지 데이터 스캔되거나 계산될 수 있다 . 각 픽셀마다 여러 개의 데이터 조각 (R, G, B, A 포함 )
2010-2 학기 가상현실 4
비트맵과 폰트
비트맵과 폰트
비트맵은 윈도우의 사각형 구역을 마스크 효과처럼 0 과 1 로 표시하여 구성한 사각형 배열
비트맵을 사용하는 일반적인 경우는 스크린에 문자들을 그리는 경우
glRasterPos*() 와 glBitmap() 스크린상에 하나의 비트맵을 위치시키고 , 그리는 명령
2010-2 학기 가상현실 5
그림 8-1 비트맵으로 그린 F 와 데이터
0xc0, 0x000xc0, 0x00
0xff, 0xc00xff, 0xc0
2010-2 학기 가상현실 6
h=12
w=10
0, 0 11, 0
(xbo, ybo) = (0, 0)(xbi, ybi) = (11, 0)
2010-2 학기 가상현실 7
예제 8-1 비트맵화된 문자 그리기 : drawf.c#include <GL/glut.h>#include <stdlib.h>
GLubyte rasters[24] = { 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xff, 0xc0, 0xff, 0xc0};
void init(void){ glPixelStorei (GL_UNPACK_ALIGNMENT, 1); glClearColor (0.0, 0.0, 0.0, 0.0);}
2010-2 학기 가상현실 8
void display(void){ glClear(GL_COLOR_BUFFER_BIT); glColor3f (1.0, 1.0, 1.0); glRasterPos2i (20, 20); glBitmap (10, 12, 0.0, 0.0, 11.0, 0.0, rasters); glBitmap (10, 12, 0.0, 0.0, 11.0, 0.0, rasters); glBitmap (10, 12, 0.0, 0.0, 11.0, 0.0, rasters); glFlush();}void reshape(int w, int h){ glViewport(0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho (0, w, 0, h, -1.0, 1.0); glMatrixMode(GL_MODELVIEW);}
2010-2 학기 가상현실 9
void keyboard(unsigned char key, int x, int y){ switch (key) { case 27: exit(0); }}
2010-2 학기 가상현실 10
int main(int argc, char** argv){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(100, 100); glutInitWindowPosition(100, 100); glutCreateWindow(argv[0]); init(); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutDisplayFunc(display); glutMainLoop(); return 0;}
2010-2 학기 가상현실 11
F 라는 문자가 최대 10 만큼의 너비로 표현비트맵 데이터는 항상 8 비트의 배수형으로 저장된다 .비트맵을 만드는 비트들은 왼쪽 아래부터 그려짐 . 처음에 제일 아래 줄부터 그려짐 래스터 배열은 F 의 아래 2 줄을 표현하는 0xc0, 0x00, 0xc0,
0x00 으로 시작해서 맨 위의 두 줄인 0xff, 0xc0, 0xff, 0xc0까지
2010-2 학기 가상현실 12
현재 래스터 위치 현재의 래스터 위치는 다음 순서의 비트맵 ( 또는 이미지 ) 이 그려지는
스크린상의 위치 예제에서 F 가 그려질 때 glRasterPos*() 호출 , 아래 왼쪽 부분에
해당하는 (20, 20) 좌표를 설정 glRasterPos2i(20, 20);
void glRasterPos{234}{sidf}(TYPE x, TYPE y,TYPE z, TYPE w); void glRasterPos{234}{sidf}v(TYPE *coords);
현재의 래스터 위치를 설정 , 변수는 래스터위치 좌표 설명
현재의 래스터 위치를 포함시키려면 glGetFloatv() 커맨드 사용 : 첫 번째 인수로
GL_CURRENT_RASTER_POSITION 사용 래스터 위치가 적합한지를 판별하기 위해서는
glGetBooleanv() 호출 : 첫 번째 인수로 GL_CURRENT_RASTER_POSITION_VALID 사용
2010-2 학기 가상현실 13
비트맵 그리기 void glBitmap( GLsizei width, GLsizei height, GLfloat xbo,
GLfloat ybo, GLfloat xbi, GLfloat ybi, const GLubyte *bitmap);
비트맵 이미지의 포인터인 비트맵을 bitmap 으로 표시하여 그림
비트맵의 원점을 현재의 래스터 위치로 교체 width 와 height 은 비트맵의 픽셀 너비와 높이를 나타냄 xbo 와 ybo 는 비트맵의 원점을 정의 xbi 와 ybi 는 비트맵이 래스터화 한 후에 래스터 위치에
더해지는 요소인 x 와 y 를 지칭
2010-2 학기 가상현실 14
비트맵의 컬러 선택하기
glColor*() 와 glIndex*() 에 GL_CURRENT_RASTER_COLOR 와 GL_CURRENT_RASTER_INDEX 라는 다른 상태값들로 설정 , 비트맵을 표현
래스터 컬러 상태값은 glRasterPos*() 가 호출될 때 설정
glColor3f(1.0, 1.0, 1.0); /* 흰색 */ glRasterPos3fv(position); glColor3f(1.0, 0.0, 0.0); /* 빨간색 */ glBitmap(…);
/* Bitmap 은 흰색으로 그려짐 */
현재의 래스터 컬러나 인덱스 포함은 glGetFloatv() 나 glGenIntegerv() 커맨드의 첫번째 인수를
GL_CURRENT_RASTER_COLOR 나 GL_CURRENT_RASTER_INDEX 로 설정
2010-2 학기 가상현실 15
폰트와 디스플레이 목록
하나의 폰트는 일반적으로 각 문자가 식별 숫자 (ASCII 코드 ) 와 폰트의 그려지는 방법을 포함한 일련의 문자들의 조합으로 구성
glCallLists() 를 다음과 같은 방법으로 사용 가능 void glCallLists(GLsizei n, GLenum type, const GLvoid
*list); n 은 그려질 문자들의 개수 , type 는 보통 GL_BYTE, list 는
문자 코드들의 배열이다 .
오프셋을 설정하기 위해서 glLIstBase() 라는 커맨드 이용 glGenLists(GLsizei range) 로 유효한 인덱스 번호를 얻음
이 함수는 디스플레이 리스트 식별자인 range 라는 범위에 해당되는 리스트를 반환
2010-2 학기 가상현실 16
예제 8-2 완전한 폰트 그리기 : font.c
#include <GL/glut.h>#include <stdlib.h>#include <string.h>
GLubyte space[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00};GLubyte letters[][13] = {{0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xff, 0xc3, 0xc3, 0xc3,
0x66, 0x3c, 0x18}, {0x00, 0x00, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe, 0xc7, 0xc3,
0xc3, 0xc7, 0xfe}, {0x00, 0x00, 0x7e, 0xe7, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0,
0xc0, 0xe7, 0x7e},
2010-2 학기 가상현실 17
{0x00, 0x00, 0xfc, 0xce, 0xc7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc7, 0xce, 0xfc},
{0x00, 0x00, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc, 0xc0, 0xc0, 0xc0, 0xc0, 0xff},
{0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc, 0xc0, 0xc0, 0xc0, 0xff},
{0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xcf, 0xc0, 0xc0, 0xc0, 0xc0, 0xe7, 0x7e},
{0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xff, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3},
{0x00, 0x00, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e},
{0x00, 0x00, 0x7c, 0xee, 0xc6, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06},
2010-2 학기 가상현실 18
{0x00, 0x00, 0xc3, 0xc6, 0xcc, 0xd8, 0xf0, 0xe0, 0xf0, 0xd8, 0xcc, 0xc6, 0xc3},
{0x00, 0x00, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0},
{0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xdb, 0xff, 0xff, 0xe7, 0xc3},
{0x00, 0x00, 0xc7, 0xc7, 0xcf, 0xcf, 0xdf, 0xdb, 0xfb, 0xf3, 0xf3, 0xe3, 0xe3},
{0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xe7, 0x7e},
{0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe},
{0x00, 0x00, 0x3f, 0x6e, 0xdf, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c},
2010-2 학기 가상현실 19
{0x00, 0x00, 0xc3, 0xc6, 0xcc, 0xd8, 0xf0, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe},
{0x00, 0x00, 0x7e, 0xe7, 0x03, 0x03, 0x07, 0x7e, 0xe0, 0xc0, 0xc0, 0xe7, 0x7e},
{0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff},
{0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3},
{0x00, 0x00, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3},
{0x00, 0x00, 0xc3, 0xe7, 0xff, 0xff, 0xdb, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3},
{0x00, 0x00, 0xc3, 0x66, 0x66, 0x3c, 0x3c, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3},
2010-2 학기 가상현실 20
{0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3},
{0x00, 0x00, 0xff, 0xc0, 0xc0, 0x60, 0x30, 0x7e, 0x0c, 0x06, 0x03, 0x03, 0xff}
};
GLuint fontOffset;
void makeRasterFont(void){ GLuint i, j; glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
fontOffset = glGenLists (128);
2010-2 학기 가상현실 21
for (i = 0,j = 'A'; i < 26; i++,j++) { glNewList(fontOffset + j, GL_COMPILE); glBitmap(8, 13, 0.0, 2.0, 10.0, 0.0, letters[i]); glEndList(); } glNewList(fontOffset + ' ', GL_COMPILE); glBitmap(8, 13, 0.0, 2.0, 10.0, 0.0, space); glEndList();}
void init(void){ glShadeModel (GL_FLAT); makeRasterFont();}
2010-2 학기 가상현실 22
void printString(char *s){ glPushAttrib (GL_LIST_BIT); glListBase(fontOffset); glCallLists(strlen(s), GL_UNSIGNED_BYTE, (GLubyte *) s); glPopAttrib ();}void display(void){ GLfloat white[3] = { 1.0, 1.0, 1.0 };
glClear(GL_COLOR_BUFFER_BIT); glColor3fv(white);
2010-2 학기 가상현실 23
glRasterPos2i(20, 60); printString("THE QUICK BROWN FOX JUMPS"); glRasterPos2i(20, 40); printString("OVER A LAZY DOG"); glFlush ();}
void reshape(int w, int h){ glViewport(0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho (0.0, w, 0.0, h, -1.0, 1.0); glMatrixMode(GL_MODELVIEW);}
2010-2 학기 가상현실 24
void keyboard(unsigned char key, int x, int y){ switch (key) { case 27: exit(0); } }int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(300, 100); glutInitWindowPosition (100, 100); glutCreateWindow(argv[0]); init(); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutDisplayFunc(display); glutMainLoop(); return 0; }
2010-2 학기 가상현실 25
이미지
이미지는 비트맵과 유사하지만 사각형 영역에서 각 픽셀이 하나의 비트만을 포함하는 것이 아니라 보다 많은 정보 포함 예를 들어 이미지는 각 픽셀마다 완전한 RGBA 컬러를 저장
보통 그림으로 생각되는 이미지는 컬러버퍼에서 나옴깊이 버퍼나 스텐실 버퍼로부터 픽셀 데이터의 사각형 영역을 읽거나 쓸 수 있다 .
스크린상에 표시되는 것 이외에도 텍스처매핑에도 사용될 수 있다 .
2010-2 학기 가상현실 26
픽셀 데이터 읽기 , 쓰기 , 복사하기
glReadPixels() 프레임 버퍼로부터 픽셀들의 사각형 배열을 읽고 , 메모리 안에
데이터 저장
glDrawPixels() 프로세서 메모리에 유지되고 있는 데이터로부터
glRasterPos*() 에 의해서 표시되는 현재의 래스터 위치의 프레임버퍼 안에 픽셀들의 사각형 배열을 씀
glCopyPIxels() 프레임 버퍼의 한 부분에서 다른 부분으로 픽셀들의 사각형
배열을 복사
2010-2 학기 가상현실 27
프레임버퍼에서 프로세서 메모리로 픽셀 데이터 읽기
void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
윈도우 좌표계의 x,y 축 하단에 위치
차원은 width 와 height 인 프레임버퍼 사각형으로부터 픽셀 데이터를 읽고 , pixel 에 의해서 지정된 배열 안에 저장
format 은 읽혀지는 픽셀 데이터의 요소의 종류 표 8-1 인덱스값이나 R, G, B, A 구성값
type 은 각 요소들의 데이터 종류
2010-2 학기 가상현실 28
표 8-1 glReadPixels(), glDrawPixels() 에 필요한 픽셀 포맷들
포맷 상수 픽셀 형식
GL_COLOR_INDEX 한 개의 컬러 참조
GL_RGB 빨강 , 초록 , 파랑 컬러 구성 요소들
GL_RGBA 빨강 , 초록 , 파랑 알파 컬러 구성 요소들
GL_BGR 파랑 , 초록 빨강 컬러 구성 요소들
GL_BGRA 파랑 , 초록 , 빨강 , 알파 컬러 구성 요소들
GL_RED 한 개의 빨강 컬러 구성 요소
GL_GREEN 한 개의 초록 컬러 구성 요소
GL_BLUE 한 개의 파랑 컬러 구성 요소
GL_ALPHA 한 개의 알파 컬러 구성 요소
GL_LUMINANCE 한 개의 루미넌스 구성 요소
GL_LUMINANCE_ALPHA 루미넌스와 알파 구성 요소
GL_STENCIL_INDEX 한 개의 스텐실 참조
GL_DEPTH_COMPONENT 한 개의 깊이 구성 요소
2010-2 학기 가상현실 29
표 8-2 glReadPixels(), glDrawPixels() 의 데이터 형 (type)
타입 상수 데이타 형식
GL_UNSIGNED_BYTE 부호 없는 8 비트 정수
GL_BYTE 부호 있는 8 비트 정수
GL_BITMAP glBitmap() 과 같은 형식으로 사용되는 부호없는 8 비트정수 중에서 한 개의 비트
GL_UNSIGNED_SHORT 부호 없는 16 비트 정수
GL_SHORT 부호 있는 16 비트 정수
GL_UNSIGNED_INT 부호 없는 32 비트 정수
GL_INT 부호 있는 32 비트 정수
GL_FLOAT 단정도 소수점 ( 실수 )
GL_UNSIGNED_BYTE_3_3_2 부호 없는 8 비트 정수로 묶여짐
2010-2 학기 가상현실 30
타입 상수 데이타 형식
GL_UNSIGNED_BYTE_2_3_3_REV 부호 없는 16 비트 정수로 묶여짐
GL_UNSIGNED_SHORT_5_6_5 부호 없는 16 비트 정수로 묶여짐
GL_UNSIGNED_ SHORT_5_6_5_REV 부호 없는 16 비트 정수로 묶여짐
GL_UNSIGNED_ SHORT_4_4_4_4 부호 없는 16 비트 정수로 묶여짐
GL_UNSIGNED_ SHORT_ 4_4_4_4_REV
부호 없는 16 비트 정수로 묶여짐
GL_UNSIGNED_ SHORT_5_5_5_1 부호 없는 16 비트 정수로 묶여짐
GL_UNSIGNED_ SHORT_1_5_5_5_REV
부호 없는 16 비트 정수로 묶여짐
GL_UNSIGNED_INT_8_8_8_8 부호 없는 32 비트 정수로 묶여짐
GL_UNSIGNED_INT_8_8_8_8_REV 부호 없는 32 비트 정수로 묶여짐
GL_UNSIGNED_INT_10_10_10_2 부호 없는 32 비트 정수로 묶여짐
GL_UNSIGNED_INT_ 10_10_10_2_REV
부호 없는 32 비트 정수로 묶여짐
2010-2 학기 가상현실 31
묶여진 데이터 타입 각 픽셀들의 모든 컬러 구성 요소가 하나의 부호 없는 데이터
타입으로 압축 바이트 한 개 , short 정수형 , 또는 표준 정수 타입
(GL_UNSIGNED_BYTE_*, GL_UNSIGNED_SHORT_*, GL_UNSIGNED_INT_*) 등으로 시작하는 상수들에 의해 표시
묶여진 픽셀 데이터의 비트 범위 위치에서의 컬러값들의 순서 _REV 가 없는 경우
컬러 구성 요소들은 첫 번째 컬러 성분이 차지하고 있는 가장 중요한 장소에 할당
_REV 가 있는 경우 첫 번째 컬러 성분이 least significant 위치에 시작되면서
성분의 패킹 순서가 반대로 됨
2010-2 학기 가상현실 32
묶여진 데이터 형의 적합한 픽셀 포맷
묶여진 타입 상수 적합한 픽셀 포맷
GL_UNSIGNED_BYTE_3_3_2 GL_RGB
GL_UNSIGNED_BYTE_2_3_3_REV GL_RGB
GL_UNSIGNED_SHORT_5_6_5 GL_RGB
GL_UNSIGNED_ SHORT_5_6_5_REV GL_RGB
GL_UNSIGNED_ SHORT_4_4_4_4 GL_RGBA, GL_BGRA
GL_UNSIGNED_ SHORT_5_5_5_1 GL_RGBA, GL_BGRA
GL_UNSIGNED_ SHORT_1_5_5_5_REV GL_RGBA, GL_BGRA
GL_UNSIGNED_INT_8_8_8_8 GL_RGBA, GL_BGRA
GL_UNSIGNED_INT_8_8_8_8_REV GL_RGBA, GL_BGRA
GL_UNSIGNED_INT_10_10_10_2 GL_RGBA, GL_BGRA
GL_UNSIGNED_INT_10_10_10_2_REV GL_RGBA, GL_BGRA
2010-2 학기 가상현실 33
묶여진 데이터 타입과 픽셀 포맷들에 대한 구성 요소의 순서
Red Green Blue7 6 5 4 3 2 1 0
GL_UNSIGNED_BYTE_3_3_2 with GL_RGB
Blue Green Red
7 6 5 4 3 2 1 0
GL_UNSIGNED_BYTE_2_3_3_REV with GL_RGB
Red Green Blue
GL_UNSIGNED_SHORT_4_4_4_4 with GL_RGBA
Alpha
2010-2 학기 가상현실 34
Blue Green Red
GL_UNSIGNED_SHORT_4_4_4_4 with GL_BGRA
Alpha
Alpha Blue Green
GL_UNSIGNED_SHORT_4_4_4_4_REV with GL_RGBA
Red
Alpha Red Green
GL_UNSIGNED_SHORT_4_4_4_4_REV with GL_BGRA
Blue
2010-2 학기 가상현실 35
프로세서 메모리로부터 프레임 버퍼에 픽셀 데이터 쓰기
void glDrawpixels(GLsizei width, Glsizei height, GLenum format, GLenum type, const GLvoid, *pixels);
픽셀 데이터의 사각형을 width 와 height 크기로 그림 픽셀 사각형은 현재 래스터 위치를 왼쪽 아래 모서리
지점으로 지정하여 그린다 . format 과 type 은 glReadRixels() 와 같은 의미
2010-2 학기 가상현실 36
예제 8-3 glDrawPixels() 의 사용 : image.c#include <GL/glut.h>#include <stdlib.h>#include <stdio.h>
#define checkImageWidth 64#define checkImageHeight 64
GLubyte checkImage[checkImageHeight][checkImageWidth][3];
static GLdouble zoomFactor = 1.0;static GLint height;
2010-2 학기 가상현실 37
void makeCheckImage(void){ int i, j, c; for (i = 0; i < checkImageHeight; i++) { for (j = 0; j < checkImageWidth; j++) { c = ((((i&0x8)==0)^((j&0x8))==0))*255; // ^ 비트 XOR
연산자 checkImage[i][j][0] = (GLubyte) c; checkImage[i][j][1] = (GLubyte) c; checkImage[i][j][2] = (GLubyte) c; } }}
2010-2 학기 가상현실 38
void init(void){ glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel(GL_FLAT); makeCheckImage(); glPixelStorei(GL_UNPACK_ALIGNMENT, 1);}
void display(void){ glClear(GL_COLOR_BUFFER_BIT); glRasterPos2i(0, 0); glDrawPixels(checkImageWidth, checkImageHeight,
GL_RGB, GL_UNSIGNED_BYTE, checkImage); glFlush();}
2010-2 학기 가상현실 39
void reshape(int w, int h){ glViewport(0, 0, (GLsizei) w, (GLsizei) h); height = (GLint) h; glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, (GLdouble) w, 0.0, (GLdouble) h); glMatrixMode(GL_MODELVIEW); glLoadIdentity();}
2010-2 학기 가상현실 40
void motion(int x, int y){ static GLint screeny; screeny = height - (GLint) y; glRasterPos2i (x, screeny); glPixelZoom (zoomFactor, zoomFactor); glCopyPixels (0, 0, checkImageWidth, checkImageHeight,
GL_COLOR); glPixelZoom (1.0, 1.0); glFlush ();}
2010-2 학기 가상현실 41
void keyboard(unsigned char key, int x, int y){ switch (key) { case 'r': case 'R': zoomFactor = 1.0; glutPostRedisplay(); printf ("zoomFactor reset to 1.0\n"); break; case 'z': zoomFactor += 0.5; if (zoomFactor >= 3.0) zoomFactor = 3.0; printf ("zoomFactor is now %4.1f\n", zoomFactor); break;
2010-2 학기 가상현실 42
case 'Z': zoomFactor -= 0.5; if (zoomFactor <= 0.5) zoomFactor = 0.5; printf ("zoomFactor is now %4.1f\n", zoomFactor); break; case 27: exit(0); break; default: break; }}
2010-2 학기 가상현실 43
int main(int argc, char** argv){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(250, 250); glutInitWindowPosition(100, 100); glutCreateWindow(argv[0]); init(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutMotionFunc(motion); glutMainLoop(); return 0; }
2010-2 학기 가상현실 44
프레임 버퍼 안에서 픽셀 데이터 복사
void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum buffer);
아래 왼쪽 모서리가 x, y width 와 height 의 넓이를 가지는 프레임 버퍼 사각형으로
부터 데이터를 복사 데이터는 현재 래스터 위치에 의해서 주어지는 새로운 위치인
왼쪽 아래 위치로 복사된다 . buffer 는 사용되고 있는 프레임 버퍼를 설명하는 GL_COLOR,
GL_STENCIL, GL_DEPTH
2010-2 학기 가상현실 45
이미지 파이프라인픽셀 이동 동작과 픽셀 저장 모드 설명
glPixelZoom() 함수를 호출해서 픽셀 사각형이 그려지기 전에 확대하거나 축소할 수 있다 .
glDrawPixels() 가 호출될 때 데이터는 실제로 픽셀 저장 모드를 따라 메모리로부터 묶임이 풀려짐 (unpack)
픽셀 이동 연산들이 수행 , 픽셀 결과값은 래스터화 됨 래스터화 되는 동안 픽셀 사각형은 현재의 상태에 따라서 확대 , 축소
마지막으로 조각 연산이 제공 , 픽셀들은 프레임 버퍼에 쓰여짐
glReadPixels() 데이터가 프레임버퍼로부터 읽혀지며 픽셀 이동 동작이
수행되고 , 데이터의 결과값은 프로세서 메모리 안으로 묶여짐 (pack)
2010-2 학기 가상현실 46
glCopyPixels() glReadPixels() 이 어떤 연산을 하는 동안에 모든 픽셀 이동 동작을 사용한다 .
2010-2 학기 가상현실 47
이미지 파이프라인ProcessorMemory
Pixel storagemodels
Pixel-transferOperations
(and pixel map) Rasterization(including pixel zoom)
Per-fragmentoperations
Frame buffer
unpack Texturememory
pack
2010-2 학기 가상현실 48
픽셀 패킹과 언패킹
패킹 (packing 묶기 ) 과 언패킹 (unpacking, 묶기 해제 ) 은 픽셀 데이터가 프로세서 메모리로 쓰거나 프로세서 메모리에서 읽혀지는 방법과 관계 메모리에 저장되는 이미지는 elements 라고 불리는 1 개에서 4개 사이의 데이터 덩어리를 가진다 .
픽셀 데이터나 포맷은 각 픽셀마다 저장하는 요소들의 숫자를 결정하거나 순서를 결정하여 정렬한다 .
구성요소는 8 비트 바이트에서 32 비트 정수까지 , 또는 소수점 숫자 등 여러 가지의 데이터 타입으로 메모리에 저장될 수 있다 .
2010-2 학기 가상현실 49
픽셀 저장 모드의 제어이미지 데이터는 프로세서 메모리 안에 사각형 2,3 차원 배열 안에 저장OpenGL 에서 지원하는 모든 픽셀 저장 모드는 glPixelStore*() 커맨드로 제어
void glPixelStore{if}(GLenum pname, TYPE param); pname: 매개변수 ( 표 8-4)
GL_UNPACK_SWAP_BYTES, GL_PACK_SWAP_BYTES, GL_UNPACK_LSB_FIRST, GL_PACK_LSB_FIRST …
param: 타입
GL_UNPACK* 매개변수 사용 glDrawPixels(), glBitmap(), glPolygonStipple(), glTexImage1D(),
glTexImage2D(), glTexImage3D(), …
GL_PACK* 매개변수 사용 glReadPixels(), glGetTexImage(), glGetColorTable(),…
2010-2 학기 가상현실 50
표 8-4 glPixelStore() 매개변수들
매개변수 이름 타입 초기값 적합한 범위GL_UNPACK_SWAP_BYTES,GL_PACK_SWAP_BYTES
GLboolean FALSE TRUE/FALSE
GL_UNPACK_LSB_FIRST.GL_PACK_ LSB_FIRST
GLboolean FALSE TRUE/FALSE
GL_UNPACK_ROW_LENGTH.GL_PACK_ ROW_LENGTH
GLint 0 음이 아닌 정수
GL_UNPACK_SKIP_ROWS,GL_PACK_ SKIP_ROWS
GLint 0 음이 아닌 정수
GL_UNPACK_SKIP_PIXELS,GL_PACK_ SKIP_PIXELS
GLint 0 음이 아닌 정수
GL_UNPACK_ALIGNMENTGL_PACK_ ALIGNMENT
GLint 4 1, 2, 4, 8
GL_UNPACK_IMAGE_HEIGHTGL_PACK_ IMAGE_HEIGHT
GLint 0 음이 아닌 정수
GL_UNPACK_SKIP_IMAGESGL_PACK_SKIP_IMAGES
GLint 0 음이 아닌 정수
2010-2 학기 가상현실 51
*SWAP_BYTES 매개변수가 FALSE( 기본값 ) 일 경우 , 메모리상의 바이트 순서는 OpenGL 의 본래 값기본값이 아닐 경우는 바이트가 역순서가 됨GLubyte 는 8 비트 , GLushort 는 16 비트 , GLuint 는 32 비트단일 바이트 교환은 아무런 효과가 없다 .
2010-2 학기 가상현실 52
Byte
Byte, short, integer 데이터의 바이트 교환
Byte7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
Short(byte0)15 14 13 12 11 10 9 8
Short(byte1)7 6 5 4 3 2 1 0
Short(byte0)7 6 5 4 3 2 1 0
Short(byte1)15 14 13 12 11 10 9 8
Integer(byte0)31 30 29 28 27 26 25 24
Integer(byte1) 23 22 21 20 19 18 17
Integer(byte2)15 14 13 12 11 10 9 8
Integer(byte3)7 6 5 4 3 2 1 0
Integer(byte3)7 6 5 4 3 2 1 0
Integer(byte2) 15 14 13 12 11 10 9 8
Integer(byte1)23 22 21 20 19 18 17 16
Integer(byte0)31 30 29 28 27 26 25 24
2010-2 학기 가상현실 53
*LSB_FIRST 매개변수는 각 픽셀들의 데이터 비트가 저장되거나 복구될 때 적용*LSB_FIRST 가 FALSE 이고 바이트가 0x31 의 경우 비트의 순서는 {0 0 1 1 0 0 0 1}
*LSB_FIRST 가 TRUE 이면 비트의 순서는 {1 0 0 0 1 1 0 0 }
2010-2 학기 가상현실 54
*ROW_LENGTH 매개변수 메모리상에 , 저장된 이미지 데이터의 부분 사각형을 읽거나
그릴 경우 사용 *ROW_LENGTH 가 0 이면 행의 길이는 glReadPixels(),
glDrawPixels(), glCopyPixels() 로 설명된 너비와 같다 .*SKIP_ROWS , *SKIP_PIXELS 를 이용하여 건너뛰는 행과 열의 숫자 설정 , 왼쪽 아래 모서리부터 시작됨 .*ALIGNMENT 가 1 로 설정된다면 다음 순서의 사용 가능한 바이트가 사용된다 . 2 로 설정되면 다음 행의 첫 번째 바이트가 2 의 배수인 주소를
가지게 된다 .*IMAGE_HEIGHT 와 SKIP_IMAGES 는 3차원 텍스처를 정의하고 질의하는 경우에만 영향을 준다 .
2010-2 학기 가상현실 55
*SKIP_ROWS, *SKIP_PIXELS, *ROW_LENGTH
subimage
ROW_LENGTH
*SKIP_PIXELS
*SKIP_ROWS
2010-2 학기 가상현실 56
픽셀 전송 동작
이미지 데이터는 메모리에서 프레임버퍼로 전송되거나 , 프레임버퍼에서 메모리 안으로 전송이 과정에서 여러가지 연산을 수행할 수 있다 : 구성 요소의 범위 변경 등 : 빨강 구성 요소가 0.0 ~ 1.0 인데
다른 범위로 바꿀 수 있음glPixelTransfer*(), glPixelMap*() 커맨드를 통해서 전송동작수행
void glPixelTransfer{if}(GLenum pname, TYPE param); glDrawPixels(), glReadPixels(), glCopyPixels(),
glTexImage1D(), glTexImage2D(), glTexImage3D(), glCopyTexImage1D(), glCopyTexSubImage1D(), … 등의 동작에 영향을 주는 픽셀 전송 모드를 설정
2010-2 학기 가상현실 57
표 8-5 glPixelTransfer*() 매개변수들
매개변수 이름 타입 초기값 적합한 범위
GL_MAP_COLOR GLboolean FALSE TRUE/FALSE
GL_MAP_STENCIL GLboolean FALSE TRUE/FALSE
GL_INDEX_SHIFT GLint 0 무한대
GL_INDEX_OFFSET GLint 0 무한대
GL_RED_SCALE GLfloat 1.0 무한대
GL_GREEN_SCALE GLfloat 1.0 무한대
GL_BLUE_SCALE GLfloat 1.0 무한대
GL_ALPHA_SCALE GLfloat 1.0 무한대
2010-2 학기 가상현실 58
매개변수 이름 타입 초기값 적합한 범위
GL_DEPTH_SCALE GLfloat 1.0 무한대
GL_RED_BIAS GLfloat 0.0 무한대
GL_GREEN_BIAS GLfloat 0.0 무한대
GL_BULE_BIAS GLfloat 0.0 무한대
GL_ALPHA_BIAS GLfloat 0.0 무한대
GL_DEPTH_BIAS GLfloat 0.0 무한대
GL_POST_CONVOLUTION_RED_SCALE
GLfloat 0.0 무한대
GL_POST_CONVOLUTION_GREEN_SCALE
GLfloat 0.0 무한대
GL_POST_CONVOLUTION_BLUE_SCALE
GLfloat 0.0 무한대
GL_POST_CONVOLUTION_ALPHA_SCALE
GLfloat 0.0 무한대
2010-2 학기 가상현실 59
매개변수 이름 타입 초기값 적합한 범위
GL_POST_CONVOLUTION_RED_BIAS GLfloat 0.0 무한대
GL_POST_CONVOLUTION_GREEN_BIAS GLfloat 0.0 무한대
GL_POST_CONVOLUTION_BLUE_BIAS GLfloat 0.0 무한대
GL_POST_CONVOLUTION_ALPHA_BIAS GLfloat 0.0 무한대
GL_POST_COLOR_MATRIX_RED_SCALE GLfloat 1.0 무한대
GL_POST_COLOR_MATRIX_GREEN_SCALE GLfloat 1.0 무한대
GL_POST_COLOR_MATRIX_BLUE_SCALE GLfloat 1.0 무한대
GL_POST_COLOR_MATRIX_ALPHA_SCALE GLfloat 1.0 무한대
GL_POST_COLOR_MATRIX_RED_BIAS GLfloat 0.0 무한대
GL_POST_COLOR_MATRIX_GREEN_BIAS GLfloat 0.0 무한대
GL_POST_COLOR_MATRIX_BLUE_BIAS GLfloat 0.0 무한대
GL_POST_COLOR_MATRIX_ALPHA_BIAS GLfloat 0.0 무한대
2010-2 학기 가상현실 60
GL_MAP_COLOR 나 GL_MAP_STENCIL 매개변수가 TRUE 라면 매핑 가능스케일 (scale) 과 편중 (bias) 는 빨강 , 초록 , 파랑 , 알파 , 깊이 구성 요소에 적용될 수 있다 . 예를 들어 , 프로세서 메모리에서 루미넌스 형태로 변환하기
전에 프레임버퍼에서 읽혀진 빨강 , 초록 , 파랑 구성요소를 스케일할 수 있다 .
NTSC 표준에 따라서 RGB 를 루미넌스로 변환할 경우 : GL_RED_SCALE 을 0.3 GL_GREEN_SCALE 은 0.59,
GL_BLUE_SCALE 은 0.11 로 설정
2010-2 학기 가상현실 61
픽셀 매핑
모든 컬러 구성 요소와 컬러 인덱스들 , 스텐실 인덱스들은 스크린 메모리에 위치되기 전에 표를 참고하여 변형 가능
void glPixelMap{ui us f}v(GLenum map,GLint mapsize, const TYPE *values); values 에 의해 지정된 값을 가지는 mapsize 라는 입력값에
의해서 지시되는 픽셀 맵을 불러옴 기본 크기값은 모두 1 이고 , 기본값은 모두 0 각 맵의 크기는 반드시 2 의 거듭제곱이어야 함
맵의 최대 크기는 머신에 따라 다르고 , gtIntegerv() 로 픽셀 맵의 크기를 알아볼 수 있다 : GL_MAX_PIXEL_MAP_TABLE 사용
2010-2 학기 가상현실 62
표 8-6 glPixelMap*() 매개변수의 이름과 값들
맵 이름 주 소 값
GL_PIXEL_MAP_I_TO_I Color index Color index
GL_PIXEL_MAP_S_TO_S Stencil index Stencil index
GL_PIXEL_MAP_I_TO_R Color index R
GL_PIXEL_MAP_I_TO_G Color index G
GL_PIXEL_MAP_I_TO_B Color index B
GL_PIXEL_MAP_I_TO_A Color index A
GL_PIXEL_MAP_R_TO_R R R
GL_PIXEL_MAP_G_TO_G
G G
GL_PIXEL_MAP_B_TO_B B B
GL_PIXEL_MAP_A_TO_A A A
2010-2 학기 가상현실 63
이미지 확대 , 축소 , 반사픽셀 저장 모드와 픽셀 전송 동작이 적용된 후 , 이미지와 비트맵들은 래스터화 됨
일반적으로 , 하나의 이미지에 있는 각각의 픽셀들은 스크린상에서도 한 개의 픽셀로 그려짐
void glPixelZoom(GLfloat zoomx, GLfloat zoomy); 픽셀 쓰기 동작을 하기 위해 확대나 축소 인수를 x,y 차원에서
설정 래스터화 하는 동안에 각 이미지 픽셀은 zoomx * zoomy
사각형으로 간주 zoomx, zoomy 기본 값은 1
2010-2 학기 가상현실 64
픽셀 사각형 읽고 그리기
픽셀 사각형 그리기 과정 : 픽셀을 프레임버퍼 안으로 그리는 작업
1) 픽셀들이 인덱스들이 아닐 경우 , 첫 번째 단계는 구성 요소들을 소수점 포맷으로 변환
2) 포맷이 GL_LUMINANCE 나 GL_LUMINANCE_ALPHA 라면 luminance 요소는 각각의 RGB 구성요소에 luminance 값을 사용해서 RGB 로 변환
3) 각 구성요소 (R, G, B, A, 깊이 ) 는 적절한 크기로 배수화되고 , 적절한 편중값이 더해진다 .
4) GL_MAP_COLOR 가 TRUE 이면 RGBA 구성요소는 [0.0, 1.0] 범위로 묶여짐 , 표의 크기보다 적은 정수 1 로 배수화
5) R, G, B, A 구성요소들을 [0.0, 1.0] 범위로 묶는 것이 안되었다면 그 구성요소 들은 프레임버퍼 구성요소에 연관된 것처럼 비트를 이진 소수점의 왼쪽으로 하는 고정 소수점으로 변환
2010-2 학기 가상현실 65
6) 인덱스 값들을 가지고 작업하는 중이라면 ( 스텐실이나 컬러인덱스값들 ), 우선 고정된 고정 소수점을 이진 소수점의 오른쪽으로 특정화 되지 않은 몇 개의 비트들로 변환
7) RGBA 모드에서는 컬러 인덱스가 GL_PIXEL_MAP_I_TO_R,G,B,A 로 특정화된 컬러 구성 요소를 사용하는 RGBA 로 변환
다른 경우 GL_MAP_COLOR 가 GL_TRUE 이면 컬러 인덱스는 GL_PIXEL_MAP_I_TO_I 표에서 찾을 수 있다 .
8) 인덱스들이 RGBA 로 변환되지 않았다면 인덱스들은 컬러 인덱스나 스텐실 버퍼 중에 적절한 비트들의 숫자로 마스크 된다 .
2010-2 학기 가상현실 66
Byte, short, int, float, data stream(index or component)
unpack
Convert to [0, 1]
RGBA L, Z
Convert L->RGBA
Scale bias Shift offset
RGBA->RGBA lookup Index->RGBA lookup Index->index lookup
Clamp to [0, 1]Mask to [0.0, 2n-1)
RGBA ZIndex(stencil, color index)
1
2
3
4
5
6
7
8
7
2010-2 학기 가상현실 67
픽셀 사각형 읽기 과정1) 읽을 픽셀이 인덱스들이 아닌 경우에 (GL_COLOR_INDEX 나
GL_STENCIL_INDEX 가 아닐 경우 ) 구성 요소들은 [0.0, 1.0] 으로 매핑 , 즉 쓰여질 때와는 정확히 반대가 됨
2) 다음은 스케일과 편중값들이 각 구성요소에 적용 .GL_MAP_COLOR 가 GL_TRUE 이면 다시 [0.0, 1.0] 으로 범위가
묶여짐3) 픽셀들이 인덱스들이면 ( 컬러나 스텐실 ) 그것들은 옮겨지고 ,
오프셋화 되며 , GL_MAP_COLOR 가 GL_TRUE 이면 또한 매핑된다 .4) 저장 공간의 포맷이 GL_COLOR_INDEX, GL_STENCIL_INDEX 이면
픽셀 인덱스는 저장 공간 타입인 (1, 8, 16, 32) 비트 숫자로 마스크 , 이전에 표현되었던 포맷대로 같이 메모리 안에 패킹
5) 저장 공간의 포맷이 구성 요소 종류 중 ( 루미넌스나 RGB) 에 하나일 경우 , 픽셀들은 항상 RGBA 의 인덱스 맵에 의해 매핑
6) 마지막으로 , 인덱스와 구성 요소 데이터들의 결과값은 glPixelStore*() 에 의해 설정된 GL_PACK* 모드에 따라 메모리 안에 묶임
2010-2 학기 가상현실 68
이미지 서브셋이미지 서브셋은 부가적으로 제공하는 픽셀 처리 능력 루틴을 일컫는 말 . 이미지 서브셋의 기능 픽셀값들을 교체하기 위한 컬러 찾기 표의 사용 이미지를 필터링 하기 위한 회선 (convolution) 의 사용 컬러 공간 변환을 하기 위한 컬러 행렬 변형의 사용과 다른 선형
변형의 사용 히스토그램 통계값의 수집 및 이미지들에 대한 최소 , 최대 컬러
구성 요소정보 수집 두 이미지값의 합과 차 , 최소값 , 최대값 계산을 위한 블렌딩
방정식 사용 픽셀 컬러를 변형하기 위해서 상수 블렌딩 인자의 사용
glPixelTransfer*() 와 glPixelMap*() 에 의해 제공되는 것보다 더 높은 픽셀 처리 성능을 원할 경우에 이미지 서브셋 사용
2010-2 학기 가상현실 69
컬러 테이블 프로그램 문제
컬러 테이블은 픽셀의 컬러를 교체하기 위해서 사용하는 색인표응용 프로그램에서는 대비 (contrast) 의 증가 , 필터링 , 이미지 균등화에 이용픽셀 파이프라인의 다른 단계에서 동작하는 가능한 3가지의 컬러 참조표각 컬러 테이블은 표에 있는 매개변수를 넣어 glEnable() 함수를 사용하여 따로 활성화
컬러 테이블 매개변수 픽셀들에서의 동작
GL_COLOR_TABLE 픽셀들이 이미지 파이프라인 안에 들어갈 경우
GL_POST_CONVOLUTION_COLOR_TABLE 회선 후
GL_POST_COLOR_MATRIX_COLOR_TABLE 컬러행렬 변환 수행 후
2010-2 학기 가상현실 70
컬러 테이블 지정하기
컬러 테이블은 일차원 이미지들과 유사하게 지정
glColorTable() 이 각각의 컬러 테이블을 정의하기 위해 사용
void glColorTable(GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *data);
target 이 GL_COLOR_TABLE, GL_POST_CONVOLUTION_COLOR_TABLE, GL_POST_COLOR_MATRIX_COLOR_TABLE 로 설정될 때 지정된 컬러 테이블을 정의
internalformat 변수는 data 의 내부 OpenGL 의 표현을 결정하는데 사용
2010-2 학기 가상현실 71
width, 매개변수는 반드시 2 의 거듭제곱이어야 하며 , 컬러 테이블에서 픽셀들의 숫자를 지시함
format 과 type 은 컬러 테이블 데이터의 데이터 포맷과 타입을 설명
컬러 테이블에서 GL_COLOR_TABLE_SCALE 과 GL_COLOR_TABLE_BIAS 들은 glColorTableParameter*()루틴으로 컬러 테이블을 설정
void glColorTableParameter{if}v(Glenum target, Glenum pname, TYPE *param);
target 매개변수 : GL_COLOR_TABLE, GL_POST_CONVLUTION_COLOR_TABLE, GL_POST_COLOR_MATRIX_COLORTABLE 중 하나
pname: GL_COLOR_TABLE_SCALE, GL_COLOR_TABLE_BIAS
2010-2 학기 가상현실 72
void glCopyColorTable(GLenum target, GLenum internalFormat, GLint x,GLint y, GLsizei width);
target 매개변수는 glColorTable() target 중 하나로 설정되어야 한다 .
glColorTable() internalformat 매개변수와 같은 기호상수 사용
2010-2 학기 가상현실 73
컬러 테이블의 모든 부분 교체하기
컬러 테이블의 한 부분을 교체하려면 컬러 하위 표 커맨드들이 새로운 값이 들어간 컬러 테이블의
임시적인 부분을 다시 읽어낼 수 있어야 함
void glColorSubTable(GLenum target, GLsizei count, GLenum format, GLenum type, const GLvoid *data);
컬러 테이블의 인자들을 start 에서 start + count – 1 까지 data 에 저장한 값으로 교체
void glCopyColorSubTable(Glenum target, Glsizei start, Glint y, Glsizei count);
컬러 테이블의 인자들을 start 에서 start + count – 1까지 프레임버퍼에서 (x, y) 위치에서 시작하는 행으로부터의 count 컬러 픽셀값 들로 교체
2010-2 학기 가상현실 74
컬러 데이블의 값들 질의 (Querying) 하기
컬러 테이블에 저장된 픽셀값들은 glGetColorTable() 로 복구
컬러 테이블 프록시
컬러 테이블의 프록시들은 컬러 테이블을 저장하기 위한 사용 가능한 리소스가 충분한지 알아보기 위해 질문하는 방법 제공
2010-2 학기 가상현실 75
회 선 (convolution) 들 프로그램 문제
회선들은 각 픽셀을 이웃 픽셀들과 자신 픽셀의 가중치화한 평균으로 교체하는 픽셀 필터
회선을 픽셀 가중치의 배열들 , RGBA 픽셀들에서만 동작
void glConvolutionFIlter2D(GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); Target 매개변수가 반드시 GL_CONVOLUTION_2D 인 2 차원 회선 필터를 정의
internalFormat 매개변수는 회선 동작이 수행되는 그리고 glColorTable() 의 internalFormat 매개변수로 사용된 38개의 기호 상수 중의 하나의 픽셀 구성 요소들을 정의
2010-2 학기 가상현실 76
회선 필터들이 RGBA 픽셀 구성 요소에 영향을 주는 방법
접미사 빨강 결과 초록 결과 파랑 결과 알파 결과
GL_ALPHA 변화 없음 변화 없음 변화 없음 As * Af
GL_LUMINANCE Rs * Lf Gs * Lf Bs * Lf 변화 없음
GL_LUMINANCE_ALPHA
Rs * Lf Gs * Lf Bs * Lf As* Af
GL_INTENSITY Rs * Rf Gs * Gf Bs * Bf As* If
GL_RGB RS * Rf Gs * Gf Bs * Bf 변화 없음
GL_RGBA RS * Rf Gs * Gf Bs * Bf As * Af
2010-2 학기 가상현실 77
컬러 테이블과 같이 프레임 버퍼로부터 픽셀값들을 회선 필터로 지정 가능
void glCopyConvolutionFilter2D(GLenum target, GLenum internalFormat, GLint x, GLinty, GLsizei width,GLsizei height);
회선필터의 정의처럼 사용하기 위해 현재의 GL_READ_BUFFER 로 부터 픽셀들의 사각형 복사
컬러프레임버퍼에서 픽셀들로 초기화한 2 차원 회선필터 정의
2010-2 학기 가상현실 78
분리된 2 차원 회선 필터들 지정하기
void glSeparableFilter2D(GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);
회선 필터들은 2 개의 1 차원 필터들의 외부 곱으로 표현 가능하다면 , 분리가 가능
분리된 2 차원 회선 필터를 표현하는 2 개의 1 차원 필터들로 지정하는데 사용
target 은 GL_SEPARABLE_2D 로 설정되어야 함
2010-2 학기 가상현실 79
일차원 회선 필터들
일차원 회선들은 필터의 height 매개변수를 1 로 가정하여 제외한 2 차원 버전과 동일
void glConvolutionFilter1D(GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *image);
일차원 회선 필터를 지정 target 은 GL_CONVOLUTION_ID 로 지정 Width 는 필터안의 픽셀들의 개수로 지정
2010-2 학기 가상현실 80
void glCopyConvolutionFilter(GLenum target, GLenum internalFormat, GLint x,GLint y, GLsizei width);
현재의 GL_READ_BUFFER 로 부터 픽셀들의 행을 복사 internarlFormat 으로 지정하도록 변환
void glConvolutionParameter{if}(GLenum target, GLenum pname, TYPE param);
void glConvolutionParameter{if}v(GLenum target, GLenum pname, const TYPE *param);
회선 필터가 정의될 때 회선 필터는 스케일 되고 편중될 수 있다 .
스케일과 편중 값들은 glConvolutionParameter*() 에 의해 지정
2010-2 학기 가상현실 81
회선 경계 모드
하나의 이미지의 가장자리의 픽셀들의 회선은 내부의 픽셀들에 따라 다르게 다루어짐
회선들은 회선 경계 모드에 의해서 변형 .
GL_REDUCE 모드는 회선 필터의 크기에 의해서 각각의 차원 안에서 축소된 결과 이미지 생성
GL_CONSTANT_BORDER 는 소스 이미지의 바깥쪽의 픽셀들에 대한 상수 픽셀값을 사용해서 경계 픽셀들의 회선을 계산
GL_REPLICATE_BORDER 는 픽셀의 행이나 열이 소스 이미지의 밖에 있는 픽셀들로 사용된 바깥쪽 값들은 제외한 GL_CONSTANT_BORDER 모드에서와 같은 방식으로 계산
2010-2 학기 가상현실 82
후기 회선 동작들
회선 동작이 완결된 후 결과 이미지의 픽셀들은 스케일 되거나 편중될 수 있고 그것들은 [ 0 , 1 ] 의 범위를 클램프 가능
스케일과 편중값들은 glPixelTransfer*() 를 GL_POST_CONVOLUTION_*_SCALE 이나 GL_POST_CONVOLUTION_*_BIAS 를 사용하여 호출 지정
컬러 행렬
컬러 공간 회선들과 픽셀값들에서의 선형 변형을 위해서 glMatrixMode(GL_COLOR) 를 설정해서 선택한 이미지 서브셋은 4 * 4 크기의 행렬 스택을 제공
2010-2 학기 가상현실 83
후기 컬러 행렬 변환 동작
후기 회선 동작들과 비슷하게 , 픽셀들은 컬러 행렬 단계 이후에 스케일 되거나 편중될 수 있다 .
후기 컬러 행렬 동작의 스케일과 편중값들을 정의하는 glPixelTransfer*() 호출
픽셀값은 스케일과 편중 동작을 하고 나면 [ 0 , 1 ] 범위로 클램프
2010-2 학기 가상현실 84
히스토그램 프로그램 문제
이미지 서브셋을 사용하여 이미지에 대한 통계값들을 수집가능
void glHistrogram(GLenum target, GLsizei width, GLenum internalFormat, GLboolean sink);
히스토그램으로 만들길 원하거나 , 이미지를 계속적으로 처리하거나 , 통계값들을 수집할 경우 , 이미지의 구성요소를 지정
이미지의 히스토그램 데이터가 저장되는 방법을 정의 target 매개변수는 GL_HISTOGRAM 이나
GL_PROXY_HISTOGRAM 으로 설정해야 함
2010-2 학기 가상현실 85
glDrawPixels() 를 사용 , 이미지 파이프라인에서 픽셀들을 처리 후 glGetHistogram() 을 사용 , 히스토그램의 결과를 되살릴 수 있음
void glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); 수집한 히스토그램 통계값들을 반환 히스토그램의 값들의 변환과 더불어 히스토그램의 내부 저장을
재설정
void glResetHistogram(GLenum target); 히스토그램의 카운터를 0 으로 재설정
2010-2 학기 가상현실 86
최대 , 최소
glMinmax() 는 픽셀 사각형의 최소 , 최대 픽셀 구성 요소값들을 계산
glHistogram() 에서와 같이 최대 , 최소값들을 계산 , 이미지를 표현하거나 픽셀들을 버릴 수 있다 .
void glMinmax(GLenum target, GLenum internalFormat, GLboolean sink);
이미지의 최대 , 최소 픽셀값들을 계산 target 은 GL_MINMAX 여야 함 internalFormat 은 계산되어야 하는 컬러 구성요소의 최대 ,
최소값들을 지정
2010-2 학기 가상현실 87
void glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid*values);
최대 , 최소 동작의 결과값을 반환 . target 은 GL_MINMAX 여야 함 Reset 매개변수가 GL_TRUE 라면 최대 , 최소값들은 그것들의
초기값들로 재설정
void glResetMinmax(GLenum target);
이 루틴을 호출해서 내부 테이블을 명시적으로 재설정 최대 , 최소값을 재설정
2010-2 학기 가상현실 88
이하 생략
블렌딩 방정식을 이용하여 픽셀들 결합하기
픽셀들과 조각들에서의 이미지 서브셋 인수화 방법은 수학적 조합을 정의해서 섞여질 수 있다 .
glBlendEquation() 루틴은 블랜드 프레임버퍼 픽셀들과 컬러 조각들을 사용해서 동작들을 변형시키는 방법을 지정
void glBlendEquation(GLenum mode); 프레임버퍼와 소스 컬러들이 함께 섞여지는 방법을 지정 mode 값
GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC__REVERSE_SUBTRACT,GL_MIN, GL_MAX
2010-2 학기 가상현실 89
이미지 서브셋 블렌딩 모드와 연계된 수학적 연산들
접 미 사 데 이 터 타 입
GL_FUNC_ADD CsS + CdD
GL_FUNC_SUBTRACT CsS + CdD
GL_FUNC_REVERSE_SUBTRACT
CdD – CsS
GL_MIN min(CsS, CdD)
GL_MAX max(CsS, CdD)
2010-2 학기 가상현실 90
상수 블랜딩 요소들
이미지 서브셋은 glBlendFunc() 에서 사용되는 몇 개의 부가적인 블랜딩 요소들을 제공
상 수 관련된 요소 계산된 블랜드 요소
GL_CONSTANT_COLOR 입력값 또는 기존값 (Rc, Gc, Bc, Ac)
GL_ONE_MINUS_CONSTANT_COLOR
입력값 또는 기존값 (1,1,1,1)-(Rc, Gc, Bc, Ac)
GL_CONSTANT_ALPHA 입력값 또는 기존값 (Ac, Ac, Ac, Ac)
GL_ONE_MINUS_CONSTANT_ALPHA
입력값 또는 기존값 (1,1,1,1)-(Ac, Ac, Ac, Ac)