Question

C ++ OpenGL, je veux attirer chaque pixel manuellement (en tant que texture, je suppose) sur un simple primitifs carrés, ou encore 2 polygones formant un carré.

Je ne sais pas où commencer, ou quelles expressions à rechercher. Est-ce que je cherche la cartographie de texture ou de créer des textures? La plupart des exemples sont à charger à partir d'un fichier, mais je ne veux pas le faire.

J'ai essayé de lire mon Guide de programmation OpenGL livre, mais juste un labyrinthe que je suis tout à fait nouveau pour OpenGL. S'il vous plaît aider.

Était-ce utile?

La solution

Jetez un coup d'oeil près glTexImage2D. Ceci est l'appel qui charge l'image en OpenGL pour une texture 2D.

glTexImage2D prend en fait un pointeur brut aux données de pixels dans l'image. Vous pouvez attribuer vous-même la mémoire, et définir les données d'image directement (comme vous le voulez), puis appeler cette fonction pour passer l'image à OpenGL.

Une fois que vous avez créé la texture, vous pouvez le lier à l'Etat afin d'utiliser vos triangles texture.

Il n'y a rien dans OpenGL qui requiert directement des images utilisées comme textures à charger des fichiers. Une bonne ressource pour les textures peut être trouvé dans cet article gamedev.

Autres conseils

Si la place que vous dessinez à 2 dimensions est et ne pivotent pas, vous cherchez peut-être

Ne noter que si un pointeur prend glTexImage2D() aux pixels pour charger, il ne se soucie pas de tout changement à ces données après l'appel. Autrement dit, les données sont vraiment chargé de la zone de mémoire que vous spécifiez, et OpenGL crée une copie de lui-même.

Cela signifie que si les données changent, vous devrez soit re-faire l'appel glTexImage2D (), ou utiliser quelque chose comme faire une glTexSubImage2D() mise à jour partielle. Je recommande le test et le profilage pour voir si la mise à jour sous-texture est rapide, pas sûr de savoir comment les pilotes réelle pour optimiser ce cas.

Merci à Reed Copsey me pointant vers glTexImage2D . Il s'avère que cela est très simple; juste passer un tableau de GLubyte à la fonction <=> (ainsi que toutes les fonctions nécessaires pour lier la texture, etc.). N'a pas essayé cet extrait de code exacte, mais il devrait fonctionner correctement. Les éléments de réseau représentent une version de série des lignes, des colonnes et des canaux.

int pixelIndex = 0;
GLubyte pixels[400];

for (int x = 0; x < 10; x++)
{
    for (int y = 0; y < 10; x++)
    {
         for (int channel = 0; channel < 4; channel++)
         {
             // 0 = black, 255 = white
             pixels[pixelIndex++] = 255;
         }
    }
}

glTexImage2D(
    GL_TEXTURE_2D, 0, GL_RGBA, SIZE, SIZE, 0,
    GL_RGBA, GL_UNSIGNED_BYTE, pixels);

Je l'ai lu dans le livre OpenGL, vous pouvez utiliser un tableau 2D pour les images monochromes, donc je suppose que vous pouvez utiliser un tableau 3D également.

Ce que vous cherchez est généralement appelée « render à la texture. »

http://developer.nvidia.com/object/gdc_oglrtt.html

Ce tutoriel est assez vieux. Je suppose que certaines de ces extensions ne sont pas en fait des extensions dans les versions les plus récentes de OGL. Désolé, je ne peux pas être plus d'aide. Je ne travaille pas directement avec l'API beaucoup plus de graphiques, et si je l'ai fait j'utiliser D3D si je pouvais (pour éviter la soupe d'extension, et pour d'autres raisons que je ne vais pas vous ennuyer ici.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top