2010-09-11 5 views
2

Mon jeu rend beaucoup de cubes qui ont aléatoirement 1 des 12 textures. Je commande déjà la géométrie de sorte que je ne peux pas simplement rendre tous les cubes avec texture1 puis 2 puis 3 etc ... car cela annulerait l'ordre z. Je garde déjà la trace de la texture précédente et dans == alors je n'appelle pas glbindtexture, mais c'est encore trop d'appels à cela. Que puis-je faire d'autre?Comment éviter les appels glBindTexture()?

Merci

+0

Pourquoi commander la géométrie? Faites-vous cela sur le processeur? La plupart des moteurs de jeu utilisent une pré-passe Z, dessinant la scène dans le tampon Z seulement. Ensuite, le passage normal, avec les shaders, les textures, etc. Ce mécanisme évite d'être limité par le CPU à cause du tri de milliers d'objets 3D sur le CPU ou le GPU limité à cause d'un overdraw massif. – Stringer

+0

Le Z-ordering peut être une bonne chose, et peut être plus rapide qu'un z-prepass sur certaines scènes. – Calvin1602

+0

@ Calvin1602: vous avez parfaitement raison, c'est juste une supposition éclairée parce que la scène est la plupart du temps des géométries simples mais a un potentiel de surexploitation élevé. Comme toujours avec les performances, benchmark .. @Milo: quel est votre matériel cible? – Stringer

Répondre

1

Le moyen ultime et le plus rapide serait d'avoir un tableau de textures (normales ou cubes). Récupérez ensuite dynamiquement la tranche de texture en fonction d'un identifiant stocké dans chaque données d'instance de cube/données de face de cube (si vous souhaitez une texture différente par face de cube) en utilisant GLSL intégré gl_InstanceID ou gl_PrimitiveID.

Avec cette implémentation vous lieriez votre tableau de texture une seule fois.

Ce serait bien sûr nécessaire utilisé des extensions de gpu_shader4 et texture_array:

J'ai utilisé ce mécanisme (en utilisant D3D10, mais principe applique aussi) et cela a fonctionné très bien.

Je devais cartographier sur des sprites (points 3D d'une taille d'écran constante de 9x9 ou 15x15 pixels IIRC) différentes textures indiquant chacune une signification différente pour l'utilisateur.

Edit:

Si vous ne vous sentez pas à l'aise avec tous les trucs de shaders, je voudrais simplement trier cubes par les textures, et ne pas commander Z la géométrie. Ensuite, mesurez les gains de performances.

Je voudrais également essayer d'ajouter une passe pré-Z où vous rendez tous vos cubes dans le tampon Z seulement, puis restituez la scène normale, et voyez si cela accélère les choses (si les fragments sont liés, ça pourrait aider).

+0

Je remet en cause parce que c'est finalement la voie à suivre mais je ne pense pas qu'il soit adapté aux exigences de l'OP (pas de shaders ...) – Calvin1602

1

Vous pouvez emballer vos textures dans une texture et offset les coordonnées de texture en conséquence

glMatrixMode(GL_TEXTURE) vous permettra également d'effectuer des transformations sur l'espace de texture (pour éviter de changer tous les coords de texture)

+0

Oui, j'ai pensé à cela, sauf que cela signifie soit beaucoup de vbos = beaucoup de ram, ou donner 48 flotteurs pour chaque objet, un peu défait le but ... – jmasterx

+0

Serait-il préférable de valoriser l'ordre des textures sur l'ordre Z? Comment les grands moteurs de jeu le font-ils? – jmasterx

+0

Pour les cubes, pourriez-vous utiliser des listes d'affichage, une pour chacun des 12 styles de cube?A moins que vous ne changiez les sommets individuels sur les cubes ... –

Questions connexes