상세 컨텐츠

본문 제목

[D3D SetVertexDeclaration] 멀티렌더타겟에서 이상하게 버그가 터지길래

프로그래밍/3D

by ∫2tdt=t²+c 2013. 5. 24. 04:55

본문



Deferred Rendering을 적용하기 위해서 멀티 렌더 타겟을 설정하고 셰이더를 열심히 돌렸는데, 아무리해도 이상하게 깨진 장면만 뜨더라구요. 어디를 잘못했는지 도저히 알 수 없어서 헤매하다, 버텍스가 이상하게 깨지는 걸 보고, 셰이더에서 전역변수를 잘못 설정해서 잘못된 연산결과가 나오는거라고 생각하게되었죠.

그렇게해서 셰이더도 수십번 손보고, 셰이더 관리하는 클래스도 수십번 손 봤는데도 전혀 버그가 잡힐 기미를 보이지 않았죠. 이상하게 첫 프레임은 정상적으로 렌더링되는데 두번째 프레임부터 다 깨져서 나오는!... PIX툴로 D3D디바이스 상태를 프레임별로 일일히 체크하던 도중에 겨우 원인을 발견했습니다.


원인은 어이없게도 VertexDeclaration 이 제대로 설정되어있지 않던것. 실은 한 번 의심은 하고 넘어간 부분이었으나, 메시를 그리기 전마다 계속 VertexDeclaration을 설정해줬기에 전혀 문제가 없을거라고 생각했죠.


문제가 된건, SetVertexDeclaration을 자주 호출하면 성능이 떨어지므로 Declaration이 바뀔때만 SetVertexDeclaration을 다시 호출하도록 코드를 짜놓았었는데, 그 결과 이 엔진 놈이 첫 프레임에서만 SetVertexDeclaration을 호출하고 그 뒤로는 전혀 호출하지 않았던게 문제였습니다. 다른 상황에서는 별 문제가 없었는데 이상하게 MRT 상황에서는 이게 문제가 될수도 있군요.


덕분에 중요한 교훈을 얻었습니다.

SetFVF, SetVertexDeclaration 등은 적어도 매 프레임 한 번씩은 꼭 호출해줘야한다!



후샏... 이것때문에 밤을 새웠단 말인가ㅠㅠ




관련글 더보기

댓글 영역