我正在用使用OpenSceneGraph的代码替换我的应用程序的OpenGL代码。
我正在处理大图像(分辨率高于5000x5000像素),因此图像被分割成更小的图块。
用于绘制切片的OpenGL代码使用glTexImage2D(GL_TEXTURE_2D, ..., imageData)
,其中imageData
是切片字节数组。
使用OpenSceneGraph,我使用相同的osg::Image
创建imageData
并使用此osg::Image
来构建一个简单的四边形。
问题在于我有一个丑陋的显示,导致某些osg::Image
尺寸。
对于像256x128这样的瓷砖,一切都还可以。
但是这里是如何寻找254x130 tile和osg :: Image:
我想了解问题所在。由于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 :(得分:0)
我认为很可能是像素数据与传递给setImage()的格式/类型不匹配。
例如,如果您的图像数据是RGB,每种颜色一个字节,则应调用
image->setImage(w, h, 1, GL_RGBA8, GL_RGB, GL_UNSIGNED_BYTE, data, osg::Image::NO_DELETE);
如果你的纹理垂直翻转,那是因为openGL总是考虑左下角的纹理原点,所以你要么在调用setImage()之前翻转图像数据(或者反转你的UV坐标)几何形状)。