我正在尝试将纹理渲染到另一个纹理之上,如下图所示:
但是,只有该图像才能正确呈现。我的其他图像出现乱码和“扭曲”。如果仔细观察,就好像行被移动了一样:
在上面的例子中,我在后台使用了相同的猫图片。由于某些原因,这张猫图片和我生成的所有其他图片都会出现乱码,除了一张特殊图片。我查看了EXIF数据,除了它不使用sRGB这一事实外,它的格式与其他格式完全相同。它有一个alpha通道和一切。
我认为它与像素对齐有关,考虑到行的移动方式,但我已经尝试了几乎所有可能的对齐组合,到目前为止没有任何工作。这是我的代码:
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);
答案 0 :(得分:0)
您似乎没有正确地将宽度和高度传递给glTexSubImage2D
。请注意,您需要每个扫描线存储的像素数,这通常不是图像的“逻辑”宽度,而是四舍五入为4的倍数。
“逻辑”和“存储”宽度之间的差异将在每条扫描线上留下一些填充像素,这将被解释为下一扫描线的最左侧像素,并在向下移动图像时累积。这会产生你观察到的倾斜效应。
答案 1 :(得分:0)
您似乎没有检查失败。 glTexSubImage2D
的以下失败模式在此特别相关:
如果
GL_INVALID_VALUE
,xoffset < 0
,xoffset + width > w
,yoffset < 0
,其中yoffset + height > h
是宽度w
,则会生成- 如果宽度或高度小于0,则会生成
h
1}}是要修改的纹理图像的高度。- 如果纹理数组尚未由
GL_INVALID_VALUE
。GL_INVALID_OPERATION
匹配glTexImage2D
格式的glCopyTexImage2D
或internalformat
操作定义,则生成
glTexSubImage2D
{1}}。强>