有什么方法可以在opengl es 2.0中以不同于其宽度的间距对纹理进行blit。通常我会通过使用 PBO 或通过 glPixelStore 调整 GL_PACK_ROW_LENGTH 来解决这个问题。但是,Android 平台上似乎既不存在用于将缓冲区绑定到的 GL_PIXEL_UNPACK_BUFFER 也不存在 GL_PACK_ROW_LENGTH。
glTex(Sub)Image2D 不支持这个。
有小费吗?
在某些情况下,这可以通过调整纹理坐标来解决。
可以说我有一个512
X512
纹理定位在512
*bitdepth
但我想使用的数据是256
*bitdepth
我继续前进,glSubTexImage2D
但将纹理坐标调整0
为 ( 256/512
)
而不是0
to 1
。
换句话说,去掉我不使用的纹理部分。
这听起来可能有点矫枉过正(甚至不符合您的期望),但也许您可以简单地利用光栅化器和帧缓冲区对象:创建一个 FBO,将纹理作为颜色缓冲区,然后......在其中绘制由于一个简单的顶点+片段着色器,一些纹理四边形:你可以使用一个简单的正交。顶点着色器中的投影矩阵,并在片段着色器中使用点采样纹理采样。
由于我在评论中回答了它,因此这里是一个更直接的答案:
// 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;
现在使用这些 texcoords 进行渲染,您可以在 512x512 缓冲区中粘贴 256x256 纹理。您要使用的宽度和高度可以是等于或低于最大尺寸的任何尺寸。