Amostra de textura 3D direta muito lenta

9

Então, eu estou escrevendo um pequeno jogo usando o Direct3D 9 e usando várias extensões para o terreno. Tudo o que estou fazendo é amostrar 3 texturas e um mapa de mesclagem e obter a cor geral das três texturas com base nos canais de cores do mapa de mesclagem. De qualquer forma, estou obtendo uma queda maciça na taxa de quadros quando toco mais de uma textura; vou de 120+ fps para pouco menos de 50.

Este é o código HLSL responsável pelo abrandamento:

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

Estou fazendo errado? Se alguém tiver alguma informação ou dicas sobre amostragem de textura ou algo assim, isso seria legal.

Obrigado.

dotminic
fonte
Qual hardware você tem? Quatro amostras de textura não devem ser um problema em nenhum novo hardware.
Axel Gneiting 27/10/10
Eu tenho uma Radeon X1950, sim, tem alguns anos, se não mais. Acho que talvez não seja o melhor hardware. O que você acha ?
dotminic 27/10/10

Respostas:

9

Se você deseja acelerar as coisas, pode usar algo chamado atlas de textura.

Wikipedia - Um atlas de textura é uma imagem grande, ou "atlas" que contém muitas sub-imagens menores, cada uma das quais é uma textura para uma parte de um objeto 3D. As sub-texturas podem ser renderizadas modificando as coordenadas de textura do uvmap do objeto no atlas, informando-o essencialmente em qual parte da imagem está a sua textura. Em um aplicativo em que muitas texturas pequenas são usadas com frequência, geralmente é mais eficiente armazene as texturas em um atlas de textura que é tratado como uma unidade pelo hardware gráfico.

É mais eficiente para uma GPU amostrar uma única textura grande 4 vezes contra 4 imagens amostradas uma vez cada. Aqui está um exemplo de um atlas de textura do terreno.

texto alternativo

zfedoran
fonte
11
Obrigado pelo conselho, eu implementei meu shader usando um atlas de textura, estou "apenas" obtendo 109fps agora, mas é uma melhoria clara dos 55fps que estava obtendo. Obrigado!
dotminic
11
+1 para uma boa resposta. Posso perguntar de onde você tirou essa imagem do atlas de textura? É proprietário ou gratuito para qualquer uso?
Cameron
4

Outra coisa a considerar é o formato da textura. É uma textura bruta de 32bpp? Nesse caso, considere usar uma textura DXT1 compactada, que é de 4 bits / pixel (ocupando 1/8 do espaço) ou DXT5, se você precisar do canal alfa, em 8 bits / pixel.

Reduzir o tamanho dos dados de textura deve resultar em requisitos reduzidos de largura de banda da memória de textura e desempenho aprimorado do cache de textura.

Além disso, verifique se você não está definindo a filtragem anisotrópica de qualidade máxima - isso pode adicionar um pouco de custo.

bluescrn
fonte
thx pelo conselho, vou tentar na próxima vez.
dotminic
3

Suas texturas têm mipmaps?

Sem o mapeamento mip, a amostragem de textura pode ser particularmente cara (muitas perdas de cache)

bluescrn
fonte
Sim, as texturas têm mipmaps, eu as exportei como * .dds da ferramenta de textura DirectX. Mas como eles usam texturas em jogos comerciais, onde há muitas texturas de alta definição em todo o lugar? Estou apenas amostrando 1 atlas de textura e obtendo uma taxa de quadros de 109 fps enquanto processa um terreno, tudo na gpu.
dotminic 27/10/10