픽셀 , 비트맵 , 폰트 , 이미지 그리기

90
픽픽 , 픽픽픽 , 픽픽 , 픽픽픽 픽픽픽

Upload: kiele

Post on 20-Jan-2016

147 views

Category:

Documents


0 download

DESCRIPTION

픽셀 , 비트맵 , 폰트 , 이미지 그리기. 내용. 비트맵과 폰트 이미지 이미지 파이프라인 픽셀 사각형을 읽고 그리기 픽셀 그리기 비율을 개선하는 팁들 ( 비법 ) 이미지의 서브셋. 비트맵과 이미지. 둘 다 픽셀 사각형 배열 형식 비트맵 폰트에 있는 문자에 전형적으로 사용됨 각 픽셀에 대한 단일한 비트 정보로 구성 이미지 데이터 스캔되거나 계산될 수 있다 . 각 픽셀마다 여러 개의 데이터 조각 (R, G, B, A 포함 ). 비트맵과 폰트. 비트맵과 폰트 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

픽셀 , 비트맵 , 폰트 , 이미지 그리기

Page 2: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

2010-2 학기 가상현실 2

내용

비트맵과 폰트

이미지

이미지 파이프라인

픽셀 사각형을 읽고 그리기

픽셀 그리기 비율을 개선하는 팁들 ( 비법 )

이미지의 서브셋

Page 3: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

2010-2 학기 가상현실 3

비트맵과 이미지

둘 다 픽셀 사각형 배열 형식

비트맵 폰트에 있는 문자에 전형적으로 사용됨 각 픽셀에 대한 단일한 비트 정보로 구성

이미지 데이터 스캔되거나 계산될 수 있다 . 각 픽셀마다 여러 개의 데이터 조각 (R, G, B, A 포함 )

Page 4: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

2010-2 학기 가상현실 4

비트맵과 폰트

비트맵과 폰트

비트맵은 윈도우의 사각형 구역을 마스크 효과처럼 0 과 1 로 표시하여 구성한 사각형 배열

비트맵을 사용하는 일반적인 경우는 스크린에 문자들을 그리는 경우

glRasterPos*() 와 glBitmap() 스크린상에 하나의 비트맵을 위치시키고 , 그리는 명령

Page 5: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

2010-2 학기 가상현실 5

그림 8-1 비트맵으로 그린 F 와 데이터

0xc0, 0x000xc0, 0x00

0xff, 0xc00xff, 0xc0

Page 6: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

2010-2 학기 가상현실 6

h=12

w=10

0, 0 11, 0

(xbo, ybo) = (0, 0)(xbi, ybi) = (11, 0)

Page 7: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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);}

Page 8: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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);}

Page 9: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

2010-2 학기 가상현실 9

void keyboard(unsigned char key, int x, int y){ switch (key) { case 27: exit(0); }}

Page 10: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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;}

Page 11: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

2010-2 학기 가상현실 11

F 라는 문자가 최대 10 만큼의 너비로 표현비트맵 데이터는 항상 8 비트의 배수형으로 저장된다 .비트맵을 만드는 비트들은 왼쪽 아래부터 그려짐 . 처음에 제일 아래 줄부터 그려짐 래스터 배열은 F 의 아래 2 줄을 표현하는 0xc0, 0x00, 0xc0,

0x00 으로 시작해서 맨 위의 두 줄인 0xff, 0xc0, 0xff, 0xc0까지

Page 12: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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 사용

Page 13: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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 를 지칭

Page 14: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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 로 설정

Page 15: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

2010-2 학기 가상현실 15

폰트와 디스플레이 목록

하나의 폰트는 일반적으로 각 문자가 식별 숫자 (ASCII 코드 ) 와 폰트의 그려지는 방법을 포함한 일련의 문자들의 조합으로 구성

glCallLists() 를 다음과 같은 방법으로 사용 가능 void glCallLists(GLsizei n, GLenum type, const GLvoid

*list); n 은 그려질 문자들의 개수 , type 는 보통 GL_BYTE, list 는

문자 코드들의 배열이다 .

오프셋을 설정하기 위해서 glLIstBase() 라는 커맨드 이용 glGenLists(GLsizei range) 로 유효한 인덱스 번호를 얻음

이 함수는 디스플레이 리스트 식별자인 range 라는 범위에 해당되는 리스트를 반환

Page 16: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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},

Page 17: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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},

Page 18: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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},

Page 19: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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},

Page 20: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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);

