글

220825)함수 포인터, Lambda 함수, thiscall

이미지
함수 포인터 함수의 주소를 가리킬 수 있는 포인터 변수. [ (반환값 자료형) (*포인터명) (매개변수 자료형...) ]의 꼴로 선언할 수 있다. 선언한 포인터의 반환값 과 매개변수 와 같은 자료형 을 가진 함수를 저장할 수 있다. (예시) 함수 포인터 선언: float (*fp)(int, int); 저장할 수 있는 함수: float Func(int a, int b); 함수를 포인터에 저장: fp = Func; 함수 포인터를 통한 호출: fp(3, 5); C++ 11부터는 using을 사용하면 특정 함수 포인터에 대한 별칭을 만들 수 있다. using funcPt = float(*)(int, int); 또한 C++ 11부터 표준 라이브러리 <functional> 헤더를 통해 std::function 을 사용한 함수 포인터의 정의가 가능하다. ---- #include <functional> std::function<float(int, int)> funcPt; funcPt = Func; // float Func(int a, int b)꼴로 선언된 함수; funcPt(3, 5); ---- Lambda 함수 익명의 함수를 정의할 수 있는 방법. 함수가 호출되거나 인수로 사용되는 위치에서 즉석으로 함수를 정의하여 캡슐화하는 데에 사용된다. 람다식은 다음과 같이 정의한다. --- [캡쳐 블록]( 매개변수 목록 ) mutable throw() -> 반환자료형 { 함수 내용 } ※ 기울임체는 생략가능한 코드 --- 자세한 참조:  https://jungwoong.tistory.com/51 함수 호출 규약 - thiscall 함수의 호출 규약은 함수 호출 시 전달된 매개변수를 함수가 종료될 때 정리하는 방법으로서 cdecl, stdcall, fastcall, thiscall 4가지가 존재한다. 이 중 thiscall 은 C++언어의 멤버함수에서 쓰이고 나머지는 C언어에서 사용된다. thiscall은 ecx에 인스턴스의 주...

220823)임계영역, 교착상태

이미지
임계 영역(Critical Section) 두 개 이상의 스레드가 공유자원에 접근할 때, 오직 한번에 하나의 스레드만의 독점을 보장해줘야하는 자원을 일컫는다. 임계 영역은 지정된 시간이 지난 후 종료되며, 어떤 스레드가 임계 영역에 들어가고자 한다면 지정된 시간 만큼 대기해야 한다. 스레드가 공유자원의 배타적인 사용을 보장받기 위해서 임계 영역에 들어가거나 나올 때는 세마포어 같은 동기화 매커니즘이 사용된다. 참조:  https://ko.wikipedia.org/wiki/%EC%9E%84%EA%B3%84_%EA%B5%AC%EC%97%AD --- 교착 상태 (Dead Lock) 둘 이상의 프로세스가 다른 프로세스가 점유하고 있는 자원을 서로 기다릴 때 무한 대기에 빠지는 상황을 뜻한다. 데드락 이 발생하기 위한 조건은 다음과 같다. 상호배제: 한 번에 프로세스 하나만 해당 자원을 사용할 수 있다. 점유대기: 자원을 최소한 하나 보유하고, 다른 프로세스에 할당된 자원을 점유하기 위해 대기하는 프로세스가 존재해야 한다. 비선점: 이미 할당된 자원을 강제로 빼앗을 수 없다. 순환대기: 대기 프로세스의 집합이 순환 형태로 자원을 대기하고 있어야 한다. 위 네 가지를 하나라도 발생하지 않도록 하는 것이 데드락을 예방하는 방법이다. 시스템의 프로세스들이 요청하는 모든 자원을 할당해주면서도 데드락을 발생시키지 않는다면 '안정 상태(safe state)' 에 있다고 말한다. 참조:  https://chanhuiseok.github.io/posts/cs-2/

220822)멀티 프로세싱, 멀티 스레딩, 동기, 비동기

