회사에서 거리에 따른 texture streaming 을 하는 경우에 대해 이야기하다가 논쟁거리가 하나 생겼습니다.

 

저는 "직접 texture streaming 을 하면 더 작은 크기의 texture 를 적용하는 데다가 GPU 에서 계산되는 LOD 까지 영향을 받아 LOD bias 를 둔 것과 같은 효과가 나와서 품질 조절이 힘들다" 라는 주장을 했습니다.

 

하지만 같이 일하는 분은 "texture 의 해상도를 고려해서 LOD 계산이 되기 때문에 서로 다른 크기의 texture 를 binding 해도 참조하는 LOD 는 결과적으로 동일하다" 는 주장을 했습니다.

 

제가 이쪽 LOD 계산에 대해서 구현 문서를 실제로 본 적은 없고 ddxddy 를 이용한다고만 알고 있었기 때문에, 그럴 수도 있다는 생각이 들었습니다. 만약 texture 크기가 고려된다면 texture streaming 시에 LOD 문제에 대해서 걱정할 필요가 없어지겠죠. 그래서 실제로 그런 결과가 나오는지 테스트해 보기로 했습니다.

 

무지개색을 가진 mipmap chain 을 가진 텍스쳐를 생성했습니다. 1024 texture 와 512 texture 를 만들어서 테스트해 봤습니다. 둘 다 붉은색이 가장 낮은 LOD( Mipmap 0 )이며 보라색이 가장 높은 LOD 입니다. 결과는 다음과 같았습니다.

 

그림 1

 

여기에서 성급하게 결론을 내리려다가, 직접 texture streaming 이 들어 가는 경우에는 작은 texture 의 LOD0 은 큰 texture 의 LOD1 에서 시작해야 된다는 것을 상기했습니다. 그래서 512 texture 의 LOD0 이 주황색에서 시작하도록 texture 를 새로 만들어서 테스트해 보았습니다.

 

 

그림 2

 

결국 거리별로 texture streaming 단계를 조정해도 실제 참조해야 하는 LOD 는 거의 같다는 결론이 나왔습니다. 제가 틀렸습니다 ㅠㅠ.

 

물론 더 낮은 LOD 가 나와야 하는 곳에서 필요한 해상도의 texture 가 공급되어 있지 않으면 그림 3 과 같이 이상한 결과가 나오겠지만 말이죠. 그건 어쩔 수 없는 문제인 것 같습니다.

 

그림 3

 

정리하자면 mipmap level 결정에는 texture 크기가 반영되므로 texture streaming 을 직접 하는 경우에도 LOD bias 가 먹을 것을 걱정할 필요가 없습니다

 

주의할 점은 이게 pixel 단위 해상도 보장이 아니라는 것입니다. 밑에 코드에서 알 수 있듯이, 같은 기울기와 같은 uv 변화량을 공유하는 경우에만 동일한 pixel 단위 해상도가 보장됩니다. 만약 uv 가 다르면 texture size 에 따라 pixel 단위 해상도가 틀려집니다. 즉 같은 메쉬 내에서도 pixel 단위 해상도는 달라질 수 있다는 것입니다.

 

===============================

 

실제 virtual texturing 을 위해서 mipmap level 을 계산하는 샘플을 찾아 봤습니다( 출처 : Texture LOD calculation( useful for atlasing ).

 

 

위와 같이 한 뒤에 mipLevel 을 사용해 tex2Dlod() 를 호출해 주면 된다고 하네요. 물론 위의 코드는 일부이고 이런 저런 이슈가 있다고 하네요.

+ Recent posts