2016-04-28 1 views
1

Je remplace le code OpenGL de mon application par du code utilisant OpenSceneGraph.Migration OpenGL vers OpenSceneGraph: Affichage incorrect dans le cas de certaines cotes de texture

Je travaille avec de grandes images (résolution supérieure à 5000x5000px), par conséquent les images sont divisées en mosaïques plus petites.

Le code OpenGL pour dessiner les tuiles utilise glTexImage2D(GL_TEXTURE_2D, ..., imageData), où imageData est le tableau d'octets de tuiles.

Avec OpenSceneGraph, je crée un osg::Image avec le même imageData et utilise ce osg::Image pour texturer un quad simple.

Le problème est que j'ai un affichage moche résultant de certaines dimensions osg::Image.

Pour les carreaux comme 256x128, tout est OK.

Voilà comment l'image originale loogs avec OpenGL enter image description here

Mais est ici comment il cherche 254x130 carreaux et osg :: Image:

enter image description here

Je voudrais comprendre ce que le problème est . Puisque OpenSceneGraph est basé sur OpenGL, je suppose que le code OpenSceneGraph que j'ai écrit est équivalent à l'ancien OpenGL. De plus, je ne peux pas changer la taille des carreaux, donc je dois vraiment le faire fonctionner avec des carreaux 254x130.

l'image Code de création:

`osg::Image * image = new osg::Image(); 
//width, height, textFormat, pixelFormat, type and data 
//are the ones that were used with glTexImage2D 
image->setImage(width, height, 1, textFormat, pixelFormat, type, data, NO_DELETE); 
osg::Texture2D * texture = new osg::Texture2D; 
texture->setImage(image); 
stateset->setTextureAttributeAndModes(0, texture, osg::StateAttribute::ON);` 
+0

Veuillez partager du code sur la façon dont vous créez, allouez et remplissez osg :: Image - la mauvaise image est-elle censée être en noir et blanc? – rickyviking

+0

J'ai ajouté du code dans le message d'origine. Et l'image grise est censée ressembler à la verte. J'ai également remarqué que toutes les tuiles sont inclinées. – Krag

Répondre

0

Je pense qu'il est très probablement un décalage entre les données de pixels et le format/type que vous passez à setImage().
Par exemple, si vos données d'image est RVB avec un octet par couleur, vous devez appeler

image->setImage(w, h, 1, GL_RGBA8, GL_RGB, GL_UNSIGNED_BYTE, data, osg::Image::NO_DELETE); 

Si votre texture est tournée à la verticale, il est parce que openGL considèrent toujours l'origine de la texture dans le coin en bas à gauche, vous soit devez retourner les données d'image avant d'appeler setImage() (ou inverser les coordonnées UV de vos géométries).

+0

J'ai fait quelques tests dans cette direction, et non, les données de pixel, le format et le type sont ok. Pour un ensemble fixe de données de pixels, de type de format et d'image source, le seul facteur qui gâche l'affichage est OpenSceneGraph AND non multiple de 4 taille de tuile. – Krag