Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL到OpenSceneGraph迁移:在某些纹理尺寸的情况下显示不正确_Opengl_Texture2d_Openscenegraph - Fatal编程技术网

OpenGL到OpenSceneGraph迁移:在某些纹理尺寸的情况下显示不正确

OpenGL到OpenSceneGraph迁移:在某些纹理尺寸的情况下显示不正确,opengl,texture2d,openscenegraph,Opengl,Texture2d,Openscenegraph,我正在用使用OpenSceneGraph的代码替换我应用程序的OpenGL代码 我正在处理大图像(分辨率高于5000x5000px),因此图像被分割成更小的分幅 绘制平铺的OpenGL代码使用glTexImage2D(GL\u TEXTURE\u 2D,…,imageData),其中imageData是平铺字节数组 使用OpenSceneGraph,我使用相同的imageData创建了一个osg::Image,并使用这个osg::Image对一个简单的四边形进行纹理处理 问题是,我的显示很难看,

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

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

绘制平铺的OpenGL代码使用
glTexImage2D(GL\u TEXTURE\u 2D,…,imageData)
,其中
imageData
是平铺字节数组

使用OpenSceneGraph,我使用相同的
imageData
创建了一个
osg::Image
,并使用这个
osg::Image
对一个简单的四边形进行纹理处理

问题是,我的显示很难看,导致某些
osg::Image
维度

对于256x128这样的瓷砖,一切正常

这就是原始图像在OpenGL中的表现

但下面是254x130瓷砖和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);`

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

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

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

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

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

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

请分享一些关于如何创建、分配和填充osg::Image的代码-错误的图像应该是黑白的吗?我在原始消息中添加了一些代码。灰色图像应该看起来像绿色的。我还注意到每个瓷砖都是倾斜的。请分享一些关于如何创建、分配和填充osg的代码::图像-错误的图像应该是黑白的吗?我在原始消息中添加了一些代码。灰色图像应该看起来像绿色的。我还注意到每个瓷砖都是倾斜的。我朝那个方向做了一些测试,没有,像素数据、格式和类型都是可以的。对于一组固定的像素数据,格式类型和源,我mage,破坏显示的唯一因素是OpenSceneGraph和4个平铺大小的非倍数。我在那个方向做了一些测试,没有,像素数据、格式和类型都可以。对于一组固定的像素数据、格式类型和源图像,破坏显示的唯一因素是OpenSceneGraph和4个平铺大小的非倍数。