Computer Graphics 3-1. Graphic Library
숙명여자대학교 컴퓨터 그래픽스 수업 - 유석종 교수님
# Standardization
- Standardization
> 기술을 개발하는데 중복된 투자를 막기 위해, 그리고 프로그램의 재사용성을 향상하기 위해 사용
- ISO Standardization for Computer Graphics
> ISO/IEC JTC1/SC24, Working Group
- CG definition by ISO
> 그래픽 물체와 이미지를 만들고, 변형하고, 보여주고 그리고 저장하기 위해 컴퓨터 하드웨어와 소프트웨어를 사용
# Standardization Goal
- Host Machine(flatform)의 독립성
> 대부분 하드웨어 플랫폼을 같은 프로그램이 지원함
- Device의 독립성
> 다른 입출력 장치를 지원함
- 프로그램 언어의 독립성
> 그래픽 프로그램을 쓰는 것에 대해 어느 프로그램 언어나 지원함
- Operator Porability, 이식성
> 프로그램을 어떻게 쓰는지 배우는 것이 쉬워야 함
# Graphics Privitives
* privitive: 기본 요소
- Point, Line, Fill area, Poly Line, Poly marker, Character
- 기본적인 모습
(a) pattern, color, width(colid line, dashed line, dotted line)
(b) Round Cap, Butt Cap, Projection Cap
(c) Round Join, Bevel Join, Miter Join
(d) Filled Polygon, Gradation, oblique line, outline deletion
# OpenGL Privitives
(a) GL_POINTS
(b) GL_LINES
(c) GL_LINE_STRIP
(d) GL_LINE_LOOP
(a) GL_TRIANGLES
(b) GL_QUADS
(c) GL_POLYGON
(a) GL_TRIANGLE_STRIP
(b) GL_TRIANGLE_FAN
(C) GL_QUAD_STRIP
- 단순한 다각형
> 효율적인 렌더링을 위한 볼록 다각형, 평면 다각형
* 평면 다각형: 한 평면에 놓아져야 함
# ISO Graphics Standard
- GKS,1985
> 그래픽 커널 시스템
> 유럽이 2D 그래픽을 기반으로 홍보하고 GKS-3D로 개발
> 원시시대의 좌표, 속성, 가시성, 변환 데이터를 나타냄
- PHIGS, 1989
> 프로그래머의 계층적 대화형 그래픽 시스템
> 미국이 개발, CAD의 개념
> 주로 3D 모델링 및 viewing에 초점을 맞춤
> 파일 출력: 원시 데이터 + 원시 관련 데이터 (primitive data + primitive relation data)
# Graphics API Library
- 기능적으로 분류된 클래스 및 메서드의 집합
> 하드웨어 장치에 대한 많은 지식 없이도 높은 수준의 추상 기능에서 애플리케이션을 효율적으로 구현할 수 있음
# High-level Graphic API
//Scene Description Language
Camera {
center {0.0 0.0 5.0} # camera position
direction {0.0 0.0 -1.0} # camera direction
}
Lights {
DirectionalLight{ # Light type : directional
direction {0.5 0.5 0.5} # lighting direction
color {1.0 1.0 1.0} # white light color
}
}
Background {
color {1.0 1.0 1.0} # white background
}
Group {
Material {0.0, 0.0, 1.0} # blue color
Sphere {2.0} # a first sphere with radius 2
Transform {
Translate {1.0, 0.0, 0.0} # move 1.0 on the x-axis
Scale {0.3, 0.3, 0.3} # scale down 0.3 times on each axis
Material {1.0, 0.0, 0.0} # red color
Sphere {2.0} # a second sphere with radius 2
}
}
- Low-level API
> 장면과 이벤트를 처리하는 방법에 대한 상세한 절차를 묘사
ex) DrawLine(10, 10, 100, 100)
ex) OpenGL, OpenGL ES, Direct3D, Vulkan, Metal, WebGL
- High-level API
> 특정 도면 및 이벤트 처리 절차 없이 객체 및 장면 그래프의 속성을 정의
ex) DrawTeapot(100, 100, 50)
ex) openGL GLUT, Open Inventor, X3D
# X3D
<?xml version="1.0" encoding="UTF-8"?>
<X3D>
<head>
<meta content=“X3D picture” name =“Author”/>
</head>
<Scene>
<Shape>
<Appearance>
<Material diffuseColor = “0.2 0.8 0.4”/>
</Appearance>
<Cylinder radius = “0.3” height = “5.0”/>
</Shape>
</Scene>
</X3D>
# Scene Graph
- 장면의 개체 계층을 설명하는 트리 구조
> 장면 그래프가 장면 렌더링을 위해 횡단
# History of Graphics API
# API Library Layers
- Java3D, X3D, Inventor → OpenGL, DirectX → Driver Software
# OpenGL
- Open Graphics 라이브러리
- 산업 표준 고성능 그래픽 API
- 1992년 Silicon Graphics Inc. 에 의해 개발됨
- CAD, 과학적 시각화, 게임에서 널리 사용됨
- Cross-platform, Cross-Language
- OpenGL은 비영리 기술 협력단 Khronos 그룹이 관리
- low-level API
> 객체 도면, 이벤트 처리 및 객체 도면 기능에 대한 구체적인 절차 필요
# Direct 3D
- Mincrosoft에서 지원하는 low level 그래픽 API
> DirectX 미디어 라이브러리의 일부
- Window Os만 해당됨
- 게임 프로그래밍에 최적화됨
- Unity windows 버전은 DirectX 11에 기반
- Unity mac 버전은 OpenGL 4에 기반
# Recent APIs
- Vulkan API, 2015, Khronos 그룹
> low-overhead, cross-platform 3D Graphics API
> "차세대 OpenGL 계획"으로 이름을 바꿈 / next generation OpenGL initiative
- Metal API
> Apple, 2014
> low-level, low-overhead 하드웨어 기반 그래픽
> GPGPU 프로그래밍 기능을 개선
ex) CWDA
> 그래픽 처리 장치의 범용 컴퓨팅
* GPU → 딥러닝, AI
# OpenGL Geometry Pipeline
- 객체를 그리려면 vertex data가 일련의 geometry 파이프라인 단계를 통과해야 함
> 각 파이프라인 단계는 유선 연결 GPU 칩으로 구현됨
# State Variables
- graphic context를 포함하는 변수, 어떻게 객체를 그릴 것인지에 대한
ex) color, line thickness, transform, lighting, and viewing
- 상태 변수는 OpenGL functions에 의해 상세화됨 + 다른 단계에서 공유 가능
# State Variable Table
# Graphic Context
- Case (1) 속성 overlapped
> 매개 변수: coordinates(좌표), dashed line, width, color
drawLine((1, 0), (3, 0), 3, 4, (255, 0, 0));
drawLine((3, 0), (2, 5), 3, 4, (255, 0, 0));
drawLine((2, 5), (1, 0), 3, 4, (255, 0, 0));
- case (2) 공유된 상태 변수
SetLineStyle(2);
SetLineWidth(4);
setLineColor(255, 0, 0);
drawLine((1, 0), (3, 0));
drawLine((3, 0), (2, 5));
drawLine((2, 5), (1, 0));
# OpenGL functions
- 값 특정시키기
glColor3(1.0, 1.0, 1.0); // GL_CURRENT_COLOR, 현재의 색상
glPointSize(0.5); // GL_POINT_SIZE, 점의 크기
glLineWidth(5); // GL_LINE_WIDTH, 선의 굵기
glShadeModel(GL_SMOOTH); // GL_SHADE_MODEL, 조명에 따른 음영 처리
- 값 참조하기
float MyColor[3]; // array for color components, vector 형식
glGetFloatv(GL_CURRENT_COLOR, MyColor); // 현재 색상을 불러오고 싶을 때
* v: vector
- 사용 가능한 / 사용 불가능한 함수
glEnable(GL_LIGHTING);
glDisable(GL_LIGHTING);
# OpenGL Library Classes
- GL: OpenGL 핵심 라이브러리
> 화면에 물체를 그리는 함수들로 구성
> 기본적인 랜더링 함수
- GLU: OpenGl의 유용한 함수
> GL 라이브러리를 돕는 함수로 GL에 의해 구현됨
> Polygon tessellation, projection, 2D curve surface, etc.
- GLUT: OpenGL의 유용한 toolkit
> 입력/메뉴 이벤트, window 제어 함수
> Windows 인터페이스
# OpenGL function
- vector type funcion
* vector: 원소가 여러 개인 배열과 비슷
- GL은 객체 지향이 아니고 절차적임
> 처리 속도 향상
> 오버로딩 함수가 없음 / 따라서 별도의 함수 지정 필요가 없음
* 3D & 2D 벡터 함수: glVertex3f(), glVertex2f()
# GLUT
- Window 함수를 위한 라이브러리 * OS Windows가 아님
- Callback functions: 마우스, 키보드 이벤트
# Event-driven Mode
- event 발생 시, 이벤트 레코드가 이벤트 큐에 생성됨
- 이벤트 레코드는 장치 드라이버에 의해 이벤트 핸들러로 변환됨
- input event
> mouse click, keyboard stroke
- event record
> 이벤트 타입
> 디바이스 id
> 측정값
# OpenGL Callback Function
# Window and Viewport
- Window: 프로그램이 실행되는 영역으로 운영체제 Windows와는 다름
- Viewport: 그림이 그려질 영역으로 지정하지 않으면 window 전체가 viewport가 됨(동기화)
- 초기 viewport는 window와 동기화되어 있음
- viewport 설정이 없는 window 안의 그림은 window의 크기가 변할 때 왜곡될 수 있음
# GLUT Coordinate
* GLUT과 GL은 좌표계 기준이 다름
# GL Coordinate
# GL, GLUT Coordinate Conversion
- GLUT: {(x1, y1), (x2, y2)}
- GL: {(x1, windowHeight-y1), (x2, windowHeight-y2)}
# Hierarchical Representation
# Cube in OpenGL
# 정점 8개 정의
MyVertices = [[-0.25, -0.25, 0.25], [-0.25, 0.25, 0.25],
[0.25, 0.25, 0.25], [0.25, -0.25, 0.25], [-0.25, -0.25, -0.25],
[-0.25, 0.25, -0.25], [0.25, 0.25, -0.25], [0.25, -0.25, -0.25]];
glBegin(GL_POLYGON) # 면을 그림
glVertex3fv(MyVertices[0]) # CCW 방향으로 그리는 앞면
glVertex3fv(MyVertices[3])
glVertex3fv(MyVertices[2])
glVertex3fv(MyVertices[1])
glEnd()
- Other surfaces : (2, 3, 7, 6), (1, 2, 6, 5), (0, 1, 5, 4), (0, 4, 7, 3), (5, 6, 7, 4)
* CCW 방향으로 정점을 나열해야 함
# Front Surface
- vertex, 즉 점의 순서가 표면의 앞면을 결정
- default font side: 반시계 방향, 0, 3, 2, 1
* OpenGL은 backspace 즉, CW 방향이 자동이 아니므로 사용하려면 기능을 켜야 함
- 반대편은 뒷면이며, 계산 부하로 그려지지 않음
# Color Cube
# GLUT Modeling
glutSolidCube(size) # size = 반지름
glutWireCube(size)
glutSolidSphere(radius, slices, stacks)
glutSolidTorus(innerRadius, outRadius, nsides, rings)
glutSolidCone(base, height, slices, stacks)
glutSolidTeapot(size)
# Torus
glutSolidTorus(minorRadius, majorRadius, nsides, rings)
# glRectf으로 사각형 그리기
from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *
class HelloOpenGL:
def MyDisplay(self): # 디스플레이 콜백함수
glClear(GL_COLOR_BUFFER_BIT) # 배경화면 지우기
glColor3f(0.5, 0.5, 0.5) # stroke color
glRectf(-0.5, 0.5, 0.5, -0.5) # (x1,y1,x2,y2)
glFlush() # 프레임 버퍼에 그린 내용 화면 출력
def main(self):
glutInit() # 초기화/윈도우 연결
glutCreateWindow("Lab 01 - Drawing an Object") # 타이틀 바 title, 윈도우 생성
glClearColor (0.0, 0.0, 0.0, 1.0) # 배경화면 색 설정
glMatrixMode(GL_PROJECTION)
glLoadIdentity( ) # 변환행렬 초기화
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0) # 뷰 볼륨 설정(wid,hei,dep 순)
glutDisplayFunc(self.MyDisplay) # 디스플레이 콜백 등록
glutMainLoop( ) # 이벤트 루트
h = HelloOpenGL() # 객체 생성
h.main() # main 실행
'Study > Computer Graphics' 카테고리의 다른 글
[CG] 4. Geometry Transformation (0) | 2021.10.13 |
---|---|
[CG] 3-2. OpenGL Event Handling (0) | 2021.10.08 |
[CG] 2-2. Color Models (0) | 2021.10.04 |
[CG] 2-1. Graphics System (0) | 2021.09.20 |
[CG] 1. History and application (0) | 2021.09.14 |