Parça gölgelendiricideki doku koordinatını hesaplarken dokulara erişmek neden daha yavaş?


11

GLSL'de dokuları kullanırken, tepe gölgelendiricideki son doku koordinatlarını hesaplamak ve bunları varyings kullanarak parça gölgelendiriciye teslim etmek en iyisidir . Y koordinatında basit bir çevirme ile örnek:

// Vertex shader
attribute vec2 texture;
varying highp vec2 texCoord;
// ...
void main() {
    texCoord = vec2(texture.x, 1.0-texture.y);
    // ...
}

// Fragment shader
varying highp vec2 textureCoordinates;
uniform sampler2D tex;
// ...
void main() {
    highp vec4 texColor = texture2D(tex, texCoord);
    // ...
}

vec2(0.5)Parça koordinatında y koordinatındaki kapak veya doku koordinatına ekleme gibi daha basit bir işlem gerçekleştirilirse, doku erişimi çok daha yavaştır. Neden?


Not olarak, örneğin iki dokuyu harmanlamak, bunların ağırlıklı bir toplamını kullanmak, zaman açısından çok daha ucuzdur ve her piksel için de yapılması gerekir, bu nedenle doku koordinatının hesaplanması o kadar pahalı görünmemektedir.


1
Tahminimce UV kabloları VS olarak hesaplanırsa, doku birimi PS başlarken bunları önceden getirmeye başlayabilir. PS'de hesaplanırlarsa, önce doku birimi beklemek zorundadır.
RichieSams

2
Aramanıza yardımcı olması durumunda buna "bağımlı doku okuması" denir.
Alan Wolfe

Mükemmel farkı gösteren bazı ölçümleriniz var mı? Aslında çok fazla fark olmasını beklemiyordum; doku getirme gecikmesi birkaç ALU opsiyonu değiştirmelidir. BTW, bağımlı doku okumaları iki (veya daha fazla) doku okumasının olduğu yerlerdir, ikincinin koordinatları birincinin çıktısına bağlıdır. Bunlar, iki doku okuması arasında gereken katı sıralama nedeniyle daha yavaştır.
Nathan Reed

Parça gölgelendiricide yapılan herhangi bir işlem, tepe gölgelendiricisinden daha pahalı olacaktır. Her üçgen, bir tepe gölgelendiricisinin 3 çağrısını alır, ancak ekran boyutuna bağlı olarak parça gölgelendiricisinin daha fazla çağrılması büyüklüğünde olabilir.
glampert

@NathanReed "Bağımlı doku okumalarını" yalnızca önceki doku erişiminden gelenlerle sınırlamanız gerektiğini düşünmüyorum. Muhtemelen, tepe özelliklerinin doğrusal (iyi, hiperbolik hiperbolik) enterpolasyonundan tespit edilebilenlerin aksine, parça gölgelendiricide hesaplanan koordinatları da içerirdim.
Simon F

Yanıtlar:


11

Bahsettiğiniz şey, mobil geliştirme topluluğunda yaygın olarak "bağımlı doku okumaları" olarak adlandırılır. Bu, belirli donanımların bir uygulama detayıdır ve bu nedenle GPU'ya herhangi bir performans etkisi olup olmadığı konusunda bağlıdır. Açıkça hem sözü edilen bu yana Genellikle bu, Apple donanım PowerVR GPU için yetişmiş bkz şey Imagination ve Appledokümantasyon. Doğru hatırlıyorsam, sorun temel olarak GPU'daki parça gölgelendirici çalışmaya başlamadan önce dokuları getirmeye başlayacak donanımdan geldi, böylece gecikmeyi gizlemek daha iyi bir iş yapabilirdi. Bağladığım dokümanlar artık Series6 donanımında bir sorun olmadığını belirtti, bu yüzden en azından yeni Apple donanımında endişelenmeniz gereken bir şey değil. Dürüst olmak gerekirse diğer mobil GPU'lardan emin değilim, çünkü bu benim uzmanlık alanım değil. Emin olmak için belgelerine bakmaya çalışmalısınız.

Bu konuda bazı Google aramaları yapmaya karar verirseniz, muhtemelen eski masaüstü donanımında bağımlı doku getirmeleri hakkında konuşan bazı eski malzemeler bulacağınızı unutmayın. Piksel / fragman gölgelendiricilerinin ilk günlerinde bazik olan "bağımlı doku alımı" terimi, önceki doku alımına dayanan bir UV adresi kullanmaktadır. Klasik örnek, çevre haritasını örneklemek için normal haritaya dayalı bir yansıma vektörü kullanmak istediğiniz, çarpık eşlemeli ortam haritası oluşturmadır. Bu eski donanımda bazı önemli performans etkileri vardı ve bence çok eski bazı GPU'larda bile desteklenmedi. Modern GPU'lar ile donanım ve gölgelendirici ISA çok daha genelleştirilmiş ve bu nedenle performans durumu çok daha karmaşık.


Bu arada: Bunu bir iPad 3'te yaşadım. Belki de bu aslında donanıma özgüdür.
Nero
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.