이미지
멀티 프로세싱(Multi Processing) 다수의 프로세서가 여러 작업을 함께 처리하는 것을 뜻한다. ※프로세서: 프로그램을 수행하는 하드웨어 유닛 (프로세스와는 다름) --- 멀티 스레딩(Multi Threading) 일반적으로 하나의 프로세스는 한 개의 스레드를 가지고 작업을 수행한다. 그러나 멀티 스레드를 사용하면 하나의 프로세스 내에서 둘 이상의 스레드를 사용해 작업을 수행할 수 있다. 멀티 스레드는 각 스레드가 자신이 속한 프로세스의 메모리를 공유 하기 때문에 시스템 자원의 낭비를 줄일 수 있으며, 여러 스레드가 작업을 보조하기 때문에 사용자와의 응답성이 좋아진다. 참고:  http://www.tcpschool.com/java/java_thread_multi 동기(Synchronous) 요청과 결과가 동시에 일어날 것이라는 약속을 한 상태. 요청을 하면 결과가 반드시 주어져야 한다. 간단하고 직관적 인 방식이지만 결과가 도착할 때 까지 아무것도 안하고 대기해야 한다 는 특징이 있다. --- 비동기(Asynchronous) 요청과 결과가 동시에 일어나지 않는다는 약속을 한 상태. 요청에 따른 결과가 보장되지 않는다. 동기방식보다 복잡하나 , 결과가 도착하는 데에 시간이 걸리더라도 그 동안 다른 작업을 진행할 수 있어 자원을 효율적으로 사용할 수 있다 는 특징이 있다. 참고:  https://private.tistory.com/24

220819) GPGPU (General-Purpose computing on Graphics Processing Units)

 GPGPU(General-Purpose computing on Graphics Processing Units, GPU 상의 범용 계산) GPGPU 는 일반적으로 컴퓨터 그래픽스를 위한 계산만 맡았던 그래픽 처리 장치(GPU)를, 전통적으로 중앙 처리 장치(CPU)가 맡았던 응용 프로그램들의 계산에 사용하는 기술 이다. 이를 가능하게 한 것은 프로그램 가능한 층과 고정도 연산을 그래픽 파이프라인에 연결하는 것으로, 이를 통하여 소프트웨어 개발자들이 그래픽이 아닌 데이터에 스트림 프로세싱을 사용할 수 있게 된다. GPGPU로 CPU 한 개에 비해 100배~250배의 속도 향상을 이룰 수 있지만, 병렬도가 지극히 높은 응용 프로그램에서만 이 정도의 혜택을 볼 수 있을 것이다. 한 개의 GPU 처리 코어는 데스크톱 CPU의 코어 한 개와 대등하지 않다. 출처 :  https://ko.wikipedia.org/wiki/GPGPU

220726) 사원수(Quaternion), 오일러회전(Yaw,Pitch,Roll), 짐벌락(gimbal lock)

이미지
사원수(Quaternion) a+bi+cj+dk 형태의 수(a,b,c,d는 실수)이다. 다음과 같은 성질을 만족시킨다. ※ 사원수의 곱셈은 교환법칙을 만족시키지 않는다. 어떤 물체의 자세를 기준좌표계에 대하여 표현할 때, 단위벡터 (e1,e2,e3)에 대하여 θ만큼 회전한 자세는 사원수로 다음과 같이 표현한다. 사원수는 4개만의 적은 개수의 숫자로 회전을 표현하여 효율적인 계산을 할 수 있다. 오일러각도와 YawPitchRoll 축을 통한 회전에는 두 가지 방법이 존재한다. 1. 오일러 각도를 통한 회전(post-multiplication, 행렬을 뒤에 곱하는 방법) 2. YawPitchRoll을 통한 회전(pre-multiplication, 행렬을 앞에 곱하는 방법) ----- 오일러 각도 강체의 자세를 좌표축의 회전으로 표현하는 여러 방법 가운데 하나로, 3x3 회전행렬을 직관적으로 이해하고 행렬의 원소를 단 3개의 Parameter로 간략하게 표현하기 위해 사용하는 방법이다. (Z축을 기준으로 θ만큼 회전했을 때의 행렬) ----- Yaw, Pitch, Roll 강체의 자세를 '고정된' 회전축을 기준으로 회전을 표현하는 방법이다. Roll: x축을 기준으로 회전한 각도 Pitch: y축을 기준으로 회전한 각도 Yaw: z축을 기준으로 회전한 각도 이를 행렬으로 표현하면 다음과 같다. 짐벌락 현상(Gimbal lock) 같은방향으로 오브젝트의 두 회전 축이 겹치는 현상. 짐벌락이 발생하는 경위는 다음과 같다. 1. x축, y축, z축 각각의 회전행렬을 만든다. yaw(y축 회전각) pitch(x축), roll(z축) 2. 회전 행렬을 객체의 변환행렬과 각각 순서대(x, y, z)로 곱한다.(오일러각) 3. x축을 90도 틀고난 후 y축으로 90도 튼것과    y축을 90도 틀고난 후 z축으로 90도 튼것과의 회전 값이 같다. 4. 세 개의 축 각을 이용하여 항상 순서대로 회전을 하면 위와같이 한 개의 축이...

220725) 키프레임 애니메이션, 스키닝 애니메이션

이미지
키프레임 애니메이션 애니메이션에서 객체의 정보들을 보유한 두 개의 키프레임 사이의 객체들의 움직임을 보간하는 방법이다. (※프레임: 애니메이션에서 출력되는 한 장면, 초당 프레임개수가 클 수록 움직임이 부드럽다) (예시: 객체의 시간에 따른 위치를 선으로 표현, 선은 점 <키프레임> 에 대한 정보에 기반하여 그려진다) ----- 스키닝 애니메이션 메시를 구성하는 정점(Vertex) 을 ' 뼈대(Bone) '에 링크하여 뼈대 의 좌표에 따라 정점 을 움직이게 하는 기술. 뼈대 의 중량(weight) 에 따라 링크된 정점 에 영향을 미치는 정도가 달라지며, 한 정점 에 링크된 모든 뼈대 의 중량 의 합은 1.0이다. 정점 의 위치를 결정하는 최종변환 행렬은 그 정점 에 링크된 모든 뼈대 의 중량 과 변환행렬을 곱한 것들의 합이 된다. Stages for preparing a character (modeling, rigging, and skinning) 사진출처:  https://docs.unity3d.com/Manual/UsingHumanoidChars.html

220712) 포워드 렌더링, 디퍼드 렌더링, PBR(물리기반 렌더링), 퐁쉐이딩, Ambient Light, Diffuse Light, Specular Light

이미지
포워드 렌더링 전통적인 렌더링 방식, 3D공간에 존재하는 폴리곤을 픽셀화하여 그 픽셀마다 쉐이딩과 라이팅을 더한다. 장점 - 저사양에서도 작동 - PC에서는 안티앨리어스 처리를 하드웨어에서 지원받으므로 거의 완벽한 처리가 됨(반투명 처리도 문제없다) - 가장 오래된 렌더링 방식이기 때문에 생겨난 문제에 대한 해결책도 어느정도 존재함 - 해상도가 올라가도 요구하는 메모리가 디퍼드 렌더링에 비해 적음 단점 - 라이팅 연산이 느림 - 수많은 오브젝트가 있는 배경이나 폴리곤이 많은 모델을 상대로 하기 어렵다 - 그림자 처리가 어려움 - 화면 깊이값을 이용한 포스트 이펙트는 따로 처리해주어야 함 --- 디퍼드 렌더링 한 화면에 수많은 라이팅 효과를 넣기위해 사용하는 렌더링 기법, 라이팅 기법을 먼저 하지 않고 미루었다 실행하기 때문에 '지연 쉐이딩'  이라고도 부른다. [폴리곤 픽셀화->정보를 나누어 비디오 메모리에 저장->각종 쉐이더와 라이팅효과를 거쳐 화면에 표현] 하는 순서를 가진다. 장점 - 수많은 동적라이팅을 실시간으로 보여줄 수 있음 - 그림자를 손쉽게 그릴 수 있음 - 쉐이더를 간단하게 지원해줄 수 있음 - 픽셀정보를 메모리에 저장함으로서 생기는 이점 활용가능(ex:화면의 깊이값을 이용한 특수효과 등) - 수많은 오브젝트와 복잡한 모델링을 표현할 때 유리 단점 - 뒤에 그려지는 오브젝트 정보가 비디오 메모리에서 소실됨 (알파가 빠지는 오브젝트 표현x) - 요구하는 하드웨어 사양이 높음 - 해상도가 올라갈수록 요구 비디오 메모리가 기하급수적으로 늘어남 - 안티앨리어스를 구현하기 까다로움 --- PBR(물리 기반 렌더링) 물리 기반 쉐이딩(PBS)이라고도 불리는 물리 기반 렌더링(PBR)은 조명과 재질 속성의 상호 작용 방식을 정확하게 구현하는 쉐이딩 및 렌더링 기법. PBS는 쉐이딩에 특화된 것이고, PBR은 렌더링과 조명을 위한 기법으로 3D 모델링 워크플로우에 따라 적절히 사용할 수 있다. 두 가지 모두 물리적으로 정확한 지점에서...