Android NDK OpenGL ES 2.0纹理Pitch

9

有没有办法在OpenGL ES 2.0中使用与宽度不同的间距的方式将纹理blit。通常我会使用PBO或通过glPixelStore调整GL_PACK_ROW_LENGTH来修复此问题。然而,在Android平台上,绑定缓冲区的GL_PIXEL_UNPACK_BUFFER和GL_PACK_ROW_LENGTH似乎都不存在。

glTex(Sub)Image2D不支持此功能。

有什么提示吗?


1
在某些情况下,可以通过调整纹理坐标来解决这个问题。比如说,我有一个512x512的纹理,以512位深度为间距,但我想使用的数据是以256位深度为间距的。我仍然使用glSubTexImage2D,但将纹理坐标调整为0到(256/512),而不是0到1。换句话说,去掉我不使用的纹理部分。 - Halsafar
1
你能在下面以答案的形式发布你的解决方案吗?谢谢。 - Bill the Lizard
3个回答

2

引用 @Halsafar

在某些场景下,可以通过调整纹理坐标来解决这个问题。


假设我有一个 512 x 512 的纹理,其位深度为 bitdepth * 512

但是我要使用的数据是按 bitdepth * 256 来排列的

我仍然使用 glSubTexImage2D,但将纹理坐标调整为0到(256/512)

而不是 01

换句话说,去掉我不使用的纹理部分


谢谢您发布这个问题。很抱歉我让它失效了。我已经编辑了我的问题以澄清。 - Halsafar

1
这可能听起来有点过分(甚至可能与您的期望不太匹配),但也许您可以简单地利用栅格化器和帧缓冲对象: 创建一个具有纹理作为颜色缓冲区的FBO,然后通过一个简单的顶点+片段着色器在其中绘制一些带纹理的四边形:在顶点着色器中使用简单的正交投影矩阵,在片段着色器中使用点采样纹理采样。

0

既然我在评论中回答了,这里是更直接的答案:

// width and height is 256 and max is 512
// texture coordinates
float uMax = (width / max);
float vMax = (height / max);

_texCoords[0] = 0.0; _texCoords[1] =  vMax;
_texCoords[2] = uMax; _texCoords[3] =  vMax;
_texCoords[4] = 0.0; _texCoords[5] =  0.0;
_texCoords[6] = uMax; _texCoords[7] =  0.0;

现在使用这些纹理坐标进行渲染,您可以将256x256的纹理粘贴到512x512的缓冲区中。您想要使用的宽度和高度可以是任何小于或等于最大尺寸的大小。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接