2011-06-13 162 views
10

有没有什么办法在opengl es 2.0中以不同于宽度的间距对纹理进行blit处理。通常我会通过使用PBO或通过glPixelStore调整GL_PACK_ROW_LENGTH来解决此问题。不过,在Android平台上,GL_PIXEL_UNPACK_BUFFER似乎无法将缓冲区绑定到或GL_PACK_ROW_LENGTH。Android NDK OpenGL ES 2.0纹理间距

glTex(Sub)Image2D不支持这个。

任何提示?

+1

在这里回答我自己的问题。 在某些情况下,这可以通过调整纹理坐标来解决。假设我有一个512x512纹理以512 * bitdepth投射,但我想要使用的数据投射到256 * bitdepth。我继续前进,并且glSubTexImage2D仍然是,但是将纹理坐标调整为0到(256/512)而不是0到1.换句话说,剥掉我没有使用的纹理部分。 – Halsafar 2011-06-15 04:20:14

+1

您可以将您的解决方案作为下面的答案发布吗?谢谢。 – 2011-06-15 12:34:14

回答

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; 

现在使用这些texcoords来呈现,你可以在512×512缓冲坚持256x256的质感。您想要使用的宽度和高度可以是等于或小于您的最大尺寸的任何尺寸。

2

报价@Halsafar

在某些情况下,这可以通过来解决调整纹理坐标


可以说我有一个512 X 512质地金字512 * bitdepth

,但我想使用的数据投以256 * bitdepth

我继续前进,glSubTexImage2D但仍调整纹理COORDS是0到(256/512

,而不是01

换句话说剥离我不使用的纹理部分

+0

感谢您发布此信息。我很抱歉让它死亡。 我编辑了我的问题来澄清。 – Halsafar 2012-01-17 07:42:32

1

它可能听起来有点矫枉过正(或者甚至不符合你的期望),但也许你可以简单地利用光栅化器和帧缓冲区对象: 创建一个FBO纹理作为颜色缓冲区和。通过一个简单的顶点+片段着色器,在它中画出一些纹理四边形(S):你将使用一个简单的Ortho。在顶点着色器中使用投影矩阵,并在片段着色器中使用点采样纹理采样。