d3d 11 Texture2DMS, texture2DArray, 사용법
안녕하세요
d3d 11를 사용해서 구현하실때 Texture2dMS, texture2DArray를 사용해서 구현하시는 분들이 계실텐데요
그런분들을 위해 초기화 방법과 shader에서 읽는 방법을 공유하려고 합니다.
주의 하셔야할점
제가 사용한 2textrue2dMS는 일반적으로 사용하는 방식과는 다릅니다.
참고만 하시길 부탁드립니다.
1. Texture2dMS
2. texture2DArray
이런식으로 갈건데 필요하신 부분만 보시면 될거 같습니다.
d3dx11effect.h 를 사용했습니다.
1. Texture2DMS
texture2dMS에 대해 자세한 설명은 넘어갑니다.
보여드리는 코드는
2개의 pass로 이루어지는데
첫번째pass는 Rendering
두번째pass는 sorting 후 화면에 출력
첫번째의 geometry는 scene
rendertaget은 texture2dMS texture
두번째의 geometry는 FSQ
rendertaget은 backbuffer
이렇게 입니다.
첫번째 pass 전에 stencil buffer초기화 pass 부분이있지만 생략했습니다.
(제가 구현한 MS의 자세한 설명을 보고 싶으시다면 한장짜리 논문인 https://www.cct.lsu.edu/~fharhad/ganbatte/siggraph2007/CD2/content/sketches/0518.pdf 논문을 보시면됩니다.)
texture2D를 만드는 부분입니다.
여기서 만든 texture2D를 이용해
renderTargetView, shaderResourceView를 만들었습니다.
만든 renderTargetView를 OMSetRenderTargets() 함수에 넣어주시면됩니다.
FSQ 코드입니다.
구글에 널려 있는 코드와 똑같지만 확인 한번씩 하시는걸 추천드립니다.
shader에서 선언한 Texture2DMS입니다
리턴형과 배열의 개수도 필요합니다.
배열의 개수는 Texture2D를 만들때 smaple.count에 넣은 값과 같아야합니다.
Load 함수를 사용하실때는 input.position는 당연히 FSQ의 input.position입니다.
만약 input.uv를 사용하셔야 한다면
uv에 스크린 해상도를 곱하셔야 Load함수에서 적절한 값을 읽을 수 있습니다.
2. texture2DArray
shaderResource와 renderTaget은 **로 선언합니다.
shaderResource와 renderTaget를 get해주는 함수들입니다.
textrue2D를 만드는 곳입니다.
array에 7개의 texture를 넣을것이기 때문에 size를 7로 설정했습니다.
renderTaget을 만드는 곳입니다.
ZeroMemory를 잊으시면 안됩니다.
안넣으시면 오류나요.
shaderResorce를 만드는 곳입니다.
D3D11_SHADER_RESOURCE_VIEW_DESC는 따로설정하지 않고 NULL로 줍니다.
한 pass에서 renderTaget의 최대개수가 8개 이기 때문에 7개는 renderTagetArray로 한개는 array가 적용되지 않은
rendertaget으로 총 8개의 renderTaget을 set했습니다.
작아서 잘안보이시겠지만 setResource를 하는 곳입니다.
renderTaget을 Set할때와 똑같은 형식입니다.
이제 Shader 부분입니다.
vertex Shader input은 FSQ 의 정보입니다.
Load함수를 써서 int4 의 값을 전달해 읽으면 끝입니다.
MS와 같이 uv만 사용중이시라면 uv에 해상도의 크기를 곱해주어야 합니다.
감사합니다