• 그래픽 출력장치의 일반적인 작동원리를 이해한다.
• 래스터 장치에서 프레임 버퍼의 역할을 이해한다.
• 벡터 장치에서 디스플레이 리스트의 역할을 이해한다.
• 그래픽 카드의 전반적인 구조와 기능을 이해한다.
그래픽 시스템
그래픽 카드 == 그래픽 컨트롤러
그래픽 프로세서
그래픽 메모리
출력장치 작동원리인 "CRT 원리"이다.
1) 필라멘트 : 전류가 흐르면 가열되어 전자가 방출됨
2) 제어그물 : 전자 흐름의 양 조절
3) 집속 양극 : 정확히 가운데로 향하지 않는 전자빔을 차단
4) 수직 편향판 && 수평 편향판 : 전자빔의 방향을 각각 상하 좌우로 휘는데 사용.
< 교차점 계산에 의한 변환 >
< 비트 평면 >
EX) N * M 인 해상도와 8비트/픽셀 인 경우 프레임 버퍼의 용량은?
EX) 1280 by 1024, 한 픽셀이 512 컬러를 표현 가능한 경우 프레임 버퍼의 용량은?
512는 2^9이기 때문이다.
"프레임 버퍼" 용량 OR 크기 구하라고 하면
Frame Buffer = Color Buffer = Video Memory
문제에서의 N *(by) M 에 해당하는 값 찾고 -> 한 픽셀의 크기 구하기
크기는 8비트(1byte)로 주거나
512컬러 표현가능하다 == 2^9
이런식으로 준다.
그르면 => N M "한 픽셀"의 크기
1) 모델링과 렌더링을 각각 정의하시오
모델링 : 장면(Scene)안에 나타나야 할 물체들을 정의하는 작업, 기하 요소를 기본으로 복잡한 물체를 정의함.
렌더링 : 정의된 물체를 그려내기, 즉 화면의 각 화소값을 계산해냄.
2) 한 픽셀을 구성하는 색상 RGB 채널 각각의 깊이가 8비트인 경우, 한 픽셀의 용량을 계산하시오
한 픽셀의 용량(크기)는 (8bit, 8bit, 8bit) -> 24bit
3) 화면 해상도가 1280*1024이고 한 픽섹을 이루는 R G B 채널, 각각의 깊이가 8 비트인 경우, 프레임 버퍼의 용량을 계산하시오.
한 픽셀 크기 24비트인데 프레임 버퍼는
1280 1024 log2 (2^9)
즉 1280 1024 9
대통령 선거
학습목표
• 색상, 명도, 채도의 정의를 명확히 이해한다.
• RGB, CMY, HSV 컬러 모델의 차이점을 이해한다.
• 컬러 프로파일과 컬러처리 시스템의 필요성을 이해한다.
• RGB 컬러모드와 인덱스 컬러모드의 차이점을 이해한다.
• 하프 토우닝 기법과 디더링 기법을 이해한다.
• 감마수정이 필요한 이유와 수정방법을 이해한다.
1) 빛 모델
- 파동설 : 빛이 파동으로 이루어짐
- 입자설 : 양자, 입자설, 빛이 작은 알갱이로 이루어짐
2) 생상, 명도, 채도
색상 : 우세주파수의 색
명도 : 파형 아래의 면적
채도 : 색의 선명함
3) RGB 컬러모델
Cyan : 녹청, Magenta : 자홍, Yellow : 노랑
R + G = Y (1 0 0) + (0 1 0) = (1 1 0)
G + B = (0 1 0) + (0 0 1) = (0 1 1) = Cyan
그림의 원 외워라!
단점
직관적이지 않다. 보라색 = R G B 각각 얼마?
4) CMY 컬러모델
W = R + G + B 이고
W - G = R + B = Magenta 이다.
W - G - R = Blue 이다.
( W - G - R ) - B = Black
W = White
RGB는 CMY의 합성으로 표현
C + M + Y = Black
물감의 삼원색은 CMY
5) CMYK
C = 120, M = 80, Y = 200 일 때
최소농도 : 80
C = 40, M = 0, Y = 120, K = 80 = 최소농도
Ex) 잉크의 양? => 배열에 있는거 더해서 비교하면됨. -> 400
6) HSV 컬러모델
HSV (Hue, Saturation, Value)
화가의 직관
- 셰이드 = 어떤 색상에 "흑색"을 섞음. 채도와 명도를 동시에 낮춤
- 틴드 = 어떤 색상에 "백색"을 섞음. 채도는 낮추고 명도는 높임
7) 하프 토우닝
우리눈의 종합적 인식능력을 사용
평균 면적의 명도로 인식
인쇄물의 하프토우닝
- 흑백이지만 회색처럼 보임
- 화면 화소에는 이것이 불가능
8) 디지털 하프 토우닝
점의 크기 대신 개수를 조절
우리 눈이 4개의 화소를 한 단위 평균적 밝기를 인식
실질적 해상도는 감소
9) 디더링
해상도 감소 없음
색상의 표현이 불가능할 때, 다른 색상들을 섞어서 비슷한 색상을 내기위해 색상의 개수를 줄이는 기술 (ex 도트 프린터, 신문 등)
- 화소에서 화소로 사상 -> 해상도 유지
ex) 오류확산
오류 확산 :
중앙화소 회색도 : 200, 흑백 모니터인 경우 (0또는 255)인 경우,
255로 표현 -> 오류 -55
중앙화소의 오른쪽 화소 계산 :
- 오류를 전파
패턴디더
모든 화서의 회색도를 최대 8로 정규화
정규화 값이 행렬 값보다 크면 화소에 가장 가까운 색으로, 작으면 배경색으로
- 인위적인 잡음 삽임
• 표준화의 개념과 필요성을 이해한다.
• API의 정의와 필요성을 이해한다.
• 고수준 API의 장면묘사 방식을 이해한다.
• 오픈지엘의 설계원리에 반영된 개념을 이해한다.
• 파이프라인 개념, 상태변수 개념을 이해한다.
• 오픈지엘 프로그램 작성을 위한 유틸리티 프로그램 설치방법을 이해한다.
1) 표준화
“주어진 여건에서 최적의 질서를 유지하기 위해, 현존하거나 잠재하는 문
제들에 대해, 공유성과 재사용성을 높이기 위한 기반을 확립하는 행위“
2) 그래픽 분야 표준 목표
주전산기 독립성(Host Machine Independence)
• 동일한 프로그램을 가지고서 다양한 모든 하드웨어에서 사용할 수 있어야
한다.
장비 독립성(Device Independence)
• 동일 기능을 수행하는 입출력 장비의 종류가 달라도 프로그램 명령은 동
일해야 한다.
프로그램 언어 독립성(Programming Language Independence)
• 프로그램 작성에 어떠한 프로그램 언어를 사용해도 된다.
운영자 이식성(Operator Portability)
• 새로운 프로그램 사용법을 누구라도 쉽게 터득할 수 있어야 한다.
3) 그래픽 API
라이브러리
PHIGS, GKS = 추상적 수준의 API
API
Graphics Application Program - API - Graphics Library -> 키보드, 마우스 그래픽카드 등등..
4) 오픈지엘 개괄 - 그래픽 API 발전과정
5) 오픈지엘
저 수준 API
- 장면을 묘사하는 것이 아니라 구체적 프러시져를 호출
- DirectX from Microsoft : 호완성 결어
- 하드웨어와 거의 직접 연관 ( 하드웨어 성능을 최대한 발휘 )
- Invector, VRML, Java3D 등 고수준 API의 기반
- 드라이버 소프트웨어에 비해서는 상대적으로 고수준 함수,
6) 오픈지엘 설계원리
범용성(Generality)
• 워크스테이션, 수퍼 컴퓨터, 개인용 컴퓨터, 운영체제에 무관
효율성(Performance)
• 그래픽 하드웨어의 가속 기능을 최대한 발휘
• 회사마다 서로 다른 기능, 공통적인 부분을 찾아내어 그 성능을 극대화
• 공통부분이 아닌 것에 대해서는 활성화 또는 비활성화 등 기능 모드를 제공
독립성(Orthogonality)
• 기능 간의 독립성을 최대한 보장
• 기능끼리 서로 얽혀 발생하는 오류를 방지
완전성(Completeness)
• 특정 하드웨어 기능에 대해서는 ARB (Architecture Review Board, GPU assembly
language)확장 형태로 명령어를 제공
• 다수의 하드웨어가 확장 기능을 지원하면 표준기능으로 변경
• 소프트웨어적으로라도 실행할 수 있도록 배려
상호 작업성(Interoperability)
• 그래픽 명령은 A 컴퓨터에서 내리되 실행은 B 컴퓨터에서
• 클라이언트-서버 모델(Client-Server Model)지원.
• 성능이 낮은 클라이언트 컴퓨터가 고성능 서버를 이용.
7) 파이프 라인
GPU 설계 원리
- CPU 파이프라인과 유사
- 분업에 의한 동시처리로 처리속도를 극대화
- 파이프 라인 서브 프로세스는 모드 하드웨어와
8) 상태변수
GL의 역할 = 상태변수를 설정
파이프 라인은 상태 변수를 참조해서 자동으로 실행됨.
9) 지엘 명령어 구조
GL은 API
GL은 비 객체지향적
- 처리속도를 향상
- 함수 오버로딩이 불가능
- 3차원 정점이라면 glVertex3f(), glVertex2f()
10) 지엘 프로그램 구성 요소
지엘 라이브 러리 ( GL : OpenGL, Core Library )
- 렌더링 기능을 제공하는 함수 라이브러리
지엘 유틸리티 라이브러리 ( GLU : OpenGl, Utility Library )
- 50여개의 함수, GL 라이브러리의 도우미
- 다각형 분할, 투상, 2차원 곡면, 너브스 등 고급기능을 제공하는 함수
- GL 함수로 작성
지엘 유틸리티 툴 킷 ( GLUT : OpenGL Utility Toolkit )
- 사용자 입력을 받아들이거나 화면 윈도우를 제어하기 위한 함수
- 윈도우 운영체제 기능과의 인터페이스
11) GLUT
윈도우 기능 : 프로그램 실행에 필요한 창
콜백 기능 : 프로그램 실행 중 발생하는 사용자 입력 처리
윈도우 초기화
- (glut)생략
- InitWindowPosition
- InitwindowSize
- InitDisplayMode
윈도우 관리
- glutSetWindowTitle
- glutCreateWindow
• 논리적 입력장치를 설정하는 이유와 종류를 이해한다.
• 세 가지 입력모드의 차이점을 이해한다.
• GLUT 콜백함수의 종류와 사용법을 이해한다.
• GL의 화면 좌표계와 GLUT의 화면 좌표계 사이의 차이점을 이해한다.
• 더블 버퍼링의 필요성에 대해 이해한다.
• 정점 배열, 디스플레이 리스트의 필요성과 사용법을 이해한다.
1) 윈도우와 뷰포트 - 윈도우와 뷰포트
파이프 라인 변환 프로세스를 따라가면서 기준좌표계에 따라 정점좌표가 바뀜.
Ex) 정규좌표 (0.5, 0.5)를 1024 * 768 화면 좌표계로 나타내시오
x = 1023 0.75 (= 3/4) = 767.25 = 767
y = 767 0.25 (= 1/4) = 191.75 = 192
이게 그림을 그려보면 쉽다.
x 일 경우 이런 경우인데
전체 크기가 2이기 때문에
1.5 / 2 * 1023 을 해주게 되면 767.xxx 나온다.
y일 경우 0.5 / 2(전체 크기) * 768 = 192 나온다.
이기 때문에
x = ( 1 - 0.4 ) / 2(전체크기) * 1023 => 307
y = ( 1 - 0.2 ) / 2(전체크기) * 767 => 307
2) 콜백 프로그래밍 - GL의 화면좌표, GLUT 화면좌표
- Reshape callBack
- 처음 윈도우를 그릴 때
- 윈도우 위치를 옮길 때
- 윈도우 크기를 조절 할 때
3) 콜백 프로그래밍 - GL의 화면 좌표, GLUT의 화면좌표
glOrthor
이렇게 된다는 것임.
4) 메뉴 콜백
int glutCreateMenu
메뉴 콜백함수를 등록하며, 그 결과 등록된 메뉴 아이디 값이 리턴된다.
void glutSetMenu
현 메뉴를 파라미터 id에 지정한 메뉴로 설정한다.
void glutAddMenuEntry
현 메누에 메뉴 항목을 추가한ㄷ.
int glutAttachMenu
GLUT_LEFT_BUTTON, GLUT_RIGHT_BUTTON, 등 지정한 마우스 버튼에 현 메뉴 할당.
void glutAddSubMenu
현 메뉴 항목 중 하나로써 서브메뉴 항목을 추가한다.
Q1) 색상의 가산 모델인 RGB을 이용하여 Cyan( 0 1 1 ) Meganta ( 1 0 1) 유도하시오.
가산 모델 -> RGB 컬러모델
색이 RGB라 Cyan이라는 색 (0, 1, 1)이라
G (0, 1, 0) + B ( 0, 0, 1) 더한다.
Cyan = G + B = ( 0 1 0 ) + ( 0 0 1 ) = ( 0 1 1 )
Meganta = R + B = ( 1 0 0 ) + ( 0 0 1 ) = ( 1 0 1)
Q2) 색상의 감산 모델을 이용하여 BLUE( 0 0 1 )를 계산하시오.
감산모델이라 하면
CMY 컬러모델에서 "감산모델"사용함
W = R + G + B 이니까
W - R - G = B 를 해주면된다.
Q3) OpenGl을 사용하여 원점을 중심으로 한변의 길이가 1인 정삼각형을 그리기 위한 정점 3개를 구하시오. 단 좌측 하단의 정점 좌표부터 시작하여 세 점을 반시계 방향으로 정의하시오.
void Display()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
glBegin(GL_POLYGON);
glVertex2f(-0.5, -0.5);
glVertex2f(0.5, -0.5);
glVertex2f(0, 0.5);
glEnd();
glFlush();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow("Sierptinski Triangle");
glutDisplayFunc(Display);
glutMainLoop();
}
Q1) 원영상 f(x, y)가 8비트로 회색도를 표현할 때, 패턴 디더링을 수행하고자 한다. 회색도를 최대 15로 할 때, 정규화 공식을 사용하시오. 그리고 51의 회색도를 정규화 하시오
패턴디더 : 모든 화소의 회색도를 최대 8로 정규화하는것.
정규화할 회색도 최대 회색도 / 255
P 15 / 255
51 * 15 / 255
Q2) Sierpinsky Gasket을 프로그램하고 실행결과를 보이시오.
Q3) 위 프로그램을 활용하여 원점을 중심으로 한변의 길이가 30인 정사각형을 시작으로하는 Sierpinsky Square Gasket을 프로그램하고 실행결과를 보이시오.
1번 패디더? Pattern Dither
회색도가 N일때, 정규화 공식 : P * 8bit / 255
p = 51, 회색도의 최대가 15이다.
P * 15 / 255 => P = 51
=> 51 * 15 / 255 이다.
Ex) 정규좌표 (-0.4, 0.2)를 화면좌표계로 정규화 하라고하면
Q1)
600 * 600 일 때 glut 좌표계 -> gl 좌표계
먼저 glut 좌표계는 왼쪽 위에서부터 시작한다.
gl좌표계는 왼쪽 아래에서부터 시작한다.
Q2)
void MyDisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.5, 0.5, 0.5);
glBegin(GL_POLYGON);
glVertex3f(-0.5, -0.5, 0.0);
glVertex3f(0.5, -0.5, 0.0);
glVertex3f(0.5, 0.5, 0.0);
glVertex3f(-0.5, 0.5, 0.0);
glEnd();
glFlush();
}
// Reshape 콜백 함수
void MyReshape(int NewWidth, int NewHeight)
{
glViewport(0, 0, NewWidth, NewHeight);
GLfloat WidthFactor = (GLfloat)NewWidth / (GLfloat)300;
GLfloat HeightFactor = (GLfloat)NewHeight / (GLfloat)300;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1.0 * WidthFactor, 1.0 * WidthFactor, -1.0 * HeightFactor, 1.0 * HeightFactor, -1.0, 1.0);
}
>
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB);
glutInitWindowSize(500, 500);
glutInitWindowPosition(0, 0);
glutCreateWindow("OpenGl Drawing Reshape");
glClearColor(1.0, 1.0, 1.0, 1.0); // backGroundColor
glutDisplayFunc(MyDisplay);
glutReshapeFunc(MyReshape);
glutMainLoop();
return 0;
}
Q3)
마우스 콜백
GLint TopLeftX, TopLeftY, BottomRightX, BottomRightY;
>
void MyDisplay()
{
glViewport(0, 0, 600, 600);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.5, 0.5, 0.5);
glBegin(GL_POLYGON);
glVertex3f(TopLeftX / 600.0, (600.0 - TopLeftY) / 600.0, 0.0);
glVertex3f(TopLeftX/ 600.0, (600.0 - BottomRightY)/ 600.0, 0.0);
glVertex3f(BottomRightX / 600.0, (600.0 - BottomRightY) / 600.0, 0.0);
glVertex3f(BottomRightX / 600.0, (600.0 - TopLeftY) / 600.0, 0.0);
glEnd();
glFlush();
}
>
void MyMouseClick(GLint Button, GLint State, GLint X, GLint Y)
{
if (Button == GLUT_LEFT_BUTTON && State == GLUT_DOWN)
{
TopLeftX = X;
TopLeftY = Y;
}
}
>
void MyMouseMove(GLint X, GLint Y)
{
BottomRightX = X;
BottomRightY = Y;
glutPostRedisplay();
}
>
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB);
glutInitWindowSize(600, 600);
glutInitWindowPosition(0, 0);
glutCreateWindow("OpenGl Drawing Example");
glClearColor(1.0, 1.0, 1.0, 1.0); // backGroundColor
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
glutDisplayFunc(MyDisplay);
glutMouseFunc(MyMouseClick);
glutMotionFunc(MyMouseMove);
glutMainLoop();
return 0;
}
정보: 망막세포 중 색상을 인지하는 역할을 하는 세포는 원추세포(Primary Visual Cortex) 이다.