OpenGL紋理尺寸限制
阿新 • • 發佈:2019-01-01
最近在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);
解決非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);
這樣就解決了.