0

我正在尝试将纹理呈现在另一个纹理之上,如下图所示:

  期望的

但是,只有该图像才能正确渲染。我的其他图像出现乱码和“扭曲”。如果你仔细看,就好像行被移动了:

  实际的

在上面的示例中,我在背景中使用了相同的猫图片。这张猫图片和我生成的所有其他图片最终都会出现乱码,除了一张特殊图片,出于某种原因。我查看了 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);
4

2 回答 2

1

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

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

于 2014-04-25T17:40:17.270 回答
0

你似乎没有检查失败。以下故障模式在glTexSubImage2D这里特别重要:

  • GL_INVALID_VALUE如果xoffset < 0, xoffset + width > w, yoffset < 0, , 则生成yoffset + height > h,其中 w是被修改的纹理图像的宽度和h高度。

  • GL_INVALID_VALUE如果宽度或高度小于 0,则生成。

  • GL_INVALID_OPERATION如果纹理数组尚未由 与格式匹配的先前glTexImage2DglCopyTexImage2D操作定义,则生成.internalformatglTexSubImage2D

于 2014-04-25T17:51:18.303 回答