2016-04-28 13 views
1

Ich ersetze den OpenGL-Code meiner App durch Code, der OpenSceneGraph verwendet.OpenGL zu OpenSceneGraph-Migration: Falsche Anzeige bei bestimmten Texturdimensionen

Ich arbeite mit großen Bildern (Auflösung höher als 5000x5000px), daher werden Bilder in kleinere Kacheln aufgeteilt.

Der OpenGL-Code zum Zeichnen der Kacheln verwendet glTexImage2D(GL_TEXTURE_2D, ..., imageData), wobei imageData das Kachel-Byte-Array ist.

Mit OpenSceneGraph erzeuge ich eine osg::Image mit der gleichen imageData und verwenden Sie diese osg::Image, um ein einfaches Quad zu texturieren.

Das Problem ist, dass ich eine hässliche Anzeige für bestimmte osg::Image Dimensionen haben.

Für Fliesen wie 256x128 ist alles in Ordnung.

Das ist, wie das Originalbild loogs mit OpenGL enter image description here

Aber hier ist, wie es für 254x130 Fliese sieht und OSG :: Image:

enter image description here

Ich mag würde zu verstehen, was das Problem ist, . Da OpenSceneGraph auf OpenGL basiert, denke ich, dass der OpenSceneGraph Code, den ich geschrieben habe, dem alten OpenGL entspricht. Außerdem kann ich die Kachelgröße nicht ändern, also muss ich wirklich mit 254x130 Kacheln arbeiten.

Bild Erstellungscode:

`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

Bitte teilen Sie Code, wie Sie erstellen, zuweisen und füllen Sie das OSG :: Bild - ist das falsche Bild sogar schwarz und weiß? – rickyviking

+0

Ich habe Code in der ursprünglichen Nachricht hinzugefügt. Und das graue Bild soll wie das grüne aussehen. Ich habe auch bemerkt, dass alle Fliesen geneigt sind. – Krag

Antwort

0

Ich denke, es ist sehr wahrscheinlich eine Diskrepanz zwischen den Pixeldaten und dem Format/Typ, den Sie setImage() übergeben.
Zum Beispiel, wenn Sie Ihre Bilddaten RGB mit einem Byte pro Farbe, sollten Sie

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

rufen Wenn Ihre Textur vertikal gespiegelt wird, ist es, weil openGL immer die Textur Ursprung in der linken unteren Ecke betrachten, so dass Sie entweder müssen Sie die Bilddaten spiegeln, bevor Sie setImage() aufrufen (oder die UV-Koordinaten Ihrer Geometrien invertieren).

+0

Ich habe einen Test in diese Richtung gemacht, und nein, die Pixeldaten, das Format und der Typ sind in Ordnung. Für einen festen Satz von Pixeldaten, Formattyp und Quellbild ist der einzige Faktor, der die Anzeige ruiniert, OpenSceneGraph AND kein Vielfaches von 4 Kachelgröße. – Krag