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
C++ TexSubImage2D仅为特定图像生成乱码纹理_C++_Opengl_Glteximage2d - Fatal编程技术网

C++ TexSubImage2D仅为特定图像生成乱码纹理

C++ TexSubImage2D仅为特定图像生成乱码纹理,c++,opengl,glteximage2d,C++,Opengl,Glteximage2d,我尝试在另一个纹理上渲染纹理,如下图所示: 但是,只有该图像才能正确渲染。我的其他图像变得混乱和“扭曲”。如果仔细观察,就好像这些行被移动了: 在上面的示例中,我在背景中使用了非常相同的cat图片。不管是这张猫的照片,还是我生成的所有其他图像,由于某种原因,除了一张特殊的图片外,最后都被弄乱了。我看过EXIF数据,除了它不使用sRGB之外,它的格式与其他数据完全相同。它有一个阿尔法通道和一切 考虑到行是如何移动的,我相信这与像素对齐有关,但我已经尝试了对齐的所有可能组合,但迄今为止没有任何效

我尝试在另一个纹理上渲染纹理,如下图所示:

但是,只有该图像才能正确渲染。我的其他图像变得混乱和“扭曲”。如果仔细观察,就好像这些行被移动了:

在上面的示例中,我在背景中使用了非常相同的cat图片。不管是这张猫的照片,还是我生成的所有其他图像,由于某种原因,除了一张特殊的图片外,最后都被弄乱了。我看过EXIF数据,除了它不使用sRGB之外,它的格式与其他数据完全相同。它有一个阿尔法通道和一切

考虑到行是如何移动的,我相信这与像素对齐有关,但我已经尝试了对齐的所有可能组合,但迄今为止没有任何效果。这是我的密码:

int height, width = 512;
m_pSubImage = SOIL_load_image("sample.png", &width, &height, 0, SOIL_LOAD_RGBA);

glGenTextures(1, &m_textureObj);
glBindTexture(m_textureTarget, m_textureObj);
...
glActiveTexture(TextureUnit);
glBindTexture(m_textureTarget, m_textureObj);
glTexSubImage2D(GL_TEXTURE_2D, 0, 20, 10, 100, 100, GL_RGBA, GL_UNSIGNED_BYTE, m_pSubImage);
加载背景图像的代码与此类似,只是它使用此调用而不是glTexSubImage2D:

glTexImage2D(m_textureTarget, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, m_pImage);

您似乎没有将宽度和高度正确传递到
glTexSubImage2D
。请注意,您需要每个扫描线存储的像素数,这通常不是图像的“逻辑”宽度,而是四舍五入到4的倍数


“逻辑”和“存储”宽度之间的差异将在每个扫描线上留下一些填充像素,这些像素将被解释为下一扫描线的最左侧像素,并随着图像向下移动而累积。这会产生你观察到的倾斜效果。

你似乎没有检查故障。
glTexSubImage2D
的以下故障模式与此特别相关:

  • 如果
    xoffset<0
    xoffset+width>w
    yoffset<0
    yoffset+height>h
    ,则生成
    GL\u无效值
    ,其中
    w
    是宽度,
    h
    是正在修改的纹理图像的高度

  • 如果宽度或高度小于0,则生成
    GL\u无效值

  • GL\u无效\u操作
    如果纹理数组未由先前的
    glTexImage2D
    glCopyTexImage2D
    操作定义,该操作的
    internalformat
    glTexSubImage2D
    的格式匹配,则会生成


此相册中既有可用的图像,也有不可用的图像。显然,在使用
glTexSubImage2D
写入纹理之前,我无法发布您调用的两个链接来创建纹理,对吗?是的。
glTexImage2D
调用渲染cat BackgroundAit,当您说“一个纹理渲染在另一个纹理之上”时,您的意思是有两个纹理并绘制一个四边形,每个纹理在输出中合成?或者将第二个纹理粘贴到第一个纹理的一部分?我的意思是,
m_textureTarget
对于背景和前景是否都相同?是否有
glTexImage2D
在代码的
..
部分被遗漏?但是
glTexImage2D
调用显然可以毫无问题地渲染纹理。如果这是问题所在,它也会显示在背景上,不是吗?为什么这张图片没有受到影响?@Daniel:刚刚发现了那个打字错误。我指的是子映像调用。
glTexImage2D
调用实际上需要2次幂,如果不是,则会导致其他故障。甚至可能不是填充问题。他刚刚通过100100,大小为
glTexSubImage()
。我怀疑图像不是100x100。@Reto:嗯,它仍然违反了宽度参数必须与内存布局匹配的规则。@Daniel:还有一件事。要在
glTexSubImage2D
中仅使用部分数据,我认为可以通过设置
glPixelStore(GL\u UNPACK\u ROW\u LENGTH,…)
来实现。虽然测试错误总是一个好主意,但我不认为这是海报存在的问题。他试图用新数据(棋盘格)替换已经存在的纹理(猫图像)的一部分。所以在这种情况下,
glTexImage2D
以前被调用过,格式匹配。@Reto:问题下面的一条评论说在调用
glGenTextures
和调用
glTexSubImage2D
之间没有
glTexImage2D
。嗯,是的。在这整条线索中有一些矛盾的信息。我认为如果没有
glTexImage2D
调用这个纹理,他就不会得到他得到的结果。如果能看到更多的代码来完全确定发生了什么,那将非常有用。