2016-04-28 21 views
1

我正在用使用OpenSceneGraph的代码替换我的应用程序的OpenGL代码。OpenGL到OpenSceneGraph迁移:在某些纹理尺寸的情况下显示不正确

我正在处理大图像(分辨率高于5000x5000px),因此图像被分割成更小的图块。

绘制瓦片的OpenGL代码使用glTexImage2D(GL_TEXTURE_2D, ..., imageData),其中imageData是瓦片字节数组。

使用OpenSceneGraph,我创建了一个osg::ImageimageData相同,并使用此osg::Image来构造一个简单的四边形。

问题是我有一个丑陋的显示,导致某些osg::Image尺寸。

对于瓷砖喜欢256x128,一切都OK。

这就是将原始图像与OpenGL的 enter image description here

如何loogs但这里是它的外观为254x130瓷砖和OSG ::图片:

enter image description here

我想了解的问题是什么。由于OpenSceneGraph基于OpenGL,我猜我写的OpenSceneGraph代码等同于旧的OpenGL代码。此外,我无法更改瓷砖尺寸,所以我真的需要使其与254x130瓷砖一起工作。

图像创建代码:

`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

请分享一些代码,你如何创建,分配和填充osg ::图像 - 是错误的图像,甚至应该是黑色和白色? – rickyviking

+0

我在原始邮件中添加了一些代码。而灰色图像应该看起来像绿色的图像。我也注意到每块瓷砖都倾斜了。 – Krag

回答

0

我认为这是最有可能的像素数据,并传递给setImage格式/类型()之间的不匹配。
举例来说,如果你的图像数据是RGB每个颜色一个字节,你应该叫

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

如果你的纹理垂直翻转,这是因为openGL的总是考虑在左下角的质地产地,所以你要么在调用setImage()之前翻转图像数据(或者反转几何图形的UV坐标)。

+0

我在这个方向做了一些测试,不,像素数据,格式和类型都可以。对于一组固定的像素数据,格式类型和源图像,破坏显示的唯一因素是OpenSceneGraph和4个瓦片大小的非倍数。 – Krag