2011-01-29 18 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