10.11

신승빈·2022년 10월 11일
0

KGCA 수업

목록 보기
48/128

Resize

DX10 이후로 백버퍼의 크기가 변경되면 백버퍼, 렌더타겟, 깊이 스텐실 버퍼 이외의 메모리는 특별히 신경쓰지 않아도 됨

순서

WM_SIZE 메시지 검출
RenderTarget View, Depth-Stencil Buffer 해제 및 소멸
Back Buffer 크기 조정
RenderTarget View, Depth-Stencil Buffer 생성 및 적용
뷰포트 재지정

-> SwapChain과 직접적으로 연관되어있지 것 외에는 굳이 해제 및 재생성할 필요는 없음
-> SwapChain을 통해 직접 생성하는 것 이외에는 해제 및 재생성할 필요는 없음

Timer(High Resolution Timer)

QueryPerformanceFrequency, QueryPerformanceCounter

QueryPerformanceFrequency는 1초당 진동수를 반환, 단 최신 운영체제에서는 보정된 값을 반환하는 듯
1 QueryPerformanceCounter = 100 nano second

Reference : https://www.sysnet.pe.kr/2/0/13035

DirectWrite와 IME

IME(Input Method Editor)는 한정된 Qwerty 자판에서 그보다 많은 문자를 표현하기 위한 방법

Reference : https://namu.wiki/w/%EC%9E%85%EB%A0%A5%20%EB%B0%A9%EC%8B%9D%20%ED%8E%B8%EC%A7%91%EA%B8%B0

Direct Write는 GPU를 통해 문자를 화면에 출력하는 API

Reference : https://learn.microsoft.com/ko-kr/windows/win32/directwrite/introducing-directwrite

IME를 통해 입력받은 문자를 Direct Write를 통해 출력하는 방식인듯

Reference : https://learn.microsoft.com/ko-kr/windows/win32/dxtecharts/using-an-input-method-editor-in-a-game

ID3D11DeviceContext::Map()

DirectX에서의 Memory

DirectX의 공식문서에서는 Resource, SubResource를 GPU Memory라고 언급하지는 않음

Reference : https://learn.microsoft.com/en-us/windows/win32/direct3d11/overviews-direct3d-11-resources-intro
Reference : https://learn.microsoft.com/en-us/windows/win32/direct3d11/overviews-direct3d-11-resources
Reference : https://learn.microsoft.com/en-us/windows/win32/direct3d11/overviews-direct3d-11-resources-subresources

이는 그래픽카드가 없는 상황에서도 DirectX를 통해 Draw를 할 수 있도록 한 부분 때문인 것으로 보임
이러한 관점에서 DX에서의 Resource는 Data PipeLine에서 접근할 수 있는 데이터의 부류로서 언급 됨
다만 ID3DBuffer류의 객체를 생성할 때 GPU Memory로 데이터가 넘어가는 것으로 확인됨

Reference : https://stackoverflow.com/a/15978137/8106257

ID3D11DeviceContext::Map()

ID3D11DeviceContext::Map()함수를 통해 DX의 SubResource객체에 직접 접근할 수 있음
pointer형식을 통한 값 접근, 변경 가능
UnMap전까지 GPU에서는 접근 불가능
Resource의 생성 flag에 따라 D3D11_MAP MapType 지정이 제한적임

D3D11_Map

기존 구현 방식인 ID3D11DeviceContext::UpdateSubresource()는 Subresource의 전체를 갱신하는 함수

Reference : https://learn.microsoft.com/en-us/windows/win32/api/d3d11/nf-d3d11-id3d11devicecontext-map

Resource생성과 Map의 성능

CPU와 GPU는 데이터 전송에 많은 자원을 소모하므로 가능하면 서로간의 메모리를 건드리지 않는것이 성능에 좋음
ResourceBuffer를 생성할 때 D3D11_CPU_ACCESS_FLAG를 설정하지 않거나, D3D11_USAGE를 D3D11_USAGE_IMMUTABLE한 방식으로 생성하는 것이 가장 좋음

Reference : https://learn.microsoft.com/en-us/windows/win32/api/d3d11/ne-d3d11-d3d11_cpu_access_flag
Reference : https://learn.microsoft.com/en-us/windows/win32/api/d3d11/ne-d3d11-d3d11_usage

또한 Map을 통해 데이터에 접근할 경우에도 D3D11_MAP을 D3D11_MAP_WRITE_DISCARD나 D3D11_MAP_WRITE_NO_OVERWRITE로 설정할 경우 더 빠른 성능을 얻을 수 있을 듯

Reference : https://learn.microsoft.com/en-us/windows/win32/api/d3d11/ne-d3d11-d3d11_map

Vector의 내적과 외적

내적

교환법칙 성립, 분배법칙 성립

벡터의 정규화여부에 상관없이 계산 가능

두 벡터 사이각

acosabab=θacos\frac{\vec{a}\cdot\vec{b}}{\vert\vec{a}\vert\vert\vec{b}\vert}=\theta

한 벡터를 기준으로 다른 벡터의 성분 분해


투영을 통한 계산
분해된 수직 성분을 통해 직선과 한 점 사이의 거리를 구할 수 있음

두 벡터가 가리키는 방향


예각 : PQ>0\vec{P}\cdot\vec{Q}>0
직각 : PQ=0\vec{P}\cdot\vec{Q}=0
둔각 : PQ<0\vec{P}\cdot\vec{Q}<0

용도

직선과 점 사이의 거리


이 사이각은 항상 충돌함을 보장함

빛과 그림자


빛의반사=LN빛의 반사=-\vec{L}\cdot\vec{N}

외적

분배법칙 성립
두 벡터의 외적의 크기는 두 벡터를 통해 표현되는 평행사변형의 넓이와 같음
a×b=absinθ\vec{a}\times\vec{b}=\vert\vec{a}\vert\vert\vec{b}\vert sin\theta

평면의 방정식

두 벡터의 외적을 통해 표현된 벡터는 두 벡터를 포함하는 평면의 방정식을 의미
ax+by+cz+d=0ax + by + cz + d = 0
d = (0, 0, 0)과의 거리

평면 앞에 위치 : 평면의방정식>0평면의 방정식 > 0
평면 뒤에 위치 : 평면의방정식<0평면의 방정식 < 0

DirectX는 왼손좌표계를 사용하므로 시계방향으로 감겨야한다


평면 법선 벡터와 한 점 사이의 내적을 이용하면 점과 평면 사이의 거리를 구할 수 있음

profile
이상을 길잡이 삼아 로망을 추구합니다.

0개의 댓글