텍스처 언바인딩

WanJu Kim·2023년 1월 8일
0

2D Project

목록 보기
5/13

만약 PSSetShaderResource 메서드로 텍스처를 바인딩 해주었다. 다음 렌더링은 그 텍스처를 빼고 싶다. 어떻게 할 것인가?

왼쪽에 보이는 타일 중 하나를, 검은색 배경의 '한 칸'에만 칠하고 싶었다. 근데 그 결과는

우웩. 전체가 다 칠해진 것이다. 주요 코드는 이렇다.

for ( ...)
{
  if (tile.GetSpriteName() != "")
  {
      srv = tileSet->spriteMap.find(tile.GetSpriteName())->second.sprite->GetSRV();
      Graphics::Get()->GetDC()->PSSetShaderResources(0u, 1u, &srv);
  }
  Graphics::Get()->GetDC()->DrawIndexed(IB->GetCount(), 0u, 0u);
}

오직 저 칸에만 텍스처를 삽입하려고 srv를 바인딩 했던 것이, 다음 렌더링 때도 그대로 남아서 모든 칸에 렌더링 된 것이다. 근데 왜 저 무늬가 안 생기고 색깔만 저렇게 됐냐고? 그건 다른 코드의 문제다...(텍스처 좌표가 안 맞아서 그렇다.)

그래서 언바인딩 어떻게 하냐고? 이렇게 한다.

if (tile.GetSpriteName() != "")
{
	srv = tileSet->spriteMap.find(tile.GetSpriteName())->second.sprite->GetSRV();
	Graphics::Get()->GetDC()->PSSetShaderResources(0u, 1u, &srv);
}
else
{
	srv = nullptr;
	Graphics::Get()->GetDC()->PSSetShaderResources(0u, 1u, &srv);
}

srv에 널포인터 넣어서 다시 묶어주면 된다. 주의할 것은 다음처럼 적으면 안된다는 것이다.

Graphics::Get()->GetDC()->PSSetShaderResources(0u, 1u, nullptr);

이렇게 하면 왜 널포인터 넣냐고 친절하게 에러로 회신해준다.

profile
Question, Think, Select

0개의 댓글