OpenGL到OpenSceneGraph迁移:在某些纹理尺寸

时间:2016-04-28 15:37:39

标签: opengl texture2d openscenegraph

我正在用使用OpenSceneGraph的代码替换我的应用程序的OpenGL代码。

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

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

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

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

对于像256x128这样的瓷砖,一切都还可以。

原始图像如何与OpenGL混淆 enter image description here

但是这里是如何寻找254x130 tile和osg :: Image:

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);`

1 个答案:

答案 0 :(得分:0)

我认为很可能是像素数据与传递给setImage()的格式/类型不匹配。
例如,如果您的图像数据是RGB,每种颜色一个字节,则应调用

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

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