2022_1학기_중간고사_컴퓨터그래픽스

CJB_ny·2022년 4월 22일
0
post-thumbnail

가라용 공부 정리

ch02

학습목표

• 그래픽 출력장치의 일반적인 작동원리를 이해한다.

• 래스터 장치에서 프레임 버퍼의 역할을 이해한다.

• 벡터 장치에서 디스플레이 리스트의 역할을 이해한다.

• 그래픽 카드의 전반적인 구조와 기능을 이해한다.


하드웨어

그래픽 시스템

  • 입력장치, 메인 컴퓨터, 그래픽 컨트롤러, 출력장치

그래픽 카드 == 그래픽 컨트롤러

  • 그래픽 프로세서

  • 그래픽 메모리

출력장치 작동원리인 "CRT 원리"이다.

1) 필라멘트 : 전류가 흐르면 가열되어 전자가 방출됨

2) 제어그물 : 전자 흐름의 양 조절

3) 집속 양극 : 정확히 가운데로 향하지 않는 전자빔을 차단

4) 수직 편향판 && 수평 편향판 : 전자빔의 방향을 각각 상하 좌우로 휘는데 사용.

< 교차점 계산에 의한 변환 >


< 비트 평면 >

EX) N * M 인 해상도와 8비트/픽셀 인 경우 프레임 버퍼의 용량은?

  • N M 8 이다.

EX) 1280 by 1024, 한 픽셀이 512 컬러를 표현 가능한 경우 프레임 버퍼의 용량은?

  • 1280 1024 log2 (2^9)이다. => 1280 1024 9

512는 2^9이기 때문이다.

정리

"프레임 버퍼" 용량 OR 크기 구하라고 하면

Frame Buffer = Color Buffer = Video Memory

문제에서의 N *(by) M 에 해당하는 값 찾고 -> 한 픽셀의 크기 구하기

크기는 8비트(1byte)로 주거나

512컬러 표현가능하다 == 2^9

이런식으로 준다.

그르면 => N M "한 픽셀"의 크기


1주차 퀴즈

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


2주차

대통령 선거


ch03

학습목표

• 색상, 명도, 채도의 정의를 명확히 이해한다.

• RGB, CMY, HSV 컬러 모델의 차이점을 이해한다.

• 컬러 프로파일과 컬러처리 시스템의 필요성을 이해한다.

• RGB 컬러모드와 인덱스 컬러모드의 차이점을 이해한다.

• 하프 토우닝 기법과 디더링 기법을 이해한다.

• 감마수정이 필요한 이유와 수정방법을 이해한다.

1) 빛 모델

  1. 파동설 : 빛이 파동으로 이루어짐
  2. 입자설 : 양자, 입자설, 빛이 작은 알갱이로 이루어짐

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로 정규화
정규화 값이 행렬 값보다 크면 화소에 가장 가까운 색으로, 작으면 배경색으로

  • 인위적인 잡음 삽임

ch04

학습목표

• 표준화의 개념과 필요성을 이해한다.

• 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

ch05

학습목표

• 논리적 입력장치를 설정하는 이유와 종류를 이해한다.

• 세 가지 입력모드의 차이점을 이해한다.

• 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

    현 메뉴 항목 중 하나로써 서브메뉴 항목을 추가한다.


5주차 퀴즈

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

6주차 퀴즈

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 이다.


7주차

Ex) 정규좌표 (-0.4, 0.2)를 화면좌표계로 정규화 하라고하면


8주차 퀴즈

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

profile
https://cjbworld.tistory.com/ <- 이사중

1개의 댓글

comment-user-thumbnail
2022년 4월 27일

정보: 망막세포 중 색상을 인지하는 역할을 하는 세포는 원추세포(Primary Visual Cortex) 이다.

답글 달기