1'den büyük veya 0'dan küçük bir doku koordinatıyla karşılaşmak neden mümkün


11

Hakkında bir metin okuyorum texture mappingve preparing to drawoturumda okudum:

Doku sarma parametrelerini tanımlayın. Bu, 1.0'dan büyük veya 0.0'dan küçük bir doku koordinatı ile karşılaşıldığında ne olacağını kontrol eder:

glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,wrap);  
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,wrap);  

burada sarma:
GL_REPEAT: 0.0'dan küçük veya 1.0'dan büyük dönüştürülmüş doku koordinatları ile karşılaşılırsa, bu desenin tekrarlanacağını (yani etrafına sarılacağını) belirtir.

GL_CLAMP: desenin 0.0 veya 1.0 değerine "yapışacağını" belirtir.

Fakat böyle bir doku koordinatıyla karşılaşma nedeninin ne olduğuna dair bir açıklama yok mu?
Örneğin, sadece bir dikdörtgen çizdiğimi ve üzerine bir doku olarak bir görüntü uygulamak istediğimi varsayalım, bu tür koordinatlarla karşılaşmak mümkün mü?

Yanıtlar:


5

Tüm dokular, kafes verilerinden gelen doku koordinatlarını kullanmaz. Örneğin, yansıtmalı tekstüre ile dünyayı doku alanının içine dönüştürürsünüz. O dünyanın çoğu dokudaki [0, 1] aralık dışında kalıyor. Bir tür kelepçeleme modu olmadan, sorun yaşayacaksınız.


10

Bir dokuyu tekrarlamak için.

Yani, bir dörtlü varsa ve doku koordinatları 0'dan 1'e giderse, doku bir kez çizilir. Koordinatlar 0'dan 2'ye gider ve sarma ayarlanırsa GL_REPEAT, doku iki kez çizilir.

Deneyin ve kendiniz görün


ok @Panda Pyjama şöyle bir kod için: float x0 = 0; // görüntü kayan reklamının sol üst köşesi y0 = 0; float x1 = x0 + ImageWidth; // görüntü kayan reklamının sağ alt köşesi y1 = y0 + ImageHeight; glBegin (GL_TRIANGLE_STRIP); {glTexCoord2f (0, 1); glVertex2f (x0, yl); glTexCoord2f (0, 0); glVertex2f (x0, y0); glTexCoord2f (1, 1); glVertex2f (x1, y1); glTexCoord2f (1, 0); glVertex2f (x1, y0); } (0,1) aralığının ötesinde doku koordinatlarıyla karşılaşma imkanı yok mu?
Sepideh Abadpour

1
@sepideh: Elbette hayır. Sen Özellikle aralık [0, 1] üzerindeki doku koordinatları tuttu. Ne anlamıyorum böyle olduğunu gerekmez ; Onlara bir şey yapabilirdin. Ayrıca, yorumlarda bir grup kod yayınlamayın. Açıklama yapmak istiyorsanız, sorunuzu düzenleyin.
Nicol Bolas

tamam sorularıma kod geçirme konusunda rehberlik için teşekkürler. Komutlarda kodları biçimlendirmek için bir yol arıyordum ama bulamadım !!! Yani bu tür koordinatlarla karşılaşmak, çalışma zamanı olası bir olay değildir. Dokuyu tekrarlamak veya kopyalamamak için programcı tarafından açıkça belirtilmiştir.
Sepideh Abadpour

1
@sepideh "Çalışma zamanı olası bir olay değil" ne anlama geliyor? Yorumdaki kodunuzu glTexCoord2f(0, 2);örneğin olması için mükemmel şekilde değiştirebilirsiniz . Bu, hem kodda hem de program çalışırken çok iyi tanımlanmış bir anlama sahiptir. Bunu görürseniz, programcı isteyerek sonuç verdiğinden bunu kasıtlı olarak yapmıştır.
Joseph Mansfield

2
@sepideh Elbette. OpenGL, verdiğiniz değerleri kullanır. 0 ile 1 aralığında değerler verirseniz, asla başka bir şey elde edemezsiniz.
Joseph Mansfield

5

Evet, daha büyük 1.0ve daha küçük doku koordinatları ile karşılaşabilirsiniz 0.0.

Bu tamamen yüklediğiniz modele bağlıdır. Normalde, her köşe için konum, normal ve doku koordinatı depolanır. Çoğu kafes dosyası biçiminde, doku koordinatı hiçbir aralıkla sınırlı değildir.

Bu, bir dokuyu tekrarlamak için kullanılır . Örneğin, köşe bir dörtlü arasında bir doku dört zaman aralığı için, doku koordinatları olur 0,0, 0,4, 4,0ve 4,4. Doku sarma olmadan, her doku koordinatları ile 4 kez içine 4 alt yüzeyleri yüzey bölmek ek köşe noktaları gerekir 0,0, 0,1, 1,0, 1,1. Daha az köşe, daha iyi oluşturma performansı sağlar.

Tipik olarak, kullanıcının tekrarlanan bir dokunun kenarlarını fark etmesi istenmez. Bu nedenle, tekrarlanan dokular çoğu durumda tileable. Daha doğrusu, sağ kenar sol tarafa ve üst kenar alt tarafa doğru kaybolur. Bu şekilde geçiş pürüzsüzdür ve umarım kullanıcı tarafından fark edilmez.

Daha gelişmiş, ancak ilgili bir konu, aynı dokunun birçok kez tekrarlandığı gerçeğini akıllıca gizlemektir. Örneğin, örneğin bir duvar dokusu ve bir kir çıkartması gibi farklı boyutlarda tekrarlanan dokuların harmanlanması yaygın bir tekniktir.


Without texture wrapping, you would need additional vertices to split the surface into 4 times 4 sub surfaces with each the texture coordinates 0,0, 0,1, 1,0, 1,1Bu gerçek bir pratik açıklama! Teşekkürler!
Amit Tomar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.