매우 느린 direct3D 텍스처 샘플링


9

Direct3D 9를 사용하여 작은 게임을 작성하고 지형에 다중 텍스처링을 사용하고 있습니다. 내가하고있는 일은 3 개의 텍스처와 블렌드 맵을 샘플링하고 블렌드 맵의 색상 채널을 기반으로 세 개의 텍스처에서 전체 색상을 얻는 것입니다. 어쨌든, 1 개 이상의 텍스처를 샘플링 할 때 프레임 속도가 크게 떨어지고 120 + fps에서 50 미만으로 떨어집니다.

이것은 느려짐을 담당하는 HLSL 코드입니다.

float3 ground = tex2D(GroundTex, multiTex).rgb;
float3 stone  = tex2D(StoneTex, multiTex).rgb;
float3 grass  = tex2D(GrassTex, multiTex).rgb;
float3 blend  = tex2D(BlendMapTex, blendMap).rgb;

내가 잘못하고 있습니까? 텍스쳐 샘플링이나 다른 것에 관한 정보 나 팁이 있다면 좋을 것입니다.

감사.


어떤 하드웨어가 있습니까? 새로운 하드웨어에서는 4 개의 텍스처 샘플이 문제가되지 않습니다.
Axel Gneiting

나는 Radeon X1950을 가지고 있습니다. 예, 더 이상은 아니지만 몇 살입니다. 아마도 최고의 하드웨어가 아닐 수도 있습니다. 어떻게 생각해 ?
dotminic

답변:


9

작업 속도를 높이려면 텍스처 아틀라스라는 것을 사용할 수 있습니다.

Wikipedia — 텍스처 아틀라스는 큰 이미지 또는 "아틀라스"로, 많은 작은 하위 이미지를 포함합니다. 각각의 이미지는 3D 객체의 일부에 대한 텍스처입니다. 아틀라스에서 오브젝트의 uvmap의 텍스처 좌표를 수정하여 서브 텍스처를 렌더링 할 수 있으며, 기본적으로 텍스처의 이미지 부분을 알려줍니다. 많은 작은 텍스처가 자주 사용되는 응용 프로그램에서는 더 효율적입니다. 텍스처를 그래픽 하드웨어에서 단위로 취급하는 텍스처 아틀라스에 저장합니다.

GPU가 하나의 큰 텍스처를 4 번 샘플링하는 것이 아니라 각각 4 번의 이미지를 샘플링하는 것이 더 효율적입니다. 다음은 터 레인 텍스처 아틀라스의 예입니다.

대체 텍스트


1
조언에 감사드립니다. 텍스처 아틀라스를 사용하여 셰이더를 구현했습니다. 이제는 "만"109fps 만 받고 있지만 55fps에서 깔끔하게 개선되었습니다. 감사!
dotminic

1
좋은 답변을 얻으려면 +1하십시오. 텍스처 아틀라스 이미지를 어디서 구할 수 있습니까? 독점적이거나 무료로 사용할 수 있습니까?
Cameron

4

고려해야 할 또 다른 사항은 텍스처 형식입니다. 원시 32bpp 텍스처입니까? 그렇다면 압축 된 DXT1 텍스처 (4 비트 / 픽셀 (공간의 1/8)) 또는 알파 채널이 필요한 경우 DXT5 (8 비트 / 픽셀)를 사용하는 것이 좋습니다.

텍스처 데이터의 크기를 줄이면 텍스처 메모리 대역폭 요구 사항이 줄어들고 텍스처 캐시 성능이 향상됩니다.

또한 최대 품질 이방성 필터링을 설정하지 않았는지 확인하십시오. 이로 인해 상당한 비용이 발생할 수 있습니다.


조언을 위해 thx, 나는 다음에 그 시도를 줄 것이다.
dotminic

3

텍스처에 밉맵이 있습니까?

밉 매핑이 없으면 텍스처 샘플링이 특히 비쌀 수 있습니다 (캐시 미스로드).


텍스쳐에 밉맵이 있습니다. DirectX 텍스쳐 도구에서 * .dds로 내보냈습니다. 그러나 그들은 어디서나 높은 데프 텍스처가 많은 상용 게임에서 텍스처를 어떻게 사용합니까? GPU에서 지형을 렌더링하는 동안 1 개의 텍스처 아틀라스를 샘플링하고 109fps의 프레임 속도를 얻었습니다.
dotminic
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.