2012-10-25 27 views
16

Pekala, bu yüzden bu dokular beni gerçekten karıştırıyor. Ben this öğretici (ki bu harika olduğunu düşünüyorum) baktım, özellikle "32 doku birimine kadar tanımlayabilirsiniz, ancak her gölgelendirici için sadece 8 dokuları." Başlıklı resim. Anladığım kadarıyla, işte şu şekilde çalışıyor:OpenGLES 2 - glBindTexture ne zaman ve ne zaman glActiveTexture?

Bir doku birimini etkinleştirirsiniz. Daha sonra, bir doku nesnesini (görüntüdeki 'Doku Verileri' küplerine benzer şekilde) bu birim içindeki belirli bir hedefe bağlarsınız. Yani, glGenTextures nesneler & almak ve sonra bu doku TEXTURE_2D veya bir şey bağlamak için glBindTexture (şu anda diğer hedeflerle ilgilenmiyorum). Daha sonra glTexImage2D ile doku verilerini belirtebilirsiniz.

Şimdi. Her biri farklı dokulara sahip 3 shader programı kullanıyorum. İşte yapmak istediğim şey bu:

  • glActiveTexture
  • glBindTexture bir başlatma aşamasında

    , benim doku birimlerin her geçmesi ve gitmek
  • glTexImage2D ((aktif doku birimi üzerinde çalışır)

ve gölgelemelere, I 'i' glActiveTexture arasında GL_TEXTUREi de belirtilen değerlere göre, her gölgelendiricide üniform eşleşecek şekilde glUniform) anda bağlanmış nesne ile çalışır. Sadece dört dokuya ihtiyacım var ve çok küçükler.

Şimdi, oluşturma sırasında, programları iyi bir şekilde değiştirebilmem ve her şey düzgün çalışıyor olabilir mi? Her program zaten hangi birimin kullanılacağını belirten bir formata sahiptir ve her ünite zaten TEXTURE_2D hedefine bağlı bir nesneye sahiptir ve her bir nesne glTexImage2D tarafından belirtilen veriyi içerir, değil mi? Yani render işlevimde hiçbir bağlayıcı veya etkinleştirme birimi gerekmez mi? En azından böyle anladım, ama yanlış yerlere yanlış dokular alıyorum. Ayrıca, bir programımda, tek bir yüzey için üç doku arasında geçiş yapmak istiyorum. Bu yüzden, her bir dokuyu bir nesneye yüklediğimi ve her bir nesneyi bir birime bağladığımı düşündüm, sonra render aşamasında, hangi doku biriminin kullanılacağını programa söyleyemem.

Bu yüzden OpenGL'deki tekstüre işleminin temel yapısını yanlış anlamış mıyım, yoksa programlar değiştirildiğinde nesnelerin nesnelere bağlanmalarının sürüp dolmadığını mı yoksa böyle bir şey mi olduğunu merak ediyorum. Ya da bir dokuyu birden çok kez bağlamak zorundayım - ama ne zaman ve neden?

+1

Bana öyle geliyor ki, doğru fikre sahip olduğunuz gibi, kusuru göremiyorum. Belki de yanlış dokuları çizdiğiniz ** minimal ** örneğini ortaya koyabilirsiniz, böylece bir hata yapıp yapmadığınızı görebiliriz? – Tim

+1

Benzer bir sorunla karşılaştığımda bu soruya baktım. Sorunum statik olmaması gereken statik bir değişkenden kaynaklanıyordu. IOS için geliştiriyorum ve Xcode'daki OpenGL hata ayıklayıcısını kullanarak bunu anlamaya başladım. IOS'ta olup olmadığından emin değilsiniz, ancak eğiticilerle yeni başlıyorsanız, bu hata ayıklayıcısını işaret etmenin yararlı olacağını düşündüm: http://developer.apple.com/library/mac/#recipes/ xcode_help-debugger/articles/debugging_opengl_es_frame.html – GingerBreadMane

+0

@Shitesh - sorununuzu çözdünüz mü? – nbubis

cevap

11

Her doku nesnesi için glTexParameteri ayarlamayı unutmayın.

void loadTextures() { 
    GLint texture_object_handles[3]; 
    glGenTextures(3, texture_object_handles); 

    for (int i = 0 ; i < 3 ; ++i) { 
     glActiveTexture(GL_TEXTURE0 + i); 
     glBindTexture(GL_TEXTURE_2D, texture_object_handles[i]); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
     glTexImage2D(GL_TEXTURE_2D, ...); 
    } 
    return; 
} 


void draw() { 
    // Draw three different materials without rebinding any textures. 
    for (i = 0 ; i < 3 : ++i) { 
     ... specify other uniforms and attributes 
     glUniform1i(texture_location, i); 
     ... 
     glDrawElements(...); 
    } 
    return; 
}  
+0

MAG_FILTER için varsayılan ayarın GL_LINEAR olduğunu unutmayın, bu nedenle ayarlamanız gerekmez. – Tim

+0

Teşekkürler. Örneği daha özlü yapmak için değiştirdi. – umlum

İlgili konular