1. 程式人生 > >OpenGL紋理尺寸限制

OpenGL紋理尺寸限制

最近在Android平臺下開發播放器,移植ffmpeg到android平臺,在視訊顯示的時候,由於無法使用硬體特性(Video Overlap),從而使用swscale作resize,但測試發現速度太慢,根本無法實時.後來嘗試使用OpenGL來提高顯示速度,速度確實很快,但在真機測試時發現使用glTexImage2D建立紋理出錯,模擬器沒問題,經過測試和查詢資料,原來width和height必須是2的N次冪:2,4, 8, 16, 32, 64, 128, 256, 512,1024,是合法的,寬高可以是  2x4, 16x128等等.因為是OpenGL新手,所以花費了很多時間,特此記錄一下.


解決非2的N次冪的解決辦法是:
1.首先根據width和height計算出最大的紋理width和height,我寫了一個函式:
int suggestTexSize(int size)
{
 int texSize = 1;
 while(true)
 {
 texSize <<= 1;
 if(texSize >= size)
 break ;
 }
 return texSize;
}
int texWidth = suggestTexSize(720);
int texHeight = suggestTexSize(480);
2.建立紋理
 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, texWidth , texHeight , 0, GL_RGB,

 GL_UNSIGNED_SHORT_5_6_5, NULL);
3.計算貼圖座標
 const GLfloat glX = ((double)720)/((double)texWidth);
 const GLfloat glY = ((double)480)/((double)texHeight);

 mVertices[0][0] = -0x10000;  // left
 mVertices[0][1] =  0x10000;  // top
 mVertices[1][0] = -0x10000;  // left
 mVertices[1][1] = -0x10000;  // bottom
 mVertices[2][0] =  0x10000;  // right

 mVertices[2][1] =  0x10000;  // top
 mVertices[3][0] =  0x10000;  // right
 mVertices[3][1] = -0x10000;  // bottom

 mTexCoords[0][0] = glX;  // right
 mTexCoords[0][1] = 0.0f;  // bottom
 mTexCoords[1][0] = glX;  // right
 mTexCoords[1][1] = glY;  // top
 mTexCoords[2][0] = 0.0f;  // left
 mTexCoords[2][1] = 0.0f;  // bottom
 mTexCoords[3][0] = 0.0f;  // left
 mTexCoords[3][1] = glY;  // top
4.更改紋理資料:
 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 720, 480, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, pPixel);

這樣就解決了.