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.
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 –
@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? :) –