2010-06-10 25 views
5

iphone üzerindeki OpenGL dokularının 2'nin gücü olması gerektiğinin farkındayım, bu OpenGL 2.0 için de geçerli mi? 320 x 480 boyutunda bir görüntü varsa ve tam ekran çizmek istiyorsanız OpenGL ile bunu yapmak için herhangi bir yol var.Tam ekran doku iPhone OpenGL ES

Teşekkür

cevap

10

NPOT dokuları , PowerVR SGX donanımında desteklenen'dir, ancak kısıtlamalar vardır. NPOT dokular, mipmap'leri kullanamaz, 2D olmalı (küp haritaları veya 3D dokular içermemelidir) ve her iki boyutta da doku sarması için GL_CLAMP_TO_EDGE'u kullanmalıdır; Bu uzantı tarafından OpenGL ES 2.0 ve ES 1.1 altında varsayılan olarak desteklenmektedir GL_APPLE_texture_2D_limited_npot

bu uzantı bu kodla varsa ES 1.1 için, görmek için zamanında kontrol edebilirsiniz:

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

bu yana Sadece SGX'te değil, MBX'de mevcut olup, NPOT doku desteğine güvenerek 'un yeni SGX cihazlarına sınırlanacağının bilincinde olun. Elbette, ES 2.0'a güvenmek aynısını yapacaktır, bu yüzden hedeflenen hedefinizse, NPOT desteği bir noktadır ve NPOT dokuları ile devam edebilirsiniz.

ES 1.1 kullanmaya devam etmenizi ve tam aygıt desteğini korumanızı sağlayan alternatif bir çözüm. Bir 512x512 içine 320x480 doku koyun, diğer arka plan karoları, glifler veya aynı anda çizilecek diğer dokular ile doldurun (birden fazla glBindTexture çağrıları önlemek için) ve sonra benim en sevdiğim ES 1.1 uzantıları, GL_OES_draw_texture, birini kullanmak için hızla viewport üzerine 320x480 bölüm kopyalayın:

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); 

Kenar çubuğu: OpenGL ES 2.0 spec kendisi NPOT dokular üzerinde herhangi bir kısıtlama belirtmez; Yanılmıyorsam, Apple sınırlamaları zorluyor - tabi ki, ES 1.1 dünyasında, NPOT desteği hiç mevcut değil, bu yüzden buradaki bir ilave.

+0

Teşekkürler Chris, çok iyi bilgi. Bir noob olduğum için özür dilerim, ancak glDrawTexiOES() içindeki z parametresi nedir? Derinlik? Herhangi bir belge bulamıyorum. Teşekkürler –

+0

@Ben: Whoops, bunun için üzgünüm. Z, dikdörtgenin derinliğidir - 0, yakın düzlemdir, 1 uzak düzlemdir ve ondalık değerler, bunlar arasındaki mesafenin yüzdesini verir. Yukarıdaki örnekte, "ressamın algoritması" ile kendi derinliğini yöneten tamamen 2 boyutlu bir sahne vardı, böylece z = 0; arka planların çoğu için, derinlik aralığınızı tersine çevirmedikçe z = 1 olmasını istersiniz. OpenGL spec sayfası biraz daha iyi bir şekilde ortaya koyar: (http://www.khronos.org/registry/gles/extensions/OES/OES_draw_texture.txt - sayfanın yaklaşık yarısı) Çamur olarak temizle? :) –

1

çok fazla tam ekran dokuları yok varsayarsak, sadece bir 512x512 dokusunu kullanmak ve sadece bunun 320x480 kullanabilirsiniz. Kesinlikle işe yarayacak.

1

Bu, donanımlara bağlı olduğunu tahmin ediyorum. 2 dokuya en yakın gücü yaratırdım, yani dokumam 320x480 ise, orijinal doku verisine sahip 512x512'lik bir doku oluşturacağım. Bu, taşınabilirliği sağlar ancak biraz daha fazla bellek tüketir;)