Page 21: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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();}

Page 22: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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);

Page 23: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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);}

Page 24: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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; }

Page 25: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

2010-2 학기 가상현실 25

이미지

이미지는 비트맵과 유사하지만 사각형 영역에서 각 픽셀이 하나의 비트만을 포함하는 것이 아니라 보다 많은 정보 포함 예를 들어 이미지는 각 픽셀마다 완전한 RGBA 컬러를 저장

보통 그림으로 생각되는 이미지는 컬러버퍼에서 나옴깊이 버퍼나 스텐실 버퍼로부터 픽셀 데이터의 사각형 영역을 읽거나 쓸 수 있다 .

스크린상에 표시되는 것 이외에도 텍스처매핑에도 사용될 수 있다 .

Page 26: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

2010-2 학기 가상현실 26

픽셀 데이터 읽기 , 쓰기 , 복사하기

glReadPixels() 프레임 버퍼로부터 픽셀들의 사각형 배열을 읽고 , 메모리 안에

데이터 저장

glDrawPixels() 프로세서 메모리에 유지되고 있는 데이터로부터

glRasterPos*() 에 의해서 표시되는 현재의 래스터 위치의 프레임버퍼 안에 픽셀들의 사각형 배열을 씀

glCopyPIxels() 프레임 버퍼의 한 부분에서 다른 부분으로 픽셀들의 사각형

배열을 복사

Page 27: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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 은 각 요소들의 데이터 종류

Page 28: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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 한 개의 깊이 구성 요소

Page 29: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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 비트 정수로 묶여짐

Page 30: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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 비트 정수로 묶여짐

Page 31: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

2010-2 학기 가상현실 31

묶여진 데이터 타입 각 픽셀들의 모든 컬러 구성 요소가 하나의 부호 없는 데이터

타입으로 압축 바이트 한 개 , short 정수형 , 또는 표준 정수 타입

(GL_UNSIGNED_BYTE_*, GL_UNSIGNED_SHORT_*, GL_UNSIGNED_INT_*) 등으로 시작하는 상수들에 의해 표시

묶여진 픽셀 데이터의 비트 범위 위치에서의 컬러값들의 순서 _REV 가 없는 경우

컬러 구성 요소들은 첫 번째 컬러 성분이 차지하고 있는 가장 중요한 장소에 할당

_REV 가 있는 경우 첫 번째 컬러 성분이 least significant 위치에 시작되면서

성분의 패킹 순서가 반대로 됨

Page 32: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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

Page 33: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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

Page 34: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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

Page 35: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

2010-2 학기 가상현실 35

프로세서 메모리로부터 프레임 버퍼에 픽셀 데이터 쓰기

void glDrawpixels(GLsizei width, Glsizei height, GLenum format, GLenum type, const GLvoid, *pixels);

픽셀 데이터의 사각형을 width 와 height 크기로 그림 픽셀 사각형은 현재 래스터 위치를 왼쪽 아래 모서리

지점으로 지정하여 그린다 . format 과 type 은 glReadRixels() 와 같은 의미

Page 36: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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;

Page 37: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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; } }}

Page 38: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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();}

Page 39: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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();}

Page 40: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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 ();}

Page 41: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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;

Page 42: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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; }}

Page 43: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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; }

Page 44: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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

Page 45: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

2010-2 학기 가상현실 45

이미지 파이프라인픽셀 이동 동작과 픽셀 저장 모드 설명

glPixelZoom() 함수를 호출해서 픽셀 사각형이 그려지기 전에 확대하거나 축소할 수 있다 .

glDrawPixels() 가 호출될 때 데이터는 실제로 픽셀 저장 모드를 따라 메모리로부터 묶임이 풀려짐 (unpack)

픽셀 이동 연산들이 수행 , 픽셀 결과값은 래스터화 됨 래스터화 되는 동안 픽셀 사각형은 현재의 상태에 따라서 확대 , 축소

마지막으로 조각 연산이 제공 , 픽셀들은 프레임 버퍼에 쓰여짐

glReadPixels() 데이터가 프레임버퍼로부터 읽혀지며 픽셀 이동 동작이

수행되고 , 데이터의 결과값은 프로세서 메모리 안으로 묶여짐 (pack)

Page 46: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

2010-2 학기 가상현실 46

glCopyPixels() glReadPixels() 이 어떤 연산을 하는 동안에 모든 픽셀 이동 동작을 사용한다 .

Page 47: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

2010-2 학기 가상현실 47

