slide1 n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
픽셀 , 비트맵 , 폰트 , 이미지 그리기 PowerPoint Presentation
Download Presentation
픽셀 , 비트맵 , 폰트 , 이미지 그리기

Loading in 2 Seconds...

play fullscreen
1 / 90

픽셀 , 비트맵 , 폰트 , 이미지 그리기 - PowerPoint PPT Presentation


  • 330 Views
  • Uploaded on

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

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about '픽셀 , 비트맵 , 폰트 , 이미지 그리기' - kiele


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
slide2
내용

비트맵과 폰트

이미지

이미지 파이프라인

픽셀 사각형을 읽고 그리기

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

이미지의 서브셋

가상현실

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

가상현실

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

가상현실

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

0xff, 0xc0

0xff, 0xc0

0xc0, 0x00

0xc0, 0x00

가상현실

slide6

w=10

h=12

(xbo, ybo) = (0, 0)

(xbi, ybi) = (11, 0)

0, 0

11, 0

가상현실

8 1 drawf c
예제 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);

}

가상현실

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

}

가상현실

slide9
void keyboard(unsigned char key, int x, int y)

{

switch (key) {

case 27:

exit(0);

}

}

가상현실

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

}

가상현실

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

가상현실

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

가상현실

slide13
비트맵 그리기
  • 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를 지칭

가상현실

slide14
비트맵의 컬러 선택하기
  • 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 로 설정

가상현실

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

가상현실

8 2 font c
예제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},

가상현실

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

가상현실

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

가상현실

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

가상현실

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

가상현실

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

}

가상현실

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

가상현실

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

}

가상현실

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

가상현실

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

가상현실

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

가상현실

slide27
프레임버퍼에서 프로세서 메모리로 픽셀 데이터 읽기
    • 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은 각 요소들의 데이터 종류

가상현실

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

가상현실

slide33
묶여진 데이터 타입과 픽셀 포맷들에 대한 구성 요소의 순서

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

가상현실

slide34

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

가상현실

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

가상현실

8 3 gldrawpixels image c
예제 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;

가상현실

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

}

}

}

가상현실

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

}

가상현실

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

}

가상현실

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

}

가상현실

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

가상현실

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

}

}

가상현실

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

}

가상현실

slide44
프레임 버퍼 안에서 픽셀 데이터 복사
  • void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum buffer);
    • 아래 왼쪽 모서리가 x, y
    • width와 height 의 넓이를 가지는 프레임 버퍼 사각형으로 부터 데이터를 복사
    • 데이터는 현재 래스터 위치에 의해서 주어지는 새로운 위치인 왼쪽 아래 위치로 복사된다.
    • buffer는 사용되고 있는 프레임 버퍼를 설명하는 GL_COLOR, GL_STENCIL, GL_DEPTH

가상현실

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

가상현실

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

가상현실

slide47
이미지 파이프라인

Processor

Memory

Texture

memory

unpack

Pixel storage

models

pack

Pixel-transfer

Operations

(and pixel map)

Rasterization

(including pixel zoom)

Per-fragment

operations

Frame buffer

가상현실

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

가상현실

slide49
픽셀 저장 모드의 제어
  • 이미지 데이터는 프로세서 메모리 안에 사각형 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(),…

가상현실

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

가상현실

byte short integer
Byte, short, integer 데이터의 바이트 교환

Byte

Byte

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)

23 22 21 20 19 18 17

15 14 13 12 11 10 9 8

7 6 5 4 3 2 1 0

31 30 29 28 27 26 25 24

Integer(byte3)

Integer(byte2)

Integer(byte1)

Integer(byte0)

15 14 13 12 11 10 9 8

23 22 21 20 19 18 17 16

31 30 29 28 27 26 25 24

7 6 5 4 3 2 1 0

가상현실

slide53
*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 }

가상현실

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

가상현실

skip rows skip pixels row length
*SKIP_ROWS, *SKIP_PIXELS, *ROW_LENGTH

ROW_LENGTH

subimage

*SKIP_PIXELS

*SKIP_ROWS

가상현실

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

가상현실

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

가상현실

slide61
픽셀 매핑
  • 모든 컬러 구성 요소와 컬러 인덱스들, 스텐실 인덱스들은 스크린 메모리에 위치되기 전에 표를 참고하여 변형 가능
  • void glPixelMap{ui us f}v(GLenum map,GLint mapsize, const TYPE *values);
    • values에 의해 지정된 값을 가지는 mapsize라는 입력값에 의해서 지시되는 픽셀 맵을 불러옴
    • 기본 크기값은 모두 1 이고, 기본값은 모두 0
    • 각 맵의 크기는 반드시 2의 거듭제곱이어야 함
  • 맵의 최대 크기는 머신에 따라 다르고, gtIntegerv()로 픽셀 맵의 크기를 알아볼 수 있다: GL_MAX_PIXEL_MAP_TABLE 사용

가상현실

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

가상현실

slide64
픽셀 사각형 읽고 그리기
  • 픽셀 사각형 그리기 과정: 픽셀을 프레임버퍼 안으로 그리는 작업
    • 픽셀들이 인덱스들이 아닐 경우, 첫 번째 단계는 구성 요소들을 소수점 포맷으로 변환
    • 포맷이 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] 범위로 묶는 것이 안되었다면 그 구성요소 들은 프레임버퍼 구성요소에 연관된 것처럼 비트를 이진 소수점의 왼쪽으로 하는 고정 소수점으로 변환

가상현실

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

가상현실

slide66

Byte, short, int, float, data stream(index or component)

unpack

RGBA L, Z

Convert to [0, 1]

1

Convert L->RGBA

2

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

Clamp to [0, 1]

5

Index(stencil, color index)

RGBA Z

가상현실

slide67
픽셀 사각형 읽기 과정
    • 읽을 픽셀이 인덱스들이 아닌 경우에(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* 모드에 따라 메모리 안에 묶임

가상현실

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

가상현실

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

가상현실

slide70
컬러 테이블 지정하기
    • 컬러 테이블은 일차원 이미지들과 유사하게 지정
    • 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의 표현을 결정하는데 사용

가상현실

slide71
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

가상현실

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

가상현실

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

가상현실

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

가상현실

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

가상현실

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

가상현실

slide78
분리된 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로 설정되어야 함

가상현실

slide79
일차원 회선 필터들
    • 일차원 회선들은 필터의 height 매개변수를 1로 가정하여 제외한 2차원 버전과 동일
    • void glConvolutionFilter1D(GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *image);
      • 일차원 회선 필터를 지정
      • target 은 GL_CONVOLUTION_ID로 지정
      • Width는 필터안의 픽셀들의 개수로 지정

가상현실

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

가상현실

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

가상현실

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

가상현실

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

가상현실

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

가상현실

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

가상현실

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

가상현실

slide87
void glGetMinmax(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid*values);
    • 최대 , 최소 동작의 결과값을 반환.
    • target은 GL_MINMAX여야 함
    • Reset 매개변수가 GL_TRUE라면 최대, 최소값들은 그것들의 초기값들로 재설정
  • void glResetMinmax(GLenum target);
    • 이 루틴을 호출해서 내부 테이블을 명시적으로 재설정
    • 최대, 최소값을 재설정

가상현실

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

가상현실

slide90
상수 블랜딩 요소들
    • 이미지 서브셋은 glBlendFunc()에서 사용되는 몇 개의 부가적인 블랜딩 요소들을 제공

가상현실