Échantillonnage 3D très direct des textures

9

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.

dotminic
la source
De quel matériel disposez-vous? Quatre échantillons de texture ne devraient pas poser de problème sur un nouveau matériel.
Axel Gneiting
J'ai une Radeon X1950, oui, elle a quelques années, sinon plus. Je suppose que ce n'est peut-être pas le meilleur matériel. Qu'est-ce que tu penses ?
dotminic

Réponses:

9

Si vous voulez accélérer les choses, vous pouvez utiliser quelque chose appelé un atlas de texture.

Wikipedia - Un atlas de texture est une grande image, ou "atlas" qui contient de nombreuses sous-images plus petites, chacune étant une texture pour une partie d'un objet 3D. Les sous-textures peuvent être rendues en modifiant les coordonnées de texture de la uvmap de l'objet sur l'atlas, en lui indiquant essentiellement dans quelle partie de l'image se trouve sa texture. Dans une application où de nombreuses petites textures sont fréquemment utilisées, il est souvent plus efficace de stocker les textures dans un atlas de texture qui est traité comme une unité par le matériel graphique.

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.

texte alternatif

zfedoran
la source
1
Merci pour les conseils, j'ai implémenté mon shader en utilisant un atlas de texture, je n'obtiens "seulement" qu'un 109fps maintenant, mais c'est une nette amélioration par rapport aux 55fps que j'obtenais. Merci!
dotminic
1
+1 pour une bonne réponse. Puis-je demander où vous avez obtenu cette image d'atlas de texture? Est-il propriétaire ou gratuit pour toute utilisation?
Cameron
4

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.

bluescrn
la source
merci pour les conseils, je vais essayer la prochaine fois.
dotminic
3

Vos textures ont-elles des mipmaps?

Sans mipmapping, l'échantillonnage de texture peut être particulièrement coûteux (des charges de cache manquent)

bluescrn
la source
Oui, les textures ont des mipmaps, je les ai exportées en tant que * .dds à ​​partir de l'outil de texture DirectX. Mais comment utilisent-ils les textures dans les jeux commerciaux où il y a des tas de textures haute définition partout? Je ne fais qu'échantillonner 1 atlas de texture et j'obtiens une fréquence d'images de 109 ips tout en rendant un terrain, le tout sur le GPU.
dotminic