이미지 파이프라인ProcessorMemory

Pixel storagemodels

Pixel-transferOperations

(and pixel map) Rasterization(including pixel zoom)

Per-fragmentoperations

Frame buffer

unpack Texturememory

pack

Page 48: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

2010-2 학기 가상현실 48

픽셀 패킹과 언패킹

패킹 (packing 묶기 ) 과 언패킹 (unpacking, 묶기 해제 ) 은 픽셀 데이터가 프로세서 메모리로 쓰거나 프로세서 메모리에서 읽혀지는 방법과 관계 메모리에 저장되는 이미지는 elements 라고 불리는 1 개에서 4개 사이의 데이터 덩어리를 가진다 .

픽셀 데이터나 포맷은 각 픽셀마다 저장하는 요소들의 숫자를 결정하거나 순서를 결정하여 정렬한다 .

구성요소는 8 비트 바이트에서 32 비트 정수까지 , 또는 소수점 숫자 등 여러 가지의 데이터 타입으로 메모리에 저장될 수 있다 .

Page 49: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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(),…

Page 50: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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 음이 아닌 정수

Page 51: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

2010-2 학기 가상현실 51

*SWAP_BYTES 매개변수가 FALSE( 기본값 ) 일 경우 , 메모리상의 바이트 순서는 OpenGL 의 본래 값기본값이 아닐 경우는 바이트가 역순서가 됨GLubyte 는 8 비트 , GLushort 는 16 비트 , GLuint 는 32 비트단일 바이트 교환은 아무런 효과가 없다 .

Page 52: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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

Page 53: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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 }

Page 54: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

2010-2 학기 가상현실 54

*ROW_LENGTH 매개변수 메모리상에 , 저장된 이미지 데이터의 부분 사각형을 읽거나

그릴 경우 사용 *ROW_LENGTH 가 0 이면 행의 길이는 glReadPixels(),

glDrawPixels(), glCopyPixels() 로 설명된 너비와 같다 .*SKIP_ROWS , *SKIP_PIXELS 를 이용하여 건너뛰는 행과 열의 숫자 설정 , 왼쪽 아래 모서리부터 시작됨 .*ALIGNMENT 가 1 로 설정된다면 다음 순서의 사용 가능한 바이트가 사용된다 . 2 로 설정되면 다음 행의 첫 번째 바이트가 2 의 배수인 주소를

가지게 된다 .*IMAGE_HEIGHT 와 SKIP_IMAGES 는 3차원 텍스처를 정의하고 질의하는 경우에만 영향을 준다 .

Page 55: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

2010-2 학기 가상현실 55

*SKIP_ROWS, *SKIP_PIXELS, *ROW_LENGTH

subimage

ROW_LENGTH

*SKIP_PIXELS

*SKIP_ROWS

Page 56: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

2010-2 학기 가상현실 56

픽셀 전송 동작

이미지 데이터는 메모리에서 프레임버퍼로 전송되거나 , 프레임버퍼에서 메모리 안으로 전송이 과정에서 여러가지 연산을 수행할 수 있다 : 구성 요소의 범위 변경 등 : 빨강 구성 요소가 0.0 ~ 1.0 인데

다른 범위로 바꿀 수 있음glPixelTransfer*(), glPixelMap*() 커맨드를 통해서 전송동작수행

void glPixelTransfer{if}(GLenum pname, TYPE param); glDrawPixels(), glReadPixels(), glCopyPixels(),

glTexImage1D(), glTexImage2D(), glTexImage3D(), glCopyTexImage1D(), glCopyTexSubImage1D(), … 등의 동작에 영향을 주는 픽셀 전송 모드를 설정

Page 57: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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 무한대

Page 58: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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 무한대

Page 59: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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 무한대

Page 60: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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 로 설정

Page 61: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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 사용

Page 62: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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

Page 63: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

2010-2 학기 가상현실 63

이미지 확대 , 축소 , 반사픽셀 저장 모드와 픽셀 전송 동작이 적용된 후 , 이미지와 비트맵들은 래스터화 됨

일반적으로 , 하나의 이미지에 있는 각각의 픽셀들은 스크린상에서도 한 개의 픽셀로 그려짐

void glPixelZoom(GLfloat zoomx, GLfloat zoomy); 픽셀 쓰기 동작을 하기 위해 확대나 축소 인수를 x,y 차원에서

설정 래스터화 하는 동안에 각 이미지 픽셀은 zoomx * zoomy

