2009-07-26 11 views
1

Quelqu'un peut-il me dire comment utiliser la mémoire matérielle pour créer des textures dans OpenGL? Actuellement, je cours mon jeu en mode fenêtre, dois-je passer en plein écran pour obtenir l'utilisation du matériel?Comment créer des textures dans GPU

Si je peux créer des textures dans le matériel, y a-t-il une limite pour aucune des textures (autre que la mémoire matérielle)? puis comment puis-je mettre en cache mes textures dans le matériel? Merci.

+0

Voulez-vous créer des objets de texture ou des données pour les textures? –

+0

Hey encore, je veux dire est-il un moyen de mettre en cache la texture DATA dans GPU, autre que d'envoyer toutes les données de la texture lorsque nous avons besoin de le dessiner? – Morpheus

Répondre

1

Habituellement, lorsque vous parlez de générer une texture sur le GPU, vous ne créez pas réellement d'images de texture et ne les appliquez pas comme des textures normales. L'approche la plus simple et la plus courante consiste à utiliser les shaders Fragment pour calculer de manière procédurale les couleurs de chaque pixel en temps réel à partir de zéro pour chaque image.
L'exemple canonique pour cela est de générer un motif de Mandelbrot sur la surface d'un objet, disons une théière. La théière est rendue avec ses polygones et ses coordonnées de texture par l'application. À un certain stade du pipeline de rendu, chaque pixel de la théière traverse le fragment shader qui est un petit programme envoyé au GPU par l'application. Le fragment shader lit les coordonnées de la texture 2D et calcule la couleur de l'ensemble Mandelbrot des coordonnées 2D et l'applique au pixel.

Le mode plein écran n'a rien à voir avec cela. Vous pouvez utiliser des shaders et générer des textures même si vous êtes en mode fenêtre. Comme je l'ai mentionné, les textures que vous créez n'occupent jamais d'espace dans la mémoire de texture, elles sont créées à la volée. On pourrait probablement penser à un moyen de capturer et mettre en cache la texture générée mais cela peut être quelque peu complexe et nécessiter plusieurs passes de rendu.

Vous pouvez en apprendre plus à ce sujet si vous recherchez "GLSL" dans google - le langage d'ombrage OpenGL.
This somewhat dated tutorial montre comment créer un fragment de fragment simple qui dessine l'ensemble Mandelbrot (page 4).
Si vous pouvez mettre la main sur le livre "OpenGL Shading Language, 2ème édition", vous trouverez qu'il contient un certain nombre d'exemples simples sur la génération de textures ciel, feu et bois à l'aide d'une texture de bruit Perlin 3D externe de L'application.

3

Cela devrait être couvert par presque tous les tutoriels de texture pour OpenGL. Par exemple here, here et .

Pour chaque texture, vous devez d'abord avoir un nom de texture. Un nom de texture est comme un index unique pour une seule texture. Chaque nom pointe vers un objet de texture qui peut avoir ses propres paramètres, données, etc. glGenTextures est utilisé pour obtenir de nouveaux noms. Je ne sais pas s'il y a une limite en dehors de la plage d'uint (2^32). Si c'est le cas, vous obtiendrez probablement 0 pour tous les nouveaux noms de texture (et une erreur gl).

L'étape suivante consiste à lier votre texture (voir glBindTexture). Après cela toutes les opérations qui utilisent ou affectent les textures utiliseront la texture spécifiée par le nom de texture que vous avez utilisé comme paramètre pour glBindTexture. Vous pouvez maintenant définir les paramètres de la texture (glTexParameter) et télécharger les données de texture avec glTexImage2D (pour les textures 2D). Après avoir appelé glTexImage, vous pouvez également libérer la mémoire système avec vos données de texture.

Pour les textures statiques, tout ceci doit être fait une seule fois. Si vous voulez utiliser la texture, il vous suffit de la relier et d'activer la texturation (glEnable (GL_TEXTURE_2D)).

La taille (largeur/hauteur) d'une texture unique est limitée par GL_MAX_TEXTURE_SIZE. Ceci est normalement 4096, 8192 ou 16384. Il est également limité par la mémoire graphique disponible car il doit s'y intégrer avec d'autres ressources comme les tampons framebuffer ou vertex.Toutes les textures peuvent être plus grandes que la mémoire disponible, mais elles seront échangées.

Dans la plupart des cas, le pilote graphique doit décider quelles textures sont stockées dans la mémoire du système et lesquelles dans la mémoire graphique. Vous pouvez cependant donner une priorité plus élevée à certaines textures avec glPrioritizeTextures ou avec glTexParameter. Je ne m'inquiéterais pas trop de l'endroit où les textures sont stockées parce que le conducteur fait normalement un très bon travail avec cela. Les textures souvent utilisées sont également plus susceptibles d'être stockées dans la mémoire graphique. Si vous définissez une priorité qui est juste un "indice" pour le pilote sur l'importance pour la texture de rester sur la carte graphique. Il est également possible que la priorité soit complètement ignorée. Vous pouvez également vérifier où les textures sont actuellement avec glAreTexturesResident.

+0

J'ai fait tous les autres moi-même que glPrioritizeTextures. Mais merci pour votre temps pour l'expliquer avec des détails. Sur vos derniers mots, c'est ce que je demandais ... pour forcer la texture à stocker à la mémoire graphique plutôt que de laisser le conducteur décider? glPrioritizeTextures, est-ce le seul moyen d'y parvenir? – Morpheus

1

Pour créer une texture sur GPU, regardez dans les tutoriels "render to texture". Il existe deux méthodes courantes: la liaison d'un contexte PBuffer en tant que texture ou l'utilisation d'objets Frame Buffer. Les rendus PBuffer aux textures sont la méthode la plus ancienne, et ont le support le plus large. Les objets tampon de trame sont plus faciles à utiliser.

De même, vous n'avez pas besoin de passer en mode "plein écran" pour que OpenGL accélère HW. En fait OpenGL ne connaît pas du tout les fenêtres. Une fenêtre OpenGL en plein écran est juste celle-ci: Une fenêtre de toplage au-dessus de toutes les autres fenêtres sans décorations et le focus d'entrée grabed. Certains pilotes ignorent le masquage des fenêtres et le code d'écrêtage, et emploient une méthode d'échange de tampon plus simple et plus rapide si la fenêtre avec le contexte OpenGL actif couvre tout l'écran, obtenant ainsi un peu de performance. à d'autres influences.

Questions connexes