GL_TEXTURE_WRAP) _ (S / T) 'yi değiştirmek ne işe yarar?


12

Bazı acemi OpenGL öğreticileri ile çalışıyorum ve mevcut olan basit bir dikdörtgene bir doku uygulamak öğretir. Öğretici devletler GL_TEXTURE_WRAP_S ve GL_TEXTURE_WRAP_T doku parametrelerini GL_CLAMP_TO_EDGE olarak ayarlamamı söylüyor, ancak bunun gerçekte ne yaptığından emin değilim. Haritalandıkları alandan daha büyük / küçük dokuların nasıl ele alındığına dair bir şey olduğunun farkındayım, ancak bunun gerçekte hangi davranışa neden olduğundan emin değilim. GL_CLAMP_TO_EDGE ne yapar ve bunun GL_CLAMP, GL_CLAMP_TO_BORDER, GL_REPEAT'tan farkı nedir? Şimdiden çok teşekkürler ve benim gibi bir aptal için görüntü sağlayabilirseniz bonus yardımseverlik.

Yanıtlar:


29

Peki S ve T sadece U ve V (veya isterseniz X ve Y) veya GLSL'de:

vec4.xyzw == vec4.rgba == vec4.strq

GL_REPEAT modu, (0,0) ila (1,1) aralığını geçtiğinizde tekrarlanan dokular içerir

GL_CLAMP_TO_EDGE modunda, kenardan düştüğünüzde dokular son pikselde durur.

GL_CLAMP ve GL_CLAMP_TO_BORDER, tüm doku kenarlıklarının 0 piksel olması gerektiğinden amortismana tabi tutulur, bu nedenle modlar artık anlamlı değildir. (GL3 civarında bir yere inanıyorum)

Daha fazla mod var, bu yüzden belgeleri okuduğunuzdan emin olun. (Örnekler: GL_MIRRORED_REPEAT, GL_MIRROR_CLAMP_TO_EDGE)


Http://www.flipcode.com/archives/Advanced_OpenGL_Texture_Mapping.shtml üzerinde bazı iyi örnekler var , işte bir önizleme:

Wrap S: GL_CLAMP / Wrap T: GL_CLAMP

kelepçe kelepçe

Wrap S: GL_CLAMP / Wrap T: GL_REPEAT

kelepçe tekrarı

Wrap S: GL_REPEAT / Wrap T: GL_CLAMP

kelepçeyi tekrarla

Wrap S: GL_REPEAT / Wrap T: GL_REPEAT

tekrar tekrar


Teşekkürler. Mükemmel cevap. GL_CLAMP_TO_EDGE ve GL_CLAMP arasında herhangi bir fark olup olmadığını ve sadece kullanılabilir alanı doldurmak için dokunun genişlemesini sağlamanın bir yolu olup olmadığını biliyor musunuz?
w4etwetewtwet

Açıklayamadığım için üzgünüm, CLAMP demek istediğim GL_CLAMP_TO_EDGE, GL_CLAMP modern OpenGL'de gitti. Bunu vurgulamak için cevabı düzenleyeceğim.
MickLH

"Genişletme" ye gelince, sadece dokuyu farklı bir aralığa gerdirmeyi kastediyorsanız, mesh parametrelemesi sırasında işlenmesi gerekir. (UV haritalama, sanatçıların işi) .. Eğer gerçekten pragmatik bir şekilde yapmanız gerekiyorsa, gölgelendiricide kullanmak için kendi formülünüzü yazmanız gerekir. (Ya da uygulamanız zaten çok eskiyse GL_TEXTURE matrisini tahmin ediyorum: P)
MickLH

4

İşte bir ekstresi olan glTexParameter OpenGL Referans sayfası daha kolay okunması için biraz biçimlendirilmiş 2014/02/07 itibariyle:

GL_TEXTURE_WRAP_S

Doku koordinatları s için sarma parametresini GL_CLAMP_TO_EDGE, GL_CLAMP_TO_BORDER, GL_MIRRORED_REPEAT, GL_REPEAT veya GL_MIRROR_CLAMP_TO_EDGE olarak ayarlar.

  • GL_CLAMP_TO_EDGE , s koordinatlarının aralığa kelepçelenmesine neden olur Aralık; burada N , kenetleme yönünde dokunun boyutudur.

  • GL_CLAMP_TO_BORDER , s koordinatlarını GL_CLAMP_TO_EDGE ile benzer şekilde değerlendirir .
    Bununla birlikte, GL_CLAMP_TO_EDGE modunda kelepçelemenin gerçekleşeceği durumlarda, getirilen texel verileri GL_TEXTURE_BORDER_COLOR tarafından belirtilen değerlerle değiştirilir.

  • GL_REPEAT , s koordinatının tamsayı bölümünün yok sayılmasına neden olur ;
    GL sadece kesirli kısmı kullanır, böylece tekrar eden bir desen oluşturur.

  • GL_MIRRORED_REPEAT , eğer s tam sayı kısmı eşitse , s koordinatının doku koordinatının kesirli kısmına ayarlanmasına neden olur ; s tamsayı kısmı tek ise, o zaman ayarlanır koordinat doku s burada, kesirli kısmını temsil s .1 çatlatmafrac

  • GL_MIRROR_CLAMP_TO_EDGE , dokunun koordinatının GL_CLAMP_TO_EDGE'deki gibi kelepçeleneceği noktada doku koordinasyonu için s koordinatının GL_MIRRORED_REPEAT için olduğu gibi tekrarlanmasına neden olur .

Başlangıçta, GL_TEXTURE_WRAP_S olarak ayarlanır GL_REPEAT .

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.