글

라벨이 DirectX인 게시물 표시

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

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

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. 세 개의 축 각을 이용하여 항상 순서대로 회전을 하면 위와같이 한 개의 축이...

220621) Space(Matrix), view, projection, NDC, viewport

이미지
Space (Matrix적 의미) 오브젝트를 '공간'에 잡아두기 위한 행렬을 일컫는다. 모든 오브젝트는 각자 ' SRT Transform' 이 포함된 고유의 Space를 가지고 있는데, 하나의 오브젝트를 구성하는 작은 부품들은 Local Space 를 중심으로 구성되어있으며, 구성된 오브젝트는 장면을 구성하는 World Space 를 중심으로 배치될 위치가 결정된다. 장면이 완성되면 View Space 에서 장면 내 오브젝트들을 바라보는 시선(방향)이 결정되며, Projection Space 를 통해 우리들의 눈에 어떻게 투영될 지를 결정한다. 이렇게 완성된 Clip Space 는 Viewport 변환을 통해 어디까지 윈도우에 표현할 지를 결정할 수 있다. --- View Matrix World Space 를 바라볼 위치를 결정하는 행렬이다. View Matrix 는 카메라에 비유되고, View Space 는 카메라로 바라본 세계에 해당한다. --- Projection Matrix 카메라로 바라본 세계를 어떻게 투영할 지를 결정하는 행렬이다. Projection하는 방법으로는 크게 ' Orthographic projection', 'Perspective projection' 이 있다. Perspective : 원근법이 적용되는 3D 화면에서 주로 사용됨. Orthographic : 직각 투영, 원근법이 없는 2D 화면에서 주로 사용됨. --- NDC (Normalize Device Coordinate) [Clip Space] 사용자가 모니터 속 게임의 화면을 볼때, 3D로 이루어진 공간이 렌더링을 통해 2D로 변환된 화면을 바라보게 되는데, 이것을 투영이라 부른다. 이때, 사용자가 모니터에 비친 2D의 상을 바라봤을 때 2D투영 평면이 가지는 좌표계를 NDC , 또는 Clip Space 라고 한다. 위 사진처럼 [-1~1]의 범위를 가진다. --- Viewport Clip Space를 모니터에 표시하기 ...

220610) SRT Transform, 벡터, 내적과 외적

이미지
 SRT Transform 좌표계 내 객체의 크기(Scale), 각도(Rotation), 이동(Translation)의 변환을 도와주는 행렬을 뜻한다. 위 사진은 Homogeneous 2D 좌표계에서 변환을 할 경우의 변환행렬 계산식을 나타낸 것이며, 좌표 p = [x,y,1]이 있다고 할 때(p의 3번째 원소는 상수 w), [p' = (T · R · S) · p] 꼴로 표현하여 변환된 좌표 p'를 구한다. ----- 3D에서의 Transform 출처:  http://dolphin.ivyro.net/file/directx8.0/tutorial09.html 3차원 좌표계의 변환행렬은 4x4 꼴로 계산한다. 이때, 변환행렬에 대한 SRT행렬 곱셈순서는 DirectX와 OpenGL 사이에서 차이가 발생한다. DirectX는 왼손 좌표계를 사용하고(p · SRT), OpenGL은 오른손 좌표계(TRS · p)를 사용하기 때문이다.  둘은 서로 전치행렬이므로 변환에 대한 결과 값은 동일하다. DirectX 에서의 3차원 회전변환 행렬은 다음과 같다. (OpenGL의 경우는 위 행렬을 전치행렬로 바꾸면 된다) 벡터 : 방향과 크기를 나타낸 것. 앞 좌표가 원점이면 끝점값만으로 벡터를 표현할 수 있다. 벡터 합연산 : 두 벡터의 값을 합한 값. A+B일때 아래의 법칙 중 하나를 사용해 결과값 C를표현할 수 있다. 벡터의 실수배 : 벡터에 실수(스칼라)를 곱한 값. 스칼라는 방향 없이 크기만을 가진 값을 뜻하며, 벡터와 곱할 경우 크기에 영향을 준다. 벡터의 내적(Dot Product) : 벡터와 벡터를 곱했을 때, 스칼라값으로 변하는 곱. A · B 꼴 로 표현한다. : A = (a1,a2,a3), B = (b1,b2,b3)일 때, A · B = ( a1*b1 , a2*b2 , a3*b3 ) 로 계산된다. 벡터의 외적(Cross Product) : 벡터와 벡터를 곱했을 때, 벡터값을 유지하는 곱. A×B 꼴로 표현한다. : A = (a1,a2,a...