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.
Respostas:
Se você deseja acelerar as coisas, pode usar algo chamado atlas de textura.
É 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.
fonte
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.
fonte
Suas texturas têm mipmaps?
Sem o mapeamento mip, a amostragem de textura pode ser particularmente cara (muitas perdas de cache)
fonte