본문 바로가기

게임 공부/DirectX20

Constant buffer - 16바이트 단위로 정렬! 상수 버퍼(Constant buffer)는 정점 및 픽셀 셰이더에서 사용될 상수를 모아 놓은 버퍼이다. 상수 버퍼 사용을 위해 cpp 코드 영역에 상수 버퍼 타입의 구조체를 정의하고 셰이더에도 동일한 포맷으로 상수 버퍼 구조체를 정의해야 한다. 그리고 시스템 메모리에서 구조체 변수 생성 및 값 설정 후 정점 혹은 픽셀 셰이더에 Set 시킨다. 값 설정 및 set은 보통 매 프레임 실행되는 Render() 함수에 적용한다. 그러면 이 Set 시킨 데이터를 설정한 셰이더에서 사용할 수 있다. 상수 버퍼를 사용하는 이유는 셰이더에서 매번 사용되는 상수, 하지만 cpp 파일에서 전달해주어야 한다고 가정할 때, 개별적으로 하나하나 값을 전달해 주는 것은 대역폭(bandwidth)이 크고 부담이 많이 된다고 한다... 2021. 4. 2.
atan2(arctan)을 이용하여 pitch, yaw 구하기 DirectX에선 다음과 같이 보통 왼손 좌표계(Left hand coordinate system)을 사용한다. 우리가 정면을 바라보는 곳이 +z 방향, 오른쪽으로 방향을 틀면 +x 방향, 고개를 위로 들면 +y 방향이다. 우리가 원점에서 노란색 화살표처럼 z축을 바라보고 있다고 가정해보자. 여기서 이동은 하지 않고 단순히 몸의 방향만 오른쪽으로 틀면 그만큼 회전한 각도가 생길 것이다. 이때의 회전각이 yaw이다. 즉 yaw는 y축을 기준으로 회전한 각도를 의미한다. 자신의 몸에 세로로 y축이 있다고 가정하고 몸을 회전해보면 이해가 빠를 것이다. 각 축은 서로 직각을 이루므로 z축 방향에서 90도만큼 회전하면 x축과 일치하게 될 것이다. 이때 yaw는 90도를 라디안(radians) 값으로 나타낸 것을 .. 2021. 3. 25.
XMVECTOR 타입 구조 - SSE SSE란? 다음 링크 참고 ko.wikipedia.org/wiki/%EC%8A%A4%ED%8A%B8%EB%A6%AC%EB%B0%8D_SIMD_%ED%99%95%EC%9E%A5 스트리밍 SIMD 확장 - 위키백과, 우리 모두의 백과사전 위키백과, 우리 모두의 백과사전. 스트리밍 SIMD 확장(Streaming SIMD Extensions, SSE)은 x86 아키텍처에 대한 SIMD(단일 명령 다중 데이터) 명령어 집합 확장이며, 인텔이 1999년에 펜티엄 III 시리즈 프로세 ko.wikipedia.org DX에서 자주 사용되는 XMVECTOR는 __m128 타입을 재정의 한 것이다. __m128 타입은 여러 개의 수를 한번에 처리하는 SIMD 연산을 위한 타입이다. SIMD 연산이란 하나의 명령어로 여러.. 2021. 3. 20.
깊이스텐실 Desc 중 깊이 func 값 관련 - D3D11_COMPARISON_FUNC DepthStencilState을 생성할 때 D3D11_DEPTH_STENCIL_DESC 구조체가 필요하다. 해당 구조체 멤버 중 DepthFunc이 있는데, 여기에 미리 정의된 매크로 값을 설정해줌으로써 깊이 비교를 어떻게 할 것인지 설정해줄 수 있다. default는 D3D11_COMPARISON_LESS란 값으로 설정되는데, 이는 기존의 z보다 현재 정점의 z가 더 작을 때, 즉 현재 정점이 더 앞에 있을 때만 z값(깊이)를 갱신한다. 만약 두 정점의 z값이 동일하면 갱신하지 않는다. 즉 같은 깊이의 빨간색->초록색 삼각형 순서로 겹쳐서 그리면 겹치는 부분은 그대로 빨간색이다. 이는 원하는 결과일 수도 아닐 수도 있다. 왜냐면 겹치는 부분 중 나중에 그린 삼각형은 같은 깊이임에도 무시되기 때문에.... 2021. 3. 18.
[DirectX] Direct3D 11 programming (1) Direct3D MS 문서를 학습하며 작성하는 내용입니다. (틀린 부분이 있을 수 있음) Direct3D는 3차원 그래픽을 다루기 위한 DirectX의 API이다. Direct3D엔 디바이스(Device)라는 개념이 존재한다. 디바이스는 그래픽 카드를 추상화한 객체이다. 쉽게 말하면 그래픽 카드를 다룰 수 있도록 해주는 기본적이고 핵심적인 객체이다. 디바이스는 오브젝트의 할당 및 해제, 렌더링, 그래픽 드라이버 및 하드웨어와의 통신을 담당한다. Direct3D 11 이전엔 디바이스를 의미하는 오브젝트(클래스)가 하나였던 걸로 기억한다. Direct3D 11은 디바이스라는 개념이 2가지로 분리된다. 하나는 디바이스 오브젝트(Device Object)이고, 다른 하나는 디바이스 컨텍스트 오브젝트(Device.. 2021. 3. 5.
DirectDraw 학습 (4) - 사각형 이동시켜보기 저번 내용에 추가로 다음과 같이 방향키로 사각형을 움직이는 간단한 동작을 추가해본다. 동영상을 gif로 변환해서 그런지 좀 버벅거리는 것처럼 보인다. 이동할 땐 초록색을 가지고 멈춰 있을 땐 빨간색을 가진다. 위 동작의 원리는 매우 단순하다. 현재 사각형의 x 및 y 좌표를 가지고 있다가 방향키가 눌리면 그 방향으로 일정 수만큼 더하거나 뺀다. 그러면 다음에 다시 그려질 때 변경된 좌표에 다시 그려지면서 이동한 것처럼 보이게 된다. 이때, 기존 버퍼를 수정하지 않으면 이전에 그려졌던 사각형이 그대로 남아있을 것이다. 따라서 사각형을 그리기 전에 버퍼 전체를 지우거나 배경을 새로 그린 뒤 사각형을 그려야 한다. 방향키가 눌리고 떼지는 것을 체크하기 위해 WndProc에 WM_KEYDOWN 메세지와 WM_K.. 2020. 11. 23.