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

Slides:



Advertisements
Similar presentations
10-7 부동소수점 (Floating-Point) 계산  컴퓨터에서 숫자를 표기하는 방법  가수 (Fraction) : 부호화된 고정소수점 숫자 지수 (Exponent) : 소수점의 위치를 표시 ( 예 )10 진수 를 표기하면 Fraction Exponent.
Advertisements

Chapter 12. 배열. 배열  동일한 항목들이 동일한 크기로 연속적으로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는 자료 구조.
6 장. printf 와 scanf 함수에 대한 고찰 printf 함수 이야기 printf 는 문자열을 출력하는 함수이다. – 예제 printf1.c 참조 printf 는 특수 문자 출력이 가능하다. 특수 문자의 미 \a 경고음 소리 발생 \b 백스페이스 (backspace)
1 08 배열. 한국대학교 객체지향연구소 2 C 로 배우는 프로그래밍 기초 2 nd Edition 배열  동일한 자료유형의 여러 변수를 일괄 선언  연속적인 항목들이 동일한 크기로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는.
1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
Chapter 4 컬러( COLOR ) 학기 가상현실.
Part 03 상수, 변수, 자료형 ©우균, 창병모 © 우균, 창병모.
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
제 7 장 함수 사용을 통해 엑셀 정복하기.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
Chapter 5. 라이팅(Lighting)
7장 디스플레이 리스트.
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
Excel 일차 강사 : 박영민.
텍 스 처 매 핑.
연결리스트(linked list).
제 9 장 구조체와 공용체.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 12. 포인터의 이해.
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express Slide 1 (of 13)
5장. 참조 타입.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
멀티미디어 시스템 (아날로그 이미지,신호를 디지털로 변환 방법) 이름 : 김대진 학번 :
23장. 구조체와 사용자 정의 자료형 2.
임베디드 실습 # LED, 7’Segment 제어
6장. printf와 scanf 함수에 대한 고찰
14장. 포인터와 함수에 대한 이해.
11장. 1차원 배열.
C#.
JA A V W. 03.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
박성진 컴퓨터 프로그래밍 기초 [09] 배열 part 1 박성진
광원 제어 하기.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
Java의 정석 제 5 장 배 열 Java 정석 남궁성 강의 의
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
19. 함수 포인터와 void 포인터.
3장. 변수와 연산자 교안 : 전자정보통신 홈페이지 / 커뮤니티/ 학술세미나
Lesson 2. 기본 데이터형.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
Chapter 4 컬러( COLOR ).
ITQ 정보기술자격 국가공인 Excel 2007 Ⅱ 함수- 11회차 강사 : 박영민.
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
2장. 변수와 타입.
처음으로 배우는 C 프로그래밍 제4부 복합 데이터 형 제 7 장 배열.
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
8주차: Strings, Arrays and Pointers
5강. 배열 배열이란? 배열의 문법 변수와 같이 이해하는 배열의 메모리 구조의 이해 레퍼런스의 이해 다차원 배열
Choi Seong Yun 컴퓨터 프로그래밍 기초 #03 : 변수와 자료형 Choi Seong Yun
CHAP 21. 전화, SMS, 주소록.
Canary value 스택 가드(Stack Guard).
균형이진탐색트리 이진 탐색(binary search)과 이진 탐색 트리(binary search tree)와의 차이점
데이터 동적 할당 Collection class.
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
7주차: Functions and Arrays
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
컴퓨터 프로그래밍 기초 - 9th : 배열 / 포인터 -
Summary of Pointers and Arrays
AdcRead API 함수 분석 마이크로프로세서.
Numerical Analysis Programming using NRs
바이트 순서 변환 함수 주소 변환 함수 바이트 조작 함수 원격지 호스트 정보를 얻는 함수
1. 지역변수와 전역변수 2. auto, register 3. static,extern 4. 도움말 사용법
어서와 C언어는 처음이지 제21장.
버스와 메모리 전송 버스 시스템 레지스터와 레지스터들 사이의 정보 전송을 위한 경로
6 객체.
BoardGame 보드게임 따라가기.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

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

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

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

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

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

