본문 바로가기

게임 공부/DirectX20

쿼터니언 사용 가이드 쿼터니언 이해에 아주 애를 먹고 있다.. 번역 각 오브젝트마다 X, Y, Z, pitch, yaw, roll을 저장하는 대신에 X,Y,Z, 방향(orientation)을 정의해라. 방향은 (0, 0, 0, 1)의 값을 가지는 쿼터니언으로 선언한다. 즉 0도 회전을 의미한다. pitch, yaw, roll을 저장하는 것은 특이 현상(짐벌락)에 취약하다. 그 이유는 작은 변화가 추가될 수록 중간 회전들은 회전축과 평행해지는 결과를 낳을 수 있다. 그래서 다음 회전이 실패할 수 있다. 그리고 오브젝트가 회전할 때 한 프레임에서 발생한 pitch, yaw, roll을 결정해라. 그리고 그것을 쿼터니언으로 변환해라. 그리고 미리 곱해라 이 쿼터니언과 오브젝트의 방향 쿼터니언을. 이 접근은 특이 현상에 덜 취약하다.. 2021. 8. 18.
Geometry Shader 지오메트리 셰이더는 버텍스 셰이더와 픽셀 셰이더와 같은 셰이더의 한 종류이다. 버텍스 셰이더가 하나의 정점에 대한 연산을 수행하는 셰이더였다면, 지오메트리 셰이더는 하나의 Primitive에 대한 연산을 수행하는 셰이더이다. 즉 Primitive가 삼각형이라면 정점 3개를 받을 것이고, 라인이라면 2개 단위로 수행하게 된다. 세 개의 셰이더가 실행되는 순서는 다음과 같다. Vertex Shader -> Geometry Shader -> (Rasterizer) -> Pixel Shader 래스터라이저 전에 실행되므로 지오메트리 셰이더에선 아직 보간되지 않은 정보를 가지고 원하는 작업을 할 수 있다. 예를 들면 큐브를 렌더링 한다고 할 때 6개의 면을 가지게 되는데, 프리미티브 구성 방법을 Triangle .. 2021. 5. 27.
셰이더로 행렬을 전달하기 전에 전치를 취해야 하는 이유는? 셰이더에 행렬을 전달하기 전에 다음과 같이 보통 Transpose를 취해야 한다. 그 이유를 검색해 보면 DX는 행렬을 row-major로 다루고, HLSL에선 column-major로 다루기에 전치로 전달하여 맞춰줘야 하기 때문이라고 한다. 맞는 말이겠지만 실제로 디버깅을 해보고 셰이더에서 행렬을 계산하는 코드를 보면 더욱 수긍이 간다. 테스트를 위해 셰이더에 다음과 같은 행렬을 전치하여 전달하였다. 이 행렬과 전치를 취한 행렬은 다음과 같다. 셰이더에서 위의 전치 행렬을 World로 받고 벡터 input.Pos와 곱연산을 하는 코드는 다음과 같다. 아래 연산 결과의 첫 요소는 실제로 input.Pos(1,1,-1,1)과 전치 취하기 전 행렬의 첫 열벡터인 (1,0,0,4)의 곱이여야 한다. (실제로 .. 2021. 5. 7.
XMMatrixLookAtLH과 XMMatrixLookToLH 차이 XMMatrixLookAtLH XMMATRIX XM_CALLCONV XMMatrixLookAtLH( FXMVECTOR EyePosition, FXMVECTOR FocusPosition, // At. 바라보려는 위치(position) FXMVECTOR UpDirection ); XMMatrixLookToLH XMMATRIX XM_CALLCONV XMMatrixLookToLH( FXMVECTOR EyePosition, FXMVECTOR EyeDirection, // 바라보고 있는 방향 FXMVECTOR UpDirection ); 두 함수 모두 월드 공간의 정점을 뷰 공간으로 변환시켜주는 view matrix를 생성하여 반환한다. 3개의 인자 중 Eye의 위치와 Up벡터는 동일한데, 2번 째 인자가 다르다. .. 2021. 5. 4.
[DX11] UpdateSubresource 와 map은 각각 언제? GPU에 어떤 자원을 업데이트 할 때 필요한 함수로 UpdateSubresource와 map이 있다. 차이점은 우선 UpdateSubresource는 src와 dest가 같은 포맷(단위)이 동일할 때 그 단위로 복사해주는 함수이다. 반면 map은 read/write 하려는 GPU 메모리 영역에 Lock을 걸고 그 주소를 얻어와서 이 주소를 통해 하고 싶은 동작을 수행하는 것이다. 그러나 실제로 map은 GPU 메모리 영역의 주소를 주는 것이 아니라 그 영역을 시스템(CPU) 메모리에 mapping한 주소를 준다. 만약 read가 필요한 경우, 해당되는 GPU 메모리 영역을 시스템 메모리에 copy 후 시스템 메모리의 주소를 반환하기 때문에 복사 및 mapping만큼의 오버헤드가 있다. 만약 write 용.. 2021. 4. 18.
Blend state blend는 사전적으로 혼합이란 의미를 가진다. 컴퓨터 그래픽스에서 블렌딩이라 하면 어떠한 두 픽셀 컬러를 섞는 것을 말한다. 이러한 블렌딩은 주로 어떤 두 픽셀이 겹칠 때 주로 행하게 된다. 예를 들어 물체가 하나 있고 그 앞에 반투명한 빨간 색상의 벽이 있다. 물체는 벽 뒤에 있지만 벽이 반투명하기 때문에 보여야 한다. 이때 화면에 보여질 물체의 색상은 물체의 기존 색상과 동일하진 않을 것이다. 아마 이때의 색상은 벽의 색상 50%, 물체의 색상 50%가 혼합된 색상일 것이다. 이처럼 투명도를 나타내기 위해 RGB 색상 외에 알파(Alpha)라는 불투명도를 의미하는 값이 존재한다. RGB와 마찬가지로 보통 8비트를 이용하여 0~255 범위의 값을 사용할 수 있지만, 범용성을 위해 정규화된 0~1사이의.. 2021. 4. 3.