묻공러
'분류 전체보기' 카테고리의 글 목록 (27 Page)

분류 전체보기

게임 그래픽스/[전북대] OpenGL

[OpenGL Note] 2D Transform

ScalingScaling은 uniform scaling과 non-uniform scaling으로 구분되고아래와 같은 연산을 통해 Scaling 변환이 가능하다 Rotation아래와 같은 연산을 통해 Rotation 변환이 가능하고CCW 기반으로 각도가 증가한다위의 연산은 기준점이 원점인 경우에만 가능하다따라서,기준점이 다른 경우에는1) 기준점을 원점으로 이동시킨다 (Translating)2) 회전한다 (Rotating)3) 1번에서 차이가난 만큼 다시 해당 좌표를 이동시킨다 (Back-Translating) TranslationScaling과 Rotation은 행렬의 곱으로 연산이 되지만Translation(이동) 변환도 행렬의 곱으로 연산하기 위해서Homogeneous Coordinates (동차좌표..

게임 그래픽스/[전북대] OpenGL

[OpenGL Note] 렌더링 파이프라인

렌더링 파이프라인렌더링 파이프라인의 핵심적인 4단계는 위와 같다vertex shader, fragment shader는 개발자가 직접 처리해야한다rasterizer, output merger는 GPU가 정해진 규칙에 따라 자동으로 처리해준다 DirectX 렌더링 파이프라인더보기DirectX에서는 Vertex Shader와 Ratsterizer의 단계 사이에 Tesselelator와 Geometry Shader 단계가 추가로 있다 [Tesselator]테셀레이터는 다각형을 겹치지 않고 작게 만들어 빈틈을 없애 게임 등에서 사물이나 인물등을 실제에 보다 가깝게 표현할수 있게 도와주는 기술총 3단계로 구성된다HullShader → Tesselation → DomainShader  Hullshader는 Vert..

게임 그래픽스/[전북대] OpenGL

[OpenGL Note] 모델링

Polygon Mesh 구를 모델링하는 경우 두 가지 방식으로 구현할 수 있다 Implicit representation으로는 원의 방정식을 통해 구현한다 Explicit representation으로는 Polygon Mesh (특히, Triangle)를 통해 구현한다 모델링 툴에서는 Quad mesh를 일반적으로 사용하기 때문에 해당 Quad를 두 개의 Triangle로 변환해서 사용한다 완전하게 부드러운 구의 형태는 Implicit 방식이 더욱 가깝지만 GPU의 빠른 병렬 연산에 효율적인 Explicit 방식을 사용한다 LOD(Levels Of Detail) 모델을 폴리곤 메쉬의 정점 개수에 따라서 여러 버전을 만드는 것으로 멀리 있는지 가까이 있는지에 따라서 LOD를 적용한다 Vertex Array..

게임 그래픽스/[전북대] OpenGL

[OpenGL Note] 기초 수학

행벡터(Row Matrix)와 열벡터(Column Matrix) OpenGL은 열벡터(Column Matrix)를 사용하고 DirectX는 행벡터(Row Matrix)를 사용한다 전치행렬 행렬의 행과 열을 서로 바꾼 행렬이다 단위행렬 오른 대각선으로 1이 작성된 행렬로 그 어떤 행렬과 곱해도 기존 행렬에 영향을 주지 않는다 역행렬 곱해서 단위행렬이 나오는 행렬을 의미한다 행렬의 법칙 행렬의 곱셈에서 교환법칙은 성립하지 않는다 행렬의 곱셈에서 결합법칙은 성립한다 벡터의 길이 벡터의 유클리디안 거리/길이는 ||v||로 표현하고 벡터를 길이로 나누는 것을 정규화라고 한다 정규화된 벡터는 길이가 1이고 단위 벡터라고 표현한다 좌표계 좌표계는 origin(원점)과 basis(기저)로 나타낸다 같은 위치라도 좌표계..

게임 그래픽스/[전북대] OpenGL

[OpenGL Note] OpenGL 라이브러리와 작동 방식

OpenGL 라이브러리 #include #include OpenGL을 활용하기 위해 사용하는 대표적인 라이브러리는 GLFW와 GLEW이다 -GLFW (Graphics Library Framework) GLFW는 OpenGL 애플리케이션의 창 관리 및 입력 처리를 담당하는 라이브러리이다 -GLEW (OpenGL Extension Wrangler Library) GLEW는 OpenGL 확장 기능을 쉽게 사용할 수 있도록 도와주는 라이브러리이다 OpenGL 작동방식 일반적으로 작동방식에는 객체지향 방식과 State Machine 방식으로 구분된다 OpenGL은 State Machine 방식을 사용한다 객체지향 방식 vs. State Machine 방식 // 객체지향 방식 Triangle t1, t2; //삼각..

게임 그래픽스/[전북대] OpenGL

[OpenGL Note] 컴퓨터 그래픽스

컴퓨터 그래픽스의 개념3차원 기반으로 물체를 표현하고렌더링 파이프라인을 통해 프레임이라는 이미지를 만들어낸다 프레임이 30fps 이하라면, 비실시간 컴퓨터 그래픽스이고프레임이 30fps 초과라면, 실시간(real-time) 컴퓨터 그래픽스이다 컴퓨터 그래픽스의 과정modeling, rigging, animation은 미리 작업하고rendering, post-processing은 run-time 작업을 한다- Modeling 모델은 컴퓨터가 물체를 표현한 것으로 폴리곤 메쉬(주로, 삼각형)를 이용해서 표현한다 이처럼 기하학 정보와 색상 정보를 이미지로 저장해 둔 텍스쳐를 통해 모델을 만드는 과정이다 - Rigging 모델의 움직임을 위한 뼈대를 심는 과정이다 - Animation 모델의 리깅을 통해 움직임..

C++/[노코프] Tips

[C++ Tips] Data oriented Programming

빠르게 연산을 해서 decision making을 해야 하는 분야인 경우에는 OOP로 컨셉으로 코드를 작성했다면, Memory Access Time으로 인해 피해를 볼 수 있다 C++를 사용하는 이유는 기본적으로 OOP와 performance를 둘 다 잡기 위해서 사용한다 하지만 위처럼 performance가 중요한 분야인 경우에는 OOP를 반드시 버려야 한다 아래의 코드는 OOP로 인해 performance에 문제가 발생하는 경우이다 price의 평균을 구해야 하는 경우에 반복문이나 람다 함수를 이용하면 된다고 생각할 수 있지만 이는 매우 느리다는 것이 문제이다 #include #include class Stocktrading { public: // private: int price; int id; s..

C++/[노코프] Tips

[C++ Tips] Early Return

GPU 프로그래밍에서는 Early Return이 필수이다 CUDA의 경우에 하나의 warp에 16개의 thread가 동시에 연산을 처리한다 그중 한 개의 thread가 다른 작업을 한다면 나머지 thread들은 wait 상태로 있어야 한다 따라서, GPU 프로그래밍에서는 thread가 더 이상 필요하지 않으면 warp에서 thread를 없애주는 방식으로 코드를 작성하는 것이 당연하다 이를 CPU 프로그래밍에서 활용하면 성능 향상과 코드 가독성을 보장하고 오류 처리가 더욱 쉬워진다 Early Return을 사용하지 않는 일반적인 코드는 아래와 같다 bool vaccinate(Cat& cat) { if (1

C++/[노코프] Tips

[C++ Tips] Function Overloading

함수 오버로딩은 매개변수의 종류 및 개수가 다른 경우에만 허용된다 반면, 반환 타입은 함수 오버로딩에 영향을 미치지 않는다 그 이유는 1) 호출 시 함수를 식별하는 기준 : 함수를 호출할 때 컴파일러는 함수의 이름과 매개변수 목록을 기반으로 호출할 함수를 식별한다 반환 타입은 이러한 함수 식별 과정에서 고려되지 않는다 2) 호출 시 반환 값의 사용 : 함수를 호출한 곳에서 반환 값을 사용하지 않을 수도 있다 따라서 반환 타입만으로는 함수 오버로딩이 결정되지 않는다 3) C++ 문법의 간결성 : C++의 문법은 간결하고 명확해야 한다 반환 타입이 함수 오버로딩에 영향을 미친다면 코드를 이해하기 어려워질 수 있다 따라서 C++에서는 함수 오버로딩에는 반환 타입이 고려되지 않으며, 함수의 이름과 매개변수 목록..

C++/[노코프] Tips

[C++ Tips] 싱글톤

자바나 파이썬과 같은 모던 랭귀지들은 싱글톤 키워드만 사용하면 쉽게 싱글톤 패턴을 구현할 수 있다 하지만 C++에서는 싱글톤을 만들기 위해 조금 복잡하게 구현해주어야 한다 싱글톤은 단 하나의 오브젝트만 만들어서 사용하는 경우에 이용한다 싱글톤을 구현할 때, 오브젝트는 힙에 할당하고 포인터를 데이터 공간에 선언해 놓고 해당 포인터를 반환해서 사용하는 싱글톤 형태의 문제점은 해당 포인터에 nullptr를 넣거나 해당 포인터를 free를 통해 해제한다면 문제가 발생한다 따라서, 데이터 공간에 오브젝트를 생성하고 레퍼런스로 가져와서 사용하는 것이 가장 안전하다 #include class Singleton { public: static Singleton& getInstance() { static Singleton..