w=10 h=12 (xbo, ybo) = (0, 0) (xbi, ybi) = (11, 0) 0, 0 11, 0 2010-2학기 가상현실

예제 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학기 가상현실

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학기 가상현실

void keyboard(unsigned char key, int x, int y) { switch (key) { case 27: exit(0); } 2010-2학기 가상현실

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학기 가상현실

비트맵 데이터는 항상 8비트의 배수형으로 저장된다. F 라는 문자가 최대 10만큼의 너비로 표현 비트맵 데이터는 항상 8비트의 배수형으로 저장된다. 비트맵을 만드는 비트들은 왼쪽 아래부터 그려짐. 처음에 제일 아래 줄부터 그려짐 래스터 배열은 F의 아래 2줄을 표현하는 0xc0, 0x00, 0xc0, 0x00 으로 시작해서 맨 위의 두 줄인 0xff, 0xc0, 0xff, 0xc0까지 2010-2학기 가상현실

현재의 래스터 위치는 다음 순서의 비트맵(또는 이미지)이 그려지는 스크린상의 위치 현재 래스터 위치 현재의 래스터 위치는 다음 순서의 비트맵(또는 이미지)이 그려지는 스크린상의 위치 예제에서 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학기 가상현실

비트맵 그리기 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학기 가상현실

비트맵의 컬러 선택하기 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학기 가상현실

폰트와 디스플레이 목록 하나의 폰트는 일반적으로 각 문자가 식별 숫자(ASCII코드)와 폰트의 그려지는 방법을 포함한 일련의 문자들의 조합으로 구성 glCallLists()를 다음과 같은 방법으로 사용 가능 void glCallLists(GLsizei n, GLenum type, const GLvoid *list); n 은 그려질 문자들의 개수, type는 보통 GL_BYTE, list는 문자 코드들의 배열이다. 오프셋을 설정하기 위해서 glLIstBase()라는 커맨드 이용 glGenLists(GLsizei range)로 유효한 인덱스 번호를 얻음 이 함수는 디스플레이 리스트 식별자인 range라는 범위에 해당되는 리스트를 반환 2010-2학기 가상현실

예제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학기 가상현실

{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학기 가상현실

{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학기 가상현실

{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학기 가상현실

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학기 가상현실

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학기 가상현실

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학기 가상현실

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학기 가상현실

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학기 가상현실

이미지 이미지는 비트맵과 유사하지만 사각형 영역에서 각 픽셀이 하나의 비트만을 포함하는 것이 아니라 보다 많은 정보 포함 예를 들어 이미지는 각 픽셀마다 완전한 RGBA 컬러를 저장 보통 그림으로 생각되는 이미지는 컬러버퍼에서 나옴 깊이 버퍼나 스텐실 버퍼로부터 픽셀 데이터의 사각형 영역을 읽거나 쓸 수 있다. 스크린상에 표시되는 것 이외에도 텍스처매핑에도 사용될 수 있다. 2010-2학기 가상현실

픽셀 데이터 읽기, 쓰기, 복사하기 glReadPixels() 프레임 버퍼로부터 픽셀들의 사각형 배열을 읽고, 메모리 안에 데이터 저장 glDrawPixels() 프로세서 메모리에 유지되고 있는 데이터로부터 glRasterPos*()에 의해서 표시되는 현재의 래스터 위치의 프레임버퍼 안에 픽셀들의 사각형 배열을 씀 glCopyPIxels() 프레임 버퍼의 한 부분에서 다른 부분으로 픽셀들의 사각형 배열을 복사 2010-2학기 가상현실

프레임버퍼에서 프로세서 메모리로 픽셀 데이터 읽기 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학기 가상현실

표 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학기 가상현실

표 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학기 가상현실

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학기 가상현실

각 픽셀들의 모든 컬러 구성 요소가 하나의 부호 없는 데이터 타입으로 압축 묶여진 데이터 타입 각 픽셀들의 모든 컬러 구성 요소가 하나의 부호 없는 데이터 타입으로 압축 바이트 한 개, short 정수형, 또는 표준 정수 타입(GL_UNSIGNED_BYTE_*, GL_UNSIGNED_SHORT_*, GL_UNSIGNED_INT_*) 등으로 시작하는 상수들에 의해 표시 묶여진 픽셀 데이터의 비트 범위 위치에서의 컬러값들의 순서 _REV 가 없는 경우 컬러 구성 요소들은 첫 번째 컬러 성분이 차지하고 있는 가장 중요한 장소에 할당 _REV 가 있는 경우 첫 번째 컬러 성분이 least significant 위치에 시작되면서 성분의 패킹 순서가 반대로 됨 2010-2학기 가상현실

묶여진 데이터 형의 적합한 픽셀 포맷 묶여진 타입 상수 적합한 픽셀 포맷 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학기 가상현실

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

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학기 가상현실

프로세서 메모리로부터 프레임 버퍼에 픽셀 데이터 쓰기 void glDrawpixels(GLsizei width, Glsizei height, GLenum format, GLenum type, const GLvoid, *pixels); 픽셀 데이터의 사각형을 width 와 height 크기로 그림 픽셀 사각형은 현재 래스터 위치를 왼쪽 아래 모서리 지점으로 지정하여 그린다. format 과 type은 glReadRixels()와 같은 의미 2010-2학기 가상현실

예제 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학기 가상현실

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학기 가상현실

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학기 가상현실

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학기 가상현실

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학기 가상현실

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학기 가상현실

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학기 가상현실

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학기 가상현실

프레임 버퍼 안에서 픽셀 데이터 복사 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학기 가상현실

이미지 파이프라인 픽셀 이동 동작과 픽셀 저장 모드 설명 픽셀 이동 동작과 픽셀 저장 모드 설명 glPixelZoom() 함수를 호출해서 픽셀 사각형이 그려지기 전에 확대하거나 축소할 수 있다. glDrawPixels()가 호출될 때 데이터는 실제로 픽셀 저장 모드를 따라 메모리로부터 묶임이 풀려짐(unpack) 픽셀 이동 연산들이 수행, 픽셀 결과값은 래스터화 됨 래스터화 되는 동안 픽셀 사각형은 현재의 상태에 따라서 확대, 축소 마지막으로 조각 연산이 제공, 픽셀들은 프레임 버퍼에 쓰여짐 glReadPixels() 데이터가 프레임버퍼로부터 읽혀지며 픽셀 이동 동작이 수행되고, 데이터의 결과값은 프로세서 메모리 안으로 묶여짐(pack) 2010-2학기 가상현실

glReadPixels()이 어떤 연산을 하는 동안에 모든 픽셀 이동 동작을 사용한다. glCopyPixels() glReadPixels()이 어떤 연산을 하는 동안에 모든 픽셀 이동 동작을 사용한다. 2010-2학기 가상현실

(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학기 가상현실

픽셀 패킹과 언패킹 패킹(packing 묶기)과 언패킹(unpacking, 묶기 해제)은 픽셀 데이터가 프로세서 메모리로 쓰거나 프로세서 메모리에서 읽혀지는 방법과 관계 메모리에 저장되는 이미지는 elements 라고 불리는 1개에서 4개 사이의 데이터 덩어리를 가진다. 픽셀 데이터나 포맷은 각 픽셀마다 저장하는 요소들의 숫자를 결정하거나 순서를 결정하여 정렬한다. 구성요소는 8비트 바이트에서 32비트 정수까지, 또는 소수점 숫자 등 여러 가지의 데이터 타입으로 메모리에 저장될 수 있다. 2010-2학기 가상현실

픽셀 저장 모드의 제어 이미지 데이터는 프로세서 메모리 안에 사각형 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학기 가상현실

표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학기 가상현실

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

Byte, short, integer 데이터의 바이트 교환 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 Short(byte0) Short(byte1) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Short(byte0) Short(byte1) 7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 Integer(byte0) Integer(byte1) Integer(byte2) Integer(byte3) 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Integer(byte3) Integer(byte2) Integer(byte1) Integer(byte0) 7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 23 22 21 20 19 18 17 16 31 30 29 28 27 26 25 24 2010-2학기 가상현실

*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학기 가상현실

메모리상에, 저장된 이미지 데이터의 부분 사각형을 읽거나 그릴 경우 사용 *ROW_LENGTH 매개변수 메모리상에, 저장된 이미지 데이터의 부분 사각형을 읽거나 그릴 경우 사용 *ROW_LENGTH가 0이면 행의 길이는 glReadPixels(), glDrawPixels(), glCopyPixels()로 설명된 너비와 같다. *SKIP_ROWS , *SKIP_PIXELS 를 이용하여 건너뛰는 행과 열의 숫자 설정, 왼쪽 아래 모서리부터 시작됨. *ALIGNMENT 가 1로 설정된다면 다음 순서의 사용 가능한 바이트가 사용된다. 2로 설정되면 다음 행의 첫 번째 바이트가 2의 배수인 주소를 가지게 된다. *IMAGE_HEIGHT 와 SKIP_IMAGES 는 3차원 텍스처를 정의하고 질의하는 경우에만 영향을 준다. 2010-2학기 가상현실

*SKIP_ROWS, *SKIP_PIXELS, *ROW_LENGTH subimage *SKIP_PIXELS *SKIP_ROWS 2010-2학기 가상현실

픽셀 전송 동작 이미지 데이터는 메모리에서 프레임버퍼로 전송되거나, 프레임버퍼에서 메모리 안으로 전송 이미지 데이터는 메모리에서 프레임버퍼로 전송되거나, 프레임버퍼에서 메모리 안으로 전송 이 과정에서 여러가지 연산을 수행할 수 있다: 구성 요소의 범위 변경 등: 빨강 구성 요소가 0.0 ~ 1.0인데 다른 범위로 바꿀 수 있음 glPixelTransfer*(), glPixelMap*() 커맨드를 통해서 전송동작수행 void glPixelTransfer{if}(GLenum pname, TYPE param); glDrawPixels(), glReadPixels(), glCopyPixels(), glTexImage1D(), glTexImage2D(), glTexImage3D(), glCopyTexImage1D(), glCopyTexSubImage1D(), … 등의 동작에 영향을 주는 픽셀 전송 모드를 설정 2010-2학기 가상현실

표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학기 가상현실

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학기 가상현실

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학기 가상현실

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학기 가상현실

픽셀 매핑 모든 컬러 구성 요소와 컬러 인덱스들, 스텐실 인덱스들은 스크린 메모리에 위치되기 전에 표를 참고하여 변형 가능 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학기 가상현실

표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학기 가상현실

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

픽셀 사각형 읽고 그리기 픽셀 사각형 그리기 과정: 픽셀을 프레임버퍼 안으로 그리는 작업 픽셀들이 인덱스들이 아닐 경우, 첫 번째 단계는 구성 요소들을 소수점 포맷으로 변환 포맷이 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학기 가상현실

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학기 가상현실

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학기 가상현실

다음은 스케일과 편중값들이 각 구성요소에 적용. 픽셀 사각형 읽기 과정 읽을 픽셀이 인덱스들이 아닌 경우에(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학기 가상현실

이미지 서브셋 이미지 서브셋은 부가적으로 제공하는 픽셀 처리 능력 루틴을 일컫는 말. 이미지 서브셋의 기능 이미지 서브셋은 부가적으로 제공하는 픽셀 처리 능력 루틴을 일컫는 말. 이미지 서브셋의 기능 픽셀값들을 교체하기 위한 컬러 찾기 표의 사용 이미지를 필터링 하기 위한 회선(convolution)의 사용 컬러 공간 변환을 하기 위한 컬러 행렬 변형의 사용과 다른 선형 변형의 사용 히스토그램 통계값의 수집 및 이미지들에 대한 최소,최대 컬러 구성 요소정보 수집 두 이미지값의 합과 차, 최소값, 최대값 계산을 위한 블렌딩 방정식 사용 픽셀 컬러를 변형하기 위해서 상수 블렌딩 인자의 사용 glPixelTransfer*()와 glPixelMap*() 에 의해 제공되는 것보다 더 높은 픽셀 처리 성능을 원할 경우에 이미지 서브셋 사용 2010-2학기 가상현실

컬러 테이블  프로그램 문제 컬러 테이블은 픽셀의 컬러를 교체하기 위해서 사용하는 색인표 응용 프로그램에서는 대비(contrast)의 증가, 필터링, 이미지 균등화에 이용 픽셀 파이프라인의 다른 단계에서 동작하는 가능한 3가지의 컬러 참조표 각 컬러 테이블은 표에 있는 매개변수를 넣어 glEnable() 함수를 사용하여 따로 활성화 컬러 테이블 매개변수 픽셀들에서의 동작 GL_COLOR_TABLE 픽셀들이 이미지 파이프라인 안에 들어갈 경우 GL_POST_CONVOLUTION_COLOR_TABLE 회선 후 GL_POST_COLOR_MATRIX_COLOR_TABLE 컬러행렬 변환 수행 후 2010-2학기 가상현실

컬러 테이블은 일차원 이미지들과 유사하게 지정 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학기 가상현실

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학기 가상현실

target매개변수는 glColorTable() target 중 하나로 설정되어야 한다. void glCopyColorTable(GLenum target, GLenum internalFormat, GLint x,GLint y, GLsizei width); target매개변수는 glColorTable() target 중 하나로 설정되어야 한다. glColorTable() internalformat 매개변수와 같은 기호상수 사용 2010-2학기 가상현실

컬러 하위 표 커맨드들이 새로운 값이 들어간 컬러 테이블의 임시적인 부분을 다시 읽어낼 수 있어야 함 컬러 테이블의 모든 부분 교체하기 컬러 테이블의 한 부분을 교체하려면 컬러 하위 표 커맨드들이 새로운 값이 들어간 컬러 테이블의 임시적인 부분을 다시 읽어낼 수 있어야 함 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학기 가상현실

컬러 데이블의 값들 질의(Querying) 하기 컬러 테이블에 저장된 픽셀값들은 glGetColorTable()로 복구 컬러 테이블 프록시 컬러 테이블의 프록시들은 컬러 테이블을 저장하기 위한 사용 가능한 리소스가 충분한지 알아보기 위해 질문하는 방법 제공 2010-2학기 가상현실

회 선(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학기 가상현실

회선 필터들이 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학기 가상현실

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

회선 필터들은 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학기 가상현실

일차원 회선들은 필터의 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학기 가상현실

현재의 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학기 가상현실

하나의 이미지의 가장자리의 픽셀들의 회선은 내부의 픽셀들에 따라 다르게 다루어짐 회선 경계 모드 하나의 이미지의 가장자리의 픽셀들의 회선은 내부의 픽셀들에 따라 다르게 다루어짐 회선들은 회선 경계 모드에 의해서 변형. GL_REDUCE 모드는 회선 필터의 크기에 의해서 각각의 차원 안에서 축소된 결과 이미지 생성 GL_CONSTANT_BORDER는 소스 이미지의 바깥쪽의 픽셀들에 대한 상수 픽셀값을 사용해서 경계 픽셀들의 회선을 계산 GL_REPLICATE_BORDER는 픽셀의 행이나 열이 소스 이미지의 밖에 있는 픽셀들로 사용된 바깥쪽 값들은 제외한 GL_CONSTANT_BORDER 모드에서와 같은 방식으로 계산 2010-2학기 가상현실

회선 동작이 완결된 후 결과 이미지의 픽셀들은 스케일 되거나 편중될 수 있고 그것들은 [ 0 , 1 ]의 범위를 클램프 가능 후기 회선 동작들 회선 동작이 완결된 후 결과 이미지의 픽셀들은 스케일 되거나 편중될 수 있고 그것들은 [ 0 , 1 ]의 범위를 클램프 가능 스케일과 편중값들은 glPixelTransfer*()를 GL_POST_CONVOLUTION_*_SCALE이나 GL_POST_CONVOLUTION_*_BIAS를 사용하여 호출 지정 컬러 행렬 컬러 공간 회선들과 픽셀값들에서의 선형 변형을 위해서 glMatrixMode(GL_COLOR)를 설정해서 선택한 이미지 서브셋은 4 * 4 크기의 행렬 스택을 제공 2010-2학기 가상현실

후기 회선 동작들과 비슷하게, 픽셀들은 컬러 행렬 단계 이후에 스케일 되거나 편중될 수 있다. 후기 컬러 행렬 변환 동작 후기 회선 동작들과 비슷하게, 픽셀들은 컬러 행렬 단계 이후에 스케일 되거나 편중될 수 있다. 후기 컬러 행렬 동작의 스케일과 편중값들을 정의하는 glPixelTransfer*()호출 픽셀값은 스케일과 편중 동작을 하고 나면[ 0 , 1 ]범위로 클램프 2010-2학기 가상현실

히스토그램  프로그램 문제 이미지 서브셋을 사용하여 이미지에 대한 통계값들을 수집가능 히스토그램  프로그램 문제 이미지 서브셋을 사용하여 이미지에 대한 통계값들을 수집가능 void glHistrogram(GLenum target, GLsizei width, GLenum internalFormat, GLboolean sink); 히스토그램으로 만들길 원하거나, 이미지를 계속적으로 처리하거나, 통계값들을 수집할 경우, 이미지의 구성요소를 지정 이미지의 히스토그램 데이터가 저장되는 방법을 정의 target 매개변수는 GL_HISTOGRAM이나GL_PROXY_HISTOGRAM으로 설정해야 함 2010-2학기 가상현실

히스토그램의 값들의 변환과 더불어 히스토그램의 내부 저장을 재설정 glDrawPixels()를 사용, 이미지 파이프라인에서 픽셀들을 처리 후 glGetHistogram()을 사용, 히스토그램의 결과를 되살릴 수 있음 void glGetHistogram(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); 수집한 히스토그램 통계값들을 반환 히스토그램의 값들의 변환과 더불어 히스토그램의 내부 저장을 재설정 void glResetHistogram(GLenum target); 히스토그램의 카운터를 0으로 재설정 2010-2학기 가상현실

glMinmax()는 픽셀 사각형의 최소, 최대 픽셀 구성 요소값들을 계산 최대, 최소 glMinmax()는 픽셀 사각형의 최소, 최대 픽셀 구성 요소값들을 계산 glHistogram()에서와 같이 최대, 최소값들을 계산, 이미지를 표현하거나 픽셀들을 버릴 수 있다. void glMinmax(GLenum target, GLenum internalFormat, GLboolean sink); 이미지의 최대, 최소 픽셀값들을 계산 target은 GL_MINMAX여야 함 internalFormat은 계산되어야 하는 컬러 구성요소의 최대, 최소값들을 지정 2010-2학기 가상현실

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학기 가상현실

이하 생략 블렌딩 방정식을 이용하여 픽셀들 결합하기 픽셀들과 조각들에서의 이미지 서브셋 인수화 방법은 수학적 조합을 정의해서 섞여질 수 있다. glBlendEquation()루틴은 블랜드 프레임버퍼 픽셀들과 컬러 조각들을 사용해서 동작들을 변형시키는 방법을 지정 void glBlendEquation(GLenum mode); 프레임버퍼와 소스 컬러들이 함께 섞여지는 방법을 지정 mode 값 GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC__REVERSE_SUBTRACT,GL_MIN, GL_MAX 2010-2학기 가상현실

이미지 서브셋 블렌딩 모드와 연계된 수학적 연산들 접 미 사 데 이 터 타 입 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학기 가상현실

이미지 서브셋은 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학기 가상현실