J'écris donc un petit jeu en utilisant Direct3D 9 et j'utilise le multitexturing pour le terrain. Tout ce que je fais, c'est échantillonner 3 textures et une carte de mélange et obtenir la couleur globale des trois textures en fonction des canaux de couleur de la carte de mélange. Quoi qu'il en soit, j'obtiens une baisse massive de la fréquence d'images lorsque j'échantillonne plus d'une texture, je passe de 120+ images par seconde à un peu moins de 50.
Il s'agit du code HLSL responsable du ralentissement:
float3 ground = tex2D(GroundTex, multiTex).rgb;
float3 stone = tex2D(StoneTex, multiTex).rgb;
float3 grass = tex2D(GrassTex, multiTex).rgb;
float3 blend = tex2D(BlendMapTex, blendMap).rgb;
Suis-je en train de mal faire? Si quelqu'un a des informations ou des conseils sur l'échantillonnage de texture ou quoi que ce soit, ce serait bien.
Merci.
Réponses:
Si vous voulez accélérer les choses, vous pouvez utiliser quelque chose appelé un atlas de texture.
Il est plus efficace pour un GPU d'échantillonner une seule grande texture 4 fois contre 4 images échantillonnées une fois chacune. Voici un exemple d'atlas de texture de terrain.
la source
Une autre chose à considérer est le format de texture. Est-ce une texture 32bpp brute? Si tel est le cas, envisagez d'utiliser une texture DXT1 compressée, qui est de 4 bits / pixel (en prenant 1/8 de l'espace), ou DXT5 si vous avez besoin du canal alpha, à 8 bits / pixel.
La réduction de la taille des données de texture devrait entraîner une réduction des besoins en bande passante de la mémoire de texture et une amélioration des performances du cache de texture.
Vérifiez également que vous n'avez pas défini un filtrage anisotrope de qualité maximale - cela peut ajouter un peu de coût.
la source
Vos textures ont-elles des mipmaps?
Sans mipmapping, l'échantillonnage de texture peut être particulièrement coûteux (des charges de cache manquent)
la source