사각형으로 간주 zoomx, zoomy 기본 값은 1

Page 64: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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] 범위로 묶는 것이 안되었다면 그 구성요소 들은 프레임버퍼 구성요소에 연관된 것처럼 비트를 이진 소수점의 왼쪽으로 하는 고정 소수점으로 변환

Page 65: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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 로 변환되지 않았다면 인덱스들은 컬러 인덱스나 스텐실 버퍼 중에 적절한 비트들의 숫자로 마스크 된다 .

Page 66: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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

Page 67: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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* 모드에 따라 메모리 안에 묶임

Page 68: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

2010-2 학기 가상현실 68

이미지 서브셋이미지 서브셋은 부가적으로 제공하는 픽셀 처리 능력 루틴을 일컫는 말 . 이미지 서브셋의 기능 픽셀값들을 교체하기 위한 컬러 찾기 표의 사용 이미지를 필터링 하기 위한 회선 (convolution) 의 사용 컬러 공간 변환을 하기 위한 컬러 행렬 변형의 사용과 다른 선형

변형의 사용 히스토그램 통계값의 수집 및 이미지들에 대한 최소 , 최대 컬러

구성 요소정보 수집 두 이미지값의 합과 차 , 최소값 , 최대값 계산을 위한 블렌딩

방정식 사용 픽셀 컬러를 변형하기 위해서 상수 블렌딩 인자의 사용

glPixelTransfer*() 와 glPixelMap*() 에 의해 제공되는 것보다 더 높은 픽셀 처리 성능을 원할 경우에 이미지 서브셋 사용

Page 69: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

2010-2 학기 가상현실 69

컬러 테이블 프로그램 문제

컬러 테이블은 픽셀의 컬러를 교체하기 위해서 사용하는 색인표응용 프로그램에서는 대비 (contrast) 의 증가 , 필터링 , 이미지 균등화에 이용픽셀 파이프라인의 다른 단계에서 동작하는 가능한 3가지의 컬러 참조표각 컬러 테이블은 표에 있는 매개변수를 넣어 glEnable() 함수를 사용하여 따로 활성화

컬러 테이블 매개변수 픽셀들에서의 동작

GL_COLOR_TABLE 픽셀들이 이미지 파이프라인 안에 들어갈 경우

GL_POST_CONVOLUTION_COLOR_TABLE 회선 후

GL_POST_COLOR_MATRIX_COLOR_TABLE 컬러행렬 변환 수행 후

Page 70: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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 의 표현을 결정하는데 사용

Page 71: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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

Page 72: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

2010-2 학기 가상현실 72

void glCopyColorTable(GLenum target, GLenum internalFormat, GLint x,GLint y, GLsizei width);

target 매개변수는 glColorTable() target 중 하나로 설정되어야 한다 .

glColorTable() internalformat 매개변수와 같은 기호상수 사용

Page 73: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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 컬러 픽셀값 들로 교체

Page 74: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

2010-2 학기 가상현실 74

컬러 데이블의 값들 질의 (Querying) 하기

컬러 테이블에 저장된 픽셀값들은 glGetColorTable() 로 복구

컬러 테이블 프록시

컬러 테이블의 프록시들은 컬러 테이블을 저장하기 위한 사용 가능한 리소스가 충분한지 알아보기 위해 질문하는 방법 제공

Page 75: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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개의 기호 상수 중의 하나의 픽셀 구성 요소들을 정의

Page 76: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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

Page 77: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

2010-2 학기 가상현실 77

컬러 테이블과 같이 프레임 버퍼로부터 픽셀값들을 회선 필터로 지정 가능

void glCopyConvolutionFilter2D(GLenum target, GLenum internalFormat, GLint x, GLinty, GLsizei width,GLsizei height);

회선필터의 정의처럼 사용하기 위해 현재의 GL_READ_BUFFER 로 부터 픽셀들의 사각형 복사

컬러프레임버퍼에서 픽셀들로 초기화한 2 차원 회선필터 정의

Page 78: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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 로 설정되어야 함

Page 79: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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 는 필터안의 픽셀들의 개수로 지정

Page 80: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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*() 에 의해 지정

Page 81: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

2010-2 학기 가상현실 81

회선 경계 모드

하나의 이미지의 가장자리의 픽셀들의 회선은 내부의 픽셀들에 따라 다르게 다루어짐

회선들은 회선 경계 모드에 의해서 변형 .

GL_REDUCE 모드는 회선 필터의 크기에 의해서 각각의 차원 안에서 축소된 결과 이미지 생성

GL_CONSTANT_BORDER 는 소스 이미지의 바깥쪽의 픽셀들에 대한 상수 픽셀값을 사용해서 경계 픽셀들의 회선을 계산

GL_REPLICATE_BORDER 는 픽셀의 행이나 열이 소스 이미지의 밖에 있는 픽셀들로 사용된 바깥쪽 값들은 제외한 GL_CONSTANT_BORDER 모드에서와 같은 방식으로 계산

Page 82: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

2010-2 학기 가상현실 82

후기 회선 동작들

회선 동작이 완결된 후 결과 이미지의 픽셀들은 스케일 되거나 편중될 수 있고 그것들은 [ 0 , 1 ] 의 범위를 클램프 가능

스케일과 편중값들은 glPixelTransfer*() 를 GL_POST_CONVOLUTION_*_SCALE 이나 GL_POST_CONVOLUTION_*_BIAS 를 사용하여 호출 지정

컬러 행렬

컬러 공간 회선들과 픽셀값들에서의 선형 변형을 위해서 glMatrixMode(GL_COLOR) 를 설정해서 선택한 이미지 서브셋은 4 * 4 크기의 행렬 스택을 제공

Page 83: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

2010-2 학기 가상현실 83

후기 컬러 행렬 변환 동작

후기 회선 동작들과 비슷하게 , 픽셀들은 컬러 행렬 단계 이후에 스케일 되거나 편중될 수 있다 .

후기 컬러 행렬 동작의 스케일과 편중값들을 정의하는 glPixelTransfer*() 호출

픽셀값은 스케일과 편중 동작을 하고 나면 [ 0 , 1 ] 범위로 클램프

Page 84: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

2010-2 학기 가상현실 84

히스토그램 프로그램 문제

이미지 서브셋을 사용하여 이미지에 대한 통계값들을 수집가능

void glHistrogram(GLenum target, GLsizei width, GLenum internalFormat, GLboolean sink);

히스토그램으로 만들길 원하거나 , 이미지를 계속적으로 처리하거나 , 통계값들을 수집할 경우 , 이미지의 구성요소를 지정

이미지의 히스토그램 데이터가 저장되는 방법을 정의 target 매개변수는 GL_HISTOGRAM 이나

GL_PROXY_HISTOGRAM 으로 설정해야 함

Page 85: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

2010-2 학기 가상현실 85

glDrawPixels() 를 사용 , 이미지 파이프라인에서 픽셀들을 처리 후 glGetHistogram() 을 사용 , 히스토그램의 결과를 되살릴 수 있음

void glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); 수집한 히스토그램 통계값들을 반환 히스토그램의 값들의 변환과 더불어 히스토그램의 내부 저장을

재설정

void glResetHistogram(GLenum target); 히스토그램의 카운터를 0 으로 재설정

Page 86: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

2010-2 학기 가상현실 86

최대 , 최소

glMinmax() 는 픽셀 사각형의 최소 , 최대 픽셀 구성 요소값들을 계산

glHistogram() 에서와 같이 최대 , 최소값들을 계산 , 이미지를 표현하거나 픽셀들을 버릴 수 있다 .

void glMinmax(GLenum target, GLenum internalFormat, GLboolean sink);

이미지의 최대 , 최소 픽셀값들을 계산 target 은 GL_MINMAX 여야 함 internalFormat 은 계산되어야 하는 컬러 구성요소의 최대 ,

최소값들을 지정

Page 87: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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);

이 루틴을 호출해서 내부 테이블을 명시적으로 재설정 최대 , 최소값을 재설정

Page 88: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

2010-2 학기 가상현실 88

이하 생략

블렌딩 방정식을 이용하여 픽셀들 결합하기

픽셀들과 조각들에서의 이미지 서브셋 인수화 방법은 수학적 조합을 정의해서 섞여질 수 있다 .

glBlendEquation() 루틴은 블랜드 프레임버퍼 픽셀들과 컬러 조각들을 사용해서 동작들을 변형시키는 방법을 지정

void glBlendEquation(GLenum mode); 프레임버퍼와 소스 컬러들이 함께 섞여지는 방법을 지정 mode 값

GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC__REVERSE_SUBTRACT,GL_MIN, GL_MAX

Page 89: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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)

Page 90: 픽셀 ,  비트맵 ,  폰트 ,  이미지 그리기

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)