DirectX 11

221006

슬뷔 2022. 10. 17. 15:03

리소스매니저가 지워지고 레벨매니저가 지워지게 되면 레벨 매니저에 있는 물체들이 지워질 때 스마트포인터가 자기들이 소멸될 때 자기가 가리키고 있는 리소스가 살아있다고 생각하고 release를 한다. 
근데 리소스 매니저가 이미 지워졌기 때문에 레벨의 오브젝트들이 지워진 주소를 들고 있게 된다. 그래서 삭제된 메모리에 접근을 해서 기능을 호출하는 거기 때문에 문제가 된다. 힙손상이 발생할 수 있다.

재질로 상수는 전달할 수 있는데 아직 텍스쳐는 불가능하다..
이젠 텍스쳐도 인덱스에 맞춰서 해당 레지스터에 바인딩을 해놔야한다.

재질은 리소스다.
같은 재질을 공유하다보면 재질 안에는 해당 재질을 사용하는 물체들이 랜더링 하기 직전에 전달시킬 상수데이터와 택스쳐를 들고 있다.
예를들어 애니메이션을 한다면 플레이어가 걷는 동작을 하다가 다음 동작으로 바꾸려고 하면 전달하는 택스쳐를 바꿔놔야한다. 쉐이더 코드에서는 항상 TEX 0번 레지스터 안에서 이미지를 꺼내게 설계를 해놨기 때문이다. 
0번 레지스터의 플레이어는 현재 자기 상황에 맞는 이미지의 스프라이트로 교체를 해놓을 것이다. 그럼 이건 같은 재질을 사용하는 몬스터도 영향을 받을 수 있다.

같은 재질을 사용하면 그 재질을 공유하는 애들이 단체로 다 영향을 받을수 있다.

게임 오브젝트마다 자신의 전용 재질을 따로따로 들고 있는다.
그럼 리소스로 만들 이유가 없다.

공유해서 쓰면 얻을 수 있는 이득 ?
그래픽스 파이프라인을 통해서 랜더링을 하면 문제가 있다.
랜더링을 시작하려면 IA단계에서 어떤 것을 전달하고 파이프라인은 어떤걸 사용하고
텍스트 레지스터에는 어떤 텍스쳐가 바인딩이 되어 있고를 다 설정을 하고 랜더링에 들어간다.
각 단계별로 설정해놨던 것이 실제로 적용이 되면서 파이프라인이 진행이 된다.
IA -> VS -> ... -> OM 최종 렌더타겟에 물체가 그려질 것이다.
이런식으로 화면안에 그려야 할 물체가 만약 100개쯤 된다면 이런 파이프 라인이 100번 쯤 동작해야한다.
이때 재질은 각 쉐이더 단계의 특정 상수와 재질값을 전달하는 역할을 한다.
만약 100개의 물체가 같은 재질을 공유하는 상황이라면 

결국 재질에 의해서 전달하고자 하는 값의 차이는 없다. 

즉, 재질로 인한 업데이트는 한 번만 있으면 된다.
재질이 전달하는 상수값, 택스쳐레지스터도 동일한 위치에 같은 택스쳐가 들어가는게 별다른 문제가 아니라고 생각했기 때문에 물체들이 재질을 공유해서 사용하는 상황이라는 얘기이다. 
그래픽카드를 사용하는 입장에서 셋팅될 데이터가 다 똑같으면 굳이 파이프라인을 끝내고 다시 또 시작하고 100번 반복할 것이 아니라 파이프라인의 시작과 끝을 알리지 않고 한번의 랜더 함수 안에서 들어오는 인스턴스 함수가 끝나지 않고 내부에서 파이프라인을 100번 진행을 해서 물체 100개를 다 그리고나서 랜더링 함수를 끝내자는 이야기이다.

한 번에 다 그리려면 그리는 모든 물체들이 각 레지스터별로 또는 상수레지스터별로 셋팅 받아야 될 것이 동일하다는 전제가 있어야한다.

그런데 갑자기 혼자만 특수한 상황이 발생해서 다르게 보여야한다면?
같은 재질을 쓰면 이 재질을 건드리는 순간 같은 재질을 쓰는 모든 애들이 다 영향을 받으니까 

혼자만 특수한 상황으로 바뀌어야 될 때는 재질을 혼자 사용하도록 바꿔줘야한다. 

그리고 다시 돌아가야한다면 원래 사용하던 공유되던 재질로 다시 바꾸어준다. 

'DirectX 11' 카테고리의 다른 글

221011  (0) 2022.10.18
221007  (0) 2022.10.17
221005  (0) 2022.10.17
221004  (0) 2022.10.11
220930  (0) 2022.10.11