Window Programming
용어
Windows Procedure : a function that handles specific messages
the parameters for the windows procedures mean specific messages
when a message is created, a windows procedure corresponding to the message is called
Win32 SDK : standard C library necessary to develop an application program on Windows OS
MFC (Microsoft Foundation Class) : C++ class library necessary to develop an application program on Windows OS.
it is built based on Win32 API, but does not include all Win32 API's
WinMain function : function prototype and initializing contents. generates a window and registers it to the OS and a frame window in memory and a message loop and initializes the property for display.
WinProc function : a routine that processes messages from the window using switch phrases. function prototype and message handling
Message Loop : retrieve the message from window and forward to corresponding window procedures.
SDI ( Single Document Interface) : has only one document frame window
MDI ( Multiple Document Interface) : has multiple document frame windows in common application instance.
it has the form of multiple SDI's
Template : form of a window
Main Frame : Outer boundary of a window application. it has a menu, a toolbar, and a status bar
View Window : takes charge of screen handling including text and graphics output.
Document : reads and writes data from the disk.
Application Class : an application class that includes an instance
Class view : displays classes as configured in the project
Resource view : displays the list of resources including menu, dialog box, string, icon, bitmaps, etc.
Solution Explorer : displays file list configured in the project.
Message : a constant value that delivers an event's type and information
window message : a message whose name begins with 'WM_' except for WM_COMMAND
command message : WM_COMMAND message generated from the user interface objects (menu, toolbar, ..)
Message Map : a table that stores the message numbers and the pointers of the functions called when the message occurs. It used to connect the message transferred the a program and the messgae handler.
Message Handler Function : A class member function that handles a specific message whenever it is delivered from the Windows to the application.
Invalidate() function : causes the system to call the WM_PAINT message, which calls the OnDraw() function, redrawing the window.
Invalidate(TRUE) : deletes the backgorund and redraws it.
Invalidate(FALSE) : leaves the backgorund unchanged and redraws only the changed part.
Dialog : an interface between a user and windows.
UpdateData() function
- UpdateData(TRUE) = retrieve the data in the control
- UpdateData(FALSE) = update a specific value to the control
Graphics Rendering & Pipeline
용어
Graphics API
- API = 함수를 이용하여 프로그램을 작성하는데 직접 활용할 수 있도록 함.
- High-Level API : 프로그래머에 가까운 API. 물체 정의 & 물체 사이 관계 묘사 (Open Inventor)
- Low-Level API : 물체를 구성하는 기본 요소의 정의부터, 그림그리는 세부 과정 일일히 명시 (OpenGL)
OpenGL : is not an API, but merely a specification, developed and maintaind by the Khronos Group.
GLFW ( Graphics Library Framework) : allows us create a window, make a run loop and process the input in abstract platform independent way.
GLAD ( OpenGL Loading Library) : help us to retrieve the location of the functions needed and stores them in function pointer.
Double Buffering : 플리커링 현상을 방지하기 위해 2개의 프레임 버퍼를 사용하는 것
RAMDAC : 프레임버퍼의 내용을 화면에 뿌리는 디지털-아날로그 변환기)
flickering : 프레임버퍼의 내용이 바뀌는 동시에 화면에 실시간으로 반영되어 화면이 깜빡거리는 현상.
Primitive : 점, 선, 삼각형 등 OpenGL 렌더링 기본단위
Vertex : 정점. 좌표상 하나의 점
Rasterizer : 하드웨어 가속기 (Primitive 렌더링)
Frame buffer : 화면에 보이는 영역, 색상 + 픽셀당 값을 저장히기 위해 사용되는 추가적인 메모리 영역
Shader : 각 코어에서 스테이지 별로 작동하는 작은 프로그램
Stage : 그래픽스 파이프라인 과정에서 기능에 따라 처리되는 단계
graphics pipeline frontend ; vertex ,primitive 를 처리하여 점, 선, 삼각형으로 구성 & rasterizer에 전달
graphics pipeline backend : depth, stencil test, fragment shading, blending 등 수행
Tessellation (조각화) : 사각형, 삼각형, 선 등의 patch 또는 고차원 primitive를 더 작고 단순한 여러개의 렌더링 가능한 primitive로 분할하는 작업. ( = Primitive Assembly State)
Tessellation control shader : vertex shader 입력으로부터 tessellation 레벨, tessellation 이 수행디ㅚㄴ 이후 TES에 보낼 데이터 생성
TES (Tessellation Evaluation Shader) : Tessellation engine 이 실행되어 생성된 primitive에 대한 출력 vertex 생성
Geometry shader : 파이프라인 내 데이트 흐름량 조절, Primitive 모든 변경
Rasterization : 프래그먼트들이 선이나 삼각형 등의 primitive에 의해 채워지는지 결정하는 작업
Fragment : 한 픽셀의 최종 색상에 적용되는 하나의 요소
Fragment Shader : OpenGL 에서 마지막으로 프로그래밍 가능한 스테이지.
NDC (Normalized Device Coordinates) : 정규좌표, 각 축에서 좌표값이 -1.0 ~ 1.0 이내로 표현되는 정규 좌표계.
MipMap : 텍스쳐 이미지들의 크기 별 집합.
O / X
OpenGL 설계 원리
- 범용성 : 거의 대부분의 하드웨어에서 실행 가능
- 효율성 : 하드웨어에서 지원하지 않는 기능 비활성화 가능
- 독립성 : 각 기능간 독립성 최대한 보장
- 완전성 : 특정 하드웨어 전용 기능을 실행하는 확장 명령어를 제공하여, 하드웨어의 최대 성능 사용 가능
- 상호작업성 : 워크스테이션에 있는 GL 프로그램(클라이언트)에 그래픽 서버가 명령을 내릴 수 있다.
Core-profile mode는 immediate mode보다 배우기 어렵지만, 실제 OpenGL과 그래픽스 파이프라인의 작동원리르 보다 잘 이해할 수 있도록 한다.
OpenGL 은 state machine (상태 기계). 상태는 OpenGL Context 라고 한다.
일반적인 비디오카드에서 프레임버퍼는 2중 포트 구조이다. (한쪽에는 그래픽 프로세서, 한쪽에는 비디오 컨트롤러 연결)
그래픽 프로세서는 프레임버퍼에 물체 영상을 써나가는 역할
비디오 컨트롤러는 프레임버퍼의 내용을 읽어서 화면에 뿌림
프레임 버퍼에는 색상값만 들어있다. (X)
GLSL 은 C와 문법이 같다. (x)
TES는 출력 vertex 에 대해서 한번씩 호출을 수행한다. (여러번 X)
Shader
#version core 330
in type var1;
in type var2;
out type var3;
uniform type var4;
void main() {
var3 = x;
}
Shader Type
int, float, double, uint, bool
vecN, bvecN, ivecN, uvecN, dvecN
sampler2D // GLSL에서 텍스쳐 객체를 위한 내장 데이터타입
mat4
swizzling
vec2 someVec;
vec4 vec = someVec.xyxy;
Uniform 변수값 전달
int glGetUniformLocation(shader.ID, "변수이름");
glUniformf(loc, 0.0f);
glUniformi
glUniformui
glUniform3f
glUniform4f
glUniformfv
glUniformMatrix4fv
Texture Wrapping
GL_REPEAT
GL_MIRRORED_REPEAT
GL_CLAMP_TO_EDGE
GL_CLAMP_TO_BORDER
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, 속성);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, 속성);
glTexParameterifv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);
// forderColor 는 fv (float vector / array) 형태
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
속성값으로 int 형 데이터를 설정.
행렬 변환
translation
mat4 mat = glm::translate(fromMat, glm::vec3(1.0f, 1.0f, 1.0f));
rotatation
glm::rotate(glm::mat4 mat, glm::radians(degree_float), glm::vec3 axisVec);
Scale
glm::scale(glm::mat4 mat, glm::vec3 scaleVec);
물체에 변환을 가할 때는 크기조절 -> 회전 -> 이동 순으로 변환 C = TRS
glm 행렬은 column major 임에 주의
Projection
평행 투상
glm::ortho(left, right, bottom, up, near, far);
원근 투상
최종
glm::perspective(fov, aspect, near, far);
VCS
glm::lookAt(glm::vec3 position, glm::vec3, target, glm::vec3 up);
카메라의 위치를 설정하는 함수
카메라가 움직이는 대신, 그 반대로 좌표계를 돌린다고 생각하면 된다.
'CS > HCI 윈도우즈프로그래밍' 카테고리의 다른 글
[Computer Vision] 2. Geometry Primer (1) : Homogeneous Coordinates (3) | 2024.05.31 |
---|---|
[Computer Vision] 1. introduction (0) | 2024.05.29 |
[OpenGL] 18. Transformation (6) - View Change (VCS) (0) | 2024.04.21 |
[OpenGL] 17. Transformation (5) - Projection & Perspective Normalization (0) | 2024.04.20 |
[OpenGL] 16. Transformation (4) - 셰이더에 행렬 변환 적용하기 (1) | 2024.04.19 |