글

220930) RGBA, 알파테스트, 알파블렌딩, 알파소팅, Z-fighting

이미지
RGBA RGB 색상값에서 '알파 채널 값'을 더한 색상값이다. 알파값이란 텍스처에서 투명도를 나타내기 위한 값이며, RGB값처럼 0~1까지의 범위를 가진다. 알파테스트 임의로 설정한 값을 기준 으로 알파채널의 값에 따라 결과값을 1, 없으면 0으로 판단하여 투명도를 결정하는 방법 으로, 간단명료하여 연산속도가 빠르지만 , 중간값이 없어 반투명이 존재하지 않는다. --- 알파블렌딩 대상(Dest)에 원본(Src)을 변경/조합해서 픽셀 색을 조정하는 방법. 투명도를 세밀하게 주어 반투명을 표현할 수 있는 방법이며, 반투명한 객체가 여러 장 겹쳐있어도 전부 보이는 것처럼 모든 픽셀은 언제나 보일 수 있다는 것을 전제로 작동한다. 때문에 깊이 테스트를 하여 위치 값을 재정렬하고, 다시 찍어서 모든 픽셀의 색상을 전부 계산해야 하기 때문에 처리속도가 느리다. --- 알파 소팅 실시간 렌더링에서 처리속도를 올리는 기법 중 하나. 일반적으로 알파가 없는 오브젝트 들은 화면 앞쪽 오브젝트 부터 뒤쪽 오브젝트 까지 순서대로 렌더링 하는 것이 가려진 오브젝트를 렌더링하지 않아도 되기 때문에 처리속도가 빠르다.  그러나 알파값이 있는 오브젝트는 앞에 그리더라도 뒤쪽 오브젝트를 그려야 하기 때문에 위처럼 처리할 수 없다. 알파값이 있는 오브젝트 는 반대로 뒤쪽부터 그린다. 이처럼 알파값이 있는 오브젝트 와 없는 오브젝트 를 따로 그려 렌더링하는 기법을 알파 소팅 이라 한다. Z-Fighting 두 개의 폴리곤이 유사한 Z깊이 값을 가지고 있어 두 객체가 눈에 깜빡거리듯이 번갈아 나타나는 증상 을 가리킨다. 이는 두 객체 중 무엇을 우선적으로 렌더링을 해야 하는지 알 수 없어 발생하는 현상이기 때문에 이를 해결하기 위해서는 개발자가 표현하고자 하는 순서를 명확하게 제시할 필요가 있다. 순서를 명확히 하는 방법은 여러가지가 있다. 1. Z축의 소수점 단위로 수치를 조절하는 방식 2. 카메라의 near와 far plane값을 조절하는 방식 (카메라에 근접할수록 ...

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