Presentation is loading. Please wait.

Presentation is loading. Please wait.

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

Similar presentations


Presentation on theme: "픽셀, 비트맵, 폰트, 이미지 그리기."— Presentation transcript:

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

2 내용 비트맵과 폰트 이미지 이미지 파이프라인 픽셀 사각형을 읽고 그리기 픽셀 그리기 비율을 개선하는 팁들(비법)
이미지의 서브셋 2010-2학기 가상현실

3 비트맵과 이미지 둘 다 픽셀 사각형 배열 형식 비트맵 폰트에 있는 문자에 전형적으로 사용됨
각 픽셀에 대한 단일한 비트 정보로 구성 이미지 데이터 스캔되거나 계산될 수 있다. 각 픽셀마다 여러 개의 데이터 조각(R, G, B, A 포함) 2010-2학기 가상현실

4 비트맵과 폰트 비트맵과 폰트 비트맵은 윈도우의 사각형 구역을 마스크 효과처럼 0과 1로 표시하여 구성한 사각형 배열
비트맵을 사용하는 일반적인 경우는 스크린에 문자들을 그리는 경우 glRasterPos*()와 glBitmap() 스크린상에 하나의 비트맵을 위치시키고, 그리는 명령 2010-2학기 가상현실

5 그림8-1 비트맵으로 그린 F와 데이터 0xff, 0xc0 0xc0, 0x00 2010-2학기 가상현실

6 w=10 h=12 (xbo, ybo) = (0, 0) (xbi, ybi) = (11, 0) 0, 0 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 glClear(GL_COLOR_BUFFER_BIT); glColor3f (1.0, 1.0, 1.0);
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); 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 비트맵 데이터는 항상 8비트의 배수형으로 저장된다.
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 void makeRasterFont(void) { GLuint i, j;
{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); 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 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_BYTE_2_3_3_REV 부호 없는 16비트 정수로 묶여짐 GL_UNSIGNED_SHORT_5_6_5 GL_UNSIGNED_ SHORT_5_6_5_REV GL_UNSIGNED_ SHORT_4_4_4_4 GL_UNSIGNED_ SHORT_ 4_4_4_4_REV GL_UNSIGNED_ SHORT_5_5_5_1 GL_UNSIGNED_ SHORT_1_5_5_5_REV GL_UNSIGNED_INT_8_8_8_8 부호 없는 32비트 정수로 묶여짐 GL_UNSIGNED_INT_8_8_8_8_REV GL_UNSIGNED_INT_10_10_10_2 GL_UNSIGNED_INT_ 10_10_10_2_REV 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_UNSIGNED_SHORT_5_6_5 GL_UNSIGNED_ SHORT_5_6_5_REV GL_UNSIGNED_ SHORT_4_4_4_4 GL_RGBA, GL_BGRA GL_UNSIGNED_ SHORT_5_5_5_1 GL_UNSIGNED_ SHORT_1_5_5_5_REV GL_UNSIGNED_INT_8_8_8_8 GL_UNSIGNED_INT_8_8_8_8_REV GL_UNSIGNED_INT_10_10_10_2 GL_UNSIGNED_INT_10_10_10_2_REV 2010-2학기 가상현실

33 묶여진 데이터 타입과 픽셀 포맷들에 대한 구성 요소의 순서
GL_UNSIGNED_BYTE_3_3_2 with GL_RGB Red Green Blue GL_UNSIGNED_BYTE_2_3_3_REV with GL_RGB Blue Green Red GL_UNSIGNED_SHORT_4_4_4_4 with GL_RGBA Red Green Blue Alpha 2010-2학기 가상현실

34 GL_UNSIGNED_SHORT_4_4_4_4 with GL_BGRA
Blue Green Red Alpha GL_UNSIGNED_SHORT_4_4_4_4_REV with GL_RGBA Alpha Blue Green Red GL_UNSIGNED_SHORT_4_4_4_4_REV with GL_BGRA Alpha Red Green 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 glShadeModel(GL_FLAT); makeCheckImage();
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); } 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); 2010-2학기 가상현실

42 printf ("zoomFactor is now %4.1f\n", zoomFactor); break; case 27:
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); default: } 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 glReadPixels()이 어떤 연산을 하는 동안에 모든 픽셀 이동 동작을 사용한다.
glCopyPixels() glReadPixels()이 어떤 연산을 하는 동안에 모든 픽셀 이동 동작을 사용한다. 2010-2학기 가상현실

47 (including pixel zoom)
이미지 파이프라인 Processor Memory Texture memory unpack Pixel storage models pack Pixel-transfer Operations (and pixel map) Rasterization (including pixel zoom) Per-fragment operations Frame buffer 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 GL_UNPACK_ROW_LENGTH. GL_PACK_ ROW_LENGTH GLint 음이 아닌 정수 GL_UNPACK_SKIP_ROWS, GL_PACK_ SKIP_ROWS GL_UNPACK_SKIP_PIXELS, GL_PACK_ SKIP_PIXELS GL_UNPACK_ALIGNMENT GL_PACK_ ALIGNMENT 4 1, 2, 4, 8 GL_UNPACK_IMAGE_HEIGHT GL_PACK_ IMAGE_HEIGHT GL_UNPACK_SKIP_IMAGES GL_PACK_SKIP_IMAGES 2010-2학기 가상현실

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

52 Byte, short, integer 데이터의 바이트 교환
Short(byte0) Short(byte1) Short(byte0) Short(byte1) Integer(byte0) Integer(byte1) Integer(byte2) Integer(byte3) Integer(byte3) Integer(byte2) Integer(byte1) Integer(byte0) 2010-2학기 가상현실

53 *LSB_FIRST 매개변수는 각 픽셀들의 데이터 비트가 저장되거나 복구될 때 적용
*LSB_FIRST가 FALSE 이고 바이트가 0x31 의 경우 비트의 순서는 { } *LSB_FIRST가 TRUE이면 비트의 순서는 { } 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 *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 GL_INDEX_SHIFT GLint 무한대 GL_INDEX_OFFSET GL_RED_SCALE GLfloat 1.0 GL_GREEN_SCALE GL_BLUE_SCALE GL_ALPHA_SCALE 2010-2학기 가상현실

58 GL_POST_CONVOLUTION_RED_SCALE
매개변수 이름 타입 초기값 적합한 범위 GL_DEPTH_SCALE GLfloat 1.0 무한대 GL_RED_BIAS 0.0 GL_GREEN_BIAS GL_BULE_BIAS GL_ALPHA_BIAS GL_DEPTH_BIAS GL_POST_CONVOLUTION_RED_SCALE GL_POST_CONVOLUTION_GREEN_SCALE GL_POST_CONVOLUTION_BLUE_SCALE GL_POST_CONVOLUTION_ALPHA_SCALE 2010-2학기 가상현실

59 GL_POST_CONVOLUTION_RED_BIAS GLfloat 0.0 무한대
매개변수 이름 타입 초기값 적합한 범위 GL_POST_CONVOLUTION_RED_BIAS GLfloat 0.0 무한대 GL_POST_CONVOLUTION_GREEN_BIAS GL_POST_CONVOLUTION_BLUE_BIAS GL_POST_CONVOLUTION_ALPHA_BIAS GL_POST_COLOR_MATRIX_RED_SCALE 1.0 GL_POST_COLOR_MATRIX_GREEN_SCALE GL_POST_COLOR_MATRIX_BLUE_SCALE GL_POST_COLOR_MATRIX_ALPHA_SCALE GL_POST_COLOR_MATRIX_RED_BIAS GL_POST_COLOR_MATRIX_GREEN_BIAS GL_POST_COLOR_MATRIX_BLUE_BIAS GL_POST_COLOR_MATRIX_ALPHA_BIAS 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 GL_PIXEL_MAP_S_TO_S Stencil index GL_PIXEL_MAP_I_TO_R R GL_PIXEL_MAP_I_TO_G G GL_PIXEL_MAP_I_TO_B B GL_PIXEL_MAP_I_TO_A A GL_PIXEL_MAP_R_TO_R GL_PIXEL_MAP_G_TO_G GL_PIXEL_MAP_B_TO_B GL_PIXEL_MAP_A_TO_A 2010-2학기 가상현실

63 이미지 확대, 축소, 반사 픽셀 저장 모드와 픽셀 전송 동작이 적용된 후, 이미지와 비트맵들은 래스터화 됨
일반적으로, 하나의 이미지에 있는 각각의 픽셀들은 스크린상에서도 한 개의 픽셀로 그려짐 void glPixelZoom(GLfloat zoomx, GLfloat zoomy); 픽셀 쓰기 동작을 하기 위해 확대나 축소 인수를 x,y차원에서 설정 래스터화 하는 동안에 각 이미지 픽셀은 zoomx * zoomy 사각형으로 간주 zoomx, zoomy 기본 값은 1 2010-2학기 가상현실

64 픽셀 사각형 읽고 그리기 픽셀 사각형 그리기 과정: 픽셀을 프레임버퍼 안으로 그리는 작업
픽셀들이 인덱스들이 아닐 경우, 첫 번째 단계는 구성 요소들을 소수점 포맷으로 변환 포맷이 GL_LUMINANCE 나 GL_LUMINANCE_ALPHA 라면 luminance 요소는 각각의 RGB구성요소에 luminance값을 사용해서 RGB로 변환 각 구성요소(R, G, B, A, 깊이)는 적절한 크기로 배수화되고, 적절한 편중값이 더해진다. GL_MAP_COLOR가 TRUE 이면 RGBA 구성요소는 [0.0, 1.0] 범위로 묶여짐, 표의 크기보다 적은 정수 1로 배수화 R, G, B, A 구성요소들을 [0.0, 1.0] 범위로 묶는 것이 안되었다면 그 구성요소 들은 프레임버퍼 구성요소에 연관된 것처럼 비트를 이진 소수점의 왼쪽으로 하는 고정 소수점으로 변환 2010-2학기 가상현실

65 8) 인덱스들이 RGBA로 변환되지 않았다면 인덱스들은 컬러 인덱스나 스텐실 버퍼 중에 적절한 비트들의 숫자로 마스크 된다.
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 RGBA L, Z 1 Convert to [0, 1] 2 Convert L->RGBA 6 Scale bias Shift offset 3 RGBA->RGBA lookup Index->RGBA lookup Index->index lookup 7 4 7 Mask to [0.0, 2n-1) 8 5 Clamp to [0, 1] Index(stencil, color index) RGBA Z 2010-2학기 가상현실

67 다음은 스케일과 편중값들이 각 구성요소에 적용.
픽셀 사각형 읽기 과정 읽을 픽셀이 인덱스들이 아닌 경우에(GL_COLOR_INDEX 나 GL_STENCIL_INDEX가 아닐 경우) 구성 요소들은 [0.0, 1.0] 으로 매핑, 즉 쓰여질 때와는 정확히 반대가 됨 다음은 스케일과 편중값들이 각 구성요소에 적용. GL_MAP_COLOR가 GL_TRUE이면 다시 [0.0, 1.0]으로 범위가 묶여짐 픽셀들이 인덱스들이면(컬러나 스텐실) 그것들은 옮겨지고, 오프셋화 되며, GL_MAP_COLOR가 GL_TRUE 이면 또한 매핑된다. 저장 공간의 포맷이 GL_COLOR_INDEX, GL_STENCIL_INDEX이면 픽셀 인덱스는 저장 공간 타입인 (1, 8, 16, 32)비트 숫자로 마스크, 이전에 표현되었던 포맷대로 같이 메모리 안에 패킹 저장 공간의 포맷이 구성 요소 종류 중(루미넌스나 RGB)에 하나일 경우, 픽셀들은 항상 RGBA의 인덱스 맵에 의해 매핑 마지막으로, 인덱스와 구성 요소 데이터들의 결과값은 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()이 각각의 컬러 테이블을 정의하기 위해 사용
컬러 테이블 지정하기 컬러 테이블은 일차원 이미지들과 유사하게 지정 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 target매개변수는 glColorTable() target 중 하나로 설정되어야 한다.
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 As* Af GL_INTENSITY Rs * Rf Gs * Gf Bs * Bf As* If GL_RGB RS * Rf GL_RGBA 2010-2학기 가상현실

77 컬러 테이블과 같이 프레임 버퍼로부터 픽셀값들을 회선 필터로 지정 가능
void glCopyConvolutionFilter2D(GLenum target, GLenum internalFormat, GLint x, GLinty, GLsizei width,GLsizei height); 회선필터의 정의처럼 사용하기 위해 현재의 GL_READ_BUFFER로 부터 픽셀들의 사각형 복사 컬러프레임버퍼에서 픽셀들로 초기화한 2차원 회선필터 정의 2010-2학기 가상현실

78 회선 필터들은 2개의 1차원 필터들의 외부 곱으로 표현 가능하다면, 분리가 가능
분리된 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차원 버전과 동일
일차원 회선 필터들 일차원 회선들은 필터의 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 현재의 GL_READ_BUFFER로 부터 픽셀들의 행을 복사 internarlFormat으로 지정하도록 변환
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 ]의 범위를 클램프 가능
후기 회선 동작들 회선 동작이 완결된 후 결과 이미지의 픽셀들은 스케일 되거나 편중될 수 있고 그것들은 [ 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()는 픽셀 사각형의 최소, 최대 픽셀 구성 요소값들을 계산
최대, 최소 glMinmax()는 픽셀 사각형의 최소, 최대 픽셀 구성 요소값들을 계산 glHistogram()에서와 같이 최대, 최소값들을 계산, 이미지를 표현하거나 픽셀들을 버릴 수 있다. void glMinmax(GLenum target, GLenum internalFormat, GLboolean sink); 이미지의 최대, 최소 픽셀값들을 계산 target은 GL_MINMAX여야 함 internalFormat은 계산되어야 하는 컬러 구성요소의 최대, 최소값들을 지정 2010-2학기 가상현실

87 Reset 매개변수가 GL_TRUE라면 최대, 최소값들은 그것들의 초기값들로 재설정
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 GL_FUNC_REVERSE_SUBTRACT CdD – CsS GL_MIN min(CsS, CdD) GL_MAX max(CsS, CdD) 2010-2학기 가상현실

90 이미지 서브셋은 glBlendFunc()에서 사용되는 몇 개의 부가적인 블랜딩 요소들을 제공
상수 블랜딩 요소들 이미지 서브셋은 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) 2010-2학기 가상현실


Download ppt "픽셀, 비트맵, 폰트, 이미지 그리기."

Similar presentations


Ads by Google