2011-01-29 21 views
2

我有一个RGB(或RGBA)纹理图像的缓冲区,我想用下面的代码在我的Android设备上显示它。我使用NDK的OpenGL。OpenGL ES纹理问题,4个重复的列和水平线(Android)

glTexImage2D(GL_TEXTURE_2D, 
      0, 
      GL_RGBA, 
      256, 
      256, 
      0, 
      GL_RGBA, 
      GL_UNSIGNED_BYTE, 
      this->pBuffer); 

我还设置的PixelFormat从Java侧:

this.getHolder().setFormat(PixelFormat.RGBA_8888); 
this.setEGLConfigChooser(8, 8, 8, 8, 0, 0); 
setRenderer(new MyRenderer()); 

显示图像,而且有四列(相同的和含有原始图像的识别份)和有水平遍布整个图像。

可能是什么问题?

原始图像:

Original Image

它的外观与我的代码:

How it looks with my code

回答

2

这看起来像图像大小不是256×256,但也许大约150像素宽。你的纹理必须是2个大的功率,但是如果你需要上传一个较小的纹理,你可以使用glTexSubImage2D

glTexSubImage2D(GL_TEXTURE_2D, /* target */ 
      0,  /* level */ 
      0,  /* xoffset */ 
      0,  /* yoffset */ 
      150,  /* width */ 
      256,  /* height */ 
      GL_RGBA, /* format */ 
      GL_UNSIGNED_BYTE, /* type */ 
      this->pBuffer); /* data */ 

在初始glTexImage2D呼叫,只传递的NULL而不是像素缓冲区。尝试这样的事情,看看它是否有所作为。

如果您使用glDrawTexiOES绘制纹理,然后裁剪较小的质地使用GL_TEXTURE_CROP_RECT_OES:

int rect[4] = {0, imageHeight, imageWidth, -imageHeight}; 
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, rect); 
glDrawTexiOES(0, 0, 0, windowWidth, windowHeight); 
+0

谢谢,这帮助了很多。我设法正确显示图像。但是现在图像不能缩放到显示的宽度。我使用glDrawTexiOES(0,0,0,windowWidth,windowHeight)。这是正确的方法吗? – 2011-01-30 13:28:00