OpenGL - küplerin üzerinde beyaz kenarlar


12

Yaptığım minecraft benzeri bir oyunda, küplerimde beyaz kenarlar elde ediyorum:

resim açıklamasını buraya girin

Koyu dokularda çok daha belirgindir. Dokular şu şekilde kuruluyor: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

Herhangi bir yardım?


3
Her bir küpü nasıl oluşturduğunuz ve küpleri nasıl yerleştirdiğiniz hakkında bazı kodlar gösterebilir misiniz?
joncodo

1
Dokuları sarmak farklı bir şey yapar mı? Bağlandığınız doku neye / boyuta benziyor?
Chuck D

Sadece bunun küçük karolar kullanan büyük doku atlaslarında da görüldüğünü belirtmek istedim. Örnek olarak, 1024 * 1024 döşemelik / atlasınız olduğunu ve 32 * 32 döşemelerinizi kullandığınızı varsayalım. Bahsedilen döşemeye eşlenen ondalık nokta çok küçük bir çift olduğu için yuvarlama hataları alıyorsunuz. Bu, hassasiyeti neredeyse imkansız hale getirir. Bir çözüm? Fayans atlasını ayrı fayanslara ayırın. Minecraft'ın yaptığı veya yaptığı şey budur. Bir büyük fayans seti vardı ve çalışma zamanında onu bireysel dokulara ayırdılar.
Krythic

Yanıtlar:


19

Tam olarak hangi soruna bağlı olarak, bu tür bir sorunun iki olası nedeni vardır. Her ikisini de listeleyeceğim:

1. Karo kenarları boyunca dokudan diğer renkleri görüyorsunuz.

Bu bana bu durumda sorun gibi görünüyor, çünkü tüm kenar pikselleri dokunuzda makul bir şekilde bulunan üç renkten biri: beyaz, siyah ve kahverengi.

Tek bir dokuda (doku atlası) yan yana birden fazla döşeme görüntüsü kullanıyorsanız, yaptığınızı varsaydığım gibi, bu kaçınılmazdır. GPU, bir üçgenin kenarı boyunca enterpolasyonu doku boyunca enterpolasyonla mükemmel bir şekilde eşleştirmediği ve bitişik dokunun küçük bitlerini aldığınız için oluşur.

Yapabileceğiniz birkaç şey var.

  • Bir kullan dizi doku bir doku atlas yerine. Dizi dokusu, aynı boyutta 2B görüntülerden oluşur ve birini seçmek için üçüncü bir koordinat belirtirsiniz; filtreleme problemi olmadan doku atlaslarının yerine geçmesi amaçlanmıştır. Ancak, dizi dokuları kullandığınız OpenGL sürümünde bulunmayan daha yeni bir özelliktir.
  • Doku döşemelerinizin her birinde, bitişik normal pikselin rengini çoğaltan 1 piksellik bir kenarlık oluşturun. (Bu aslında GL'leri yeniden uyguluyorCLAMP[_TO_EDGE] , ancak doku atlaslarının farkında olan bir şekilde - kullanımınızın bir etkisi yoktur çünkü kiremit kenarlarınızın çoğu dokunun kenarında değildir.) Bu benim kendi girişimde kullandığım çözüm. tür, Küpler . Daha fazla doku belleği kullanması dışında belirli bir dezavantajı bilmiyorum.
  • Doku koordinatlarınızı çok hafifçe yerleştirin, böylece doku döşemesinin kenarına kadar gitmezler. Bunu çok fazla yapmak, ortadaki piksellere kıyasla dokunun kenarlarında belirgin bir inceliğe yol açacaktır.
  • Döşeme türü başına tek bir doku kullanın. Bu, doku değiştirme maliyetlerini da beraberinde getirir.

2. Fayanslar arasındaki boşlukları görüyorsunuz.

Bu durumda bu sorun olduğunu düşünmüyorum, çünkü boşluklar arasında yeşil bir zemin görülmüyor, ancak bunu tamlık için dahil ediyorum.

Bu, genellikle kayan nokta hatası nedeniyle ortaya çıkan bitişik döşemelerin toplantı kenarlarının köşeleri için tam olarak aynı koordinatları sağlamadığınız zaman ortaya çıkabilir . Örneğin, büyüklüğü 0.6 fayans varsa ve en karo sağ kenarını hesaplamak x=100ile (100*0.6) + 0.6ve en karo sol kenarı x=101ile (100*0.6), tam aynı cevabı almazsınız ve fark küçük lekeler halinde görünür olabilir boşluklar.

Çözüm, aritmetiğin tutarlı olmasını sağlamaktır; bunu yapmanın bazı yolları:

  • (Dolaylı olarak bile) bilgisayar olmadığınızdan index*size + size, yalnızca(index+1)*size .
  • Aritmetiğinizin kesin olduğundan emin olun; Bunu yapmanın en kolay yolu, karo boyutunuzu tam olarak 1.0 yapmaktır, bu da 32 bit şamandıralarla (başlangıçta 16 milyon bloğa kadar) hesaplamalarınızı yapsanız bile tamsayı aritmetiği ile sonuçlanır.
  • Tepe koordinat hesaplamaları için gerçek tamsayıları kullanın; bu size daha da fazla menzil sunar.

Bana boşluklar gibi geliyor - küçük ve keskin bitler göz önüne alındığında doku kanaması yok (yüksek çözünürlüklü bir doku olmadığı sürece).
Mario

Teşekkürler, doku koordinatlarını biraz eklemek onu düzeltiyor gibi görünüyor.
Luis Cruz

@Mario bunun EN YAKIN büyütme ile olduğunu varsayıyorum - karonun iç kısmındaki keskin kenarlığa dikkat edin. Bu açıdan, sonsuz çözünürlüklü bir doku.
Kevin Reid

Anahtarlama maliyetlerini önlemek için bir doku dizisi de kullanabilirsiniz.
danijar
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.