【问题标题】:Android NDK OpenGL ES 2.0 Texture PitchAndroid NDK OpenGL ES 2.0 纹理间距
【发布时间】:2011-09-14 07:51:43
【问题描述】:

有什么方法可以在opengl es 2.0 中使用与宽度不同的间距来对纹理进行blit。通常我会通过使用 PBO 或通过 glPixelStore 调整 GL_PACK_ROW_LENGTH 来解决这个问题。但是,Android 平台上似乎既不存在用于绑定缓冲区的 GL_PIXEL_UNPACK_BUFFER,也不存在 GL_PACK_ROW_LENGTH。

glTex(Sub)Image2D 不支持这个。

有什么建议吗?

【问题讨论】:

  • 在这里回答我自己的问题。在某些情况下,这可以通过调整纹理坐标来解决。假设我有一个 512x512 纹理,间距为 512*bitdepth,但我想使用的数据间距为 256*bitdepth。我继续使用 glSubTexImage2D,但将纹理坐标调整为 0 到 (256/512) 而不是 0 到 1。换句话说,去掉我不使用的纹理部分。
  • 您可以在下面发布您的解决方案作为答案吗?谢谢。

标签: android opengl-es textures pbo


【解决方案1】:

因为我在评论中回答了这个问题,所以这里是一个更直接的答案:

// 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 纹理。您要使用的宽度和高度可以是等于或低于最大尺寸的任何尺寸。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      引用@Halsafar

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


      假设我有一个 512 x 512 纹理定位在 512 * bitdepth

      但我想使用的数据是 256 * bitdepth

      我继续glSubTexImage2D,但将纹理坐标调整为 0 到 (256/512)

      而不是 01

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

      【讨论】:

      • 感谢您发布此信息。对不起,我让它死了。我已经编辑了我的问题以澄清。
      猜你喜欢
      • 2016-08-26
      • 2012-04-08
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多