2010-06-10 87 views
5

我知道iPhone上的OpenGL紋理必須是2的冪,OpenGL 2.0也是如此嗎?如果我有一個尺寸爲320 x 480的圖像,並且想要將其全屏繪製,那麼可以使用OpenGL進行此操作。Fullscreen texture iPhone OpenGL ES

感謝

回答

10

NPOT紋理支持PowerVR SGX硬件,但有限制。 NPOT紋理不能使用mipmap,必須是2D(沒有立方體貼圖或三維紋理),並且必須使用GL_CLAMP_TO_EDGE進行兩種尺寸的紋理包裝;這是在默認情況下的OpenGL ES 2.0和下ES 1.1的擴展支持GL_APPLE_texture_2D_limited_npot

對於ES 1.1,你可以在運行時檢查,看是否能擴展存在與此代碼:

const char* extensions = (char*) glGetString(GL_EXTENSIONS); 
bool npot = strstr(extensions, "GL_APPLE_texture_2D_limited_npot") != 0; 

由於這隻存在於SGX而不是MBX,請注意,依靠NPOT紋理支持的將限制您使用較新的SGX設備。當然,依靠ES 2.0也會這樣做,所以如果這是您的預期目標,那麼NPOT支持是一個有爭議的問題,您可以繼續使用NPOT紋理。

下面是一個備用解決方案,可讓您繼續使用ES 1.1並保留完整的設備支持。將320x480紋理放入512x512內部,用其他背景圖塊,字形或其他紋理填充空白區域(以避免多個glBindTexture調用),然後使用我最喜歡的ES 1.1擴展之一GL_OES_draw_texture來繪製空白區域很快320x480的部分複製到視口:

int rect[4] = {0, 0, 480, 320}; 
glBindTexture(GL_TEXTURE_2D, texBackground); 
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, rect); 
glDrawTexiOES(0, 0, z, 480, 320); 

邊欄:在OpenGL ES 2.0的規範本身並沒有指定的NPOT紋理任何限制;除非我錯了,否則蘋果正在施加限制 - 當然,在ES 1.1的世界裏,NPOT的支持根本不存在,所以這是一個補充。

+0

謝謝克里斯,非常好的信息。請原諒我是一個noob,但是glDrawTexiOES()中的z參數是什麼?深度?我似乎無法找到任何文件。謝謝 – 2010-06-10 16:24:11

+0

@Ben:哎呀,對不起。 Z是矩形的深度 - 0是近平面,1是遠平面,十進制值會給你它們之間的距離百分比。在上面的例子中,對於嚴格的2D場景來說,它使用「畫家算法」管理自己的深度,所以z = 0;對於背景的大多數用途,除非已經顛倒深度範圍,否則您需要z = 1。 OpenGL規範頁面更好一些:(http://www.khronos.org/registry/gles/extensions/OES/OES_draw_texture.txt - 頁面大約一半) 清除泥漿? :) – 2010-06-10 16:45:02

1

假設你沒有太多的全屏紋理,你可以只使用一個512x512質地和只使用它320x480。它一定會奏效。

1

我想這取決於硬件。我曾經創建2紋理的最接近的力量,即如果我的紋理是320x480,那麼我將創建一個512x512的紋理,它將具有原始紋理數據。這確保了可移植性但消耗更多內存;)