Bir fayans seti görüntüsünden fayans çizerek tilemaps çizen bir 2D oyun motorum var. Varsayılan olarak OpenGL GL_REPEAT
sadece bir kısmını değil tüm dokuyu ( ) sarayabileceğinden, her bir karo ayrı bir dokuya bölünür. Daha sonra aynı döşemenin bölgeleri birbirine bitişik hale getirilir. Amaçlandığı gibi çalışırken şöyle görünür:
Bununla birlikte, kesirli ölçeklemeyi uygulamaya koyar koymaz dikişler görünür:
Bu neden oluyor? Bunun, dörtlülerin sınırlarını karıştıran doğrusal filtrelemeden kaynaklandığını düşündüm, ancak yine de nokta filtrelemeyle oluyor. Şimdiye kadar bulduğum tek çözüm, tüm konumlandırma ve ölçeklendirmenin yalnızca tamsayı değerlerde gerçekleşmesini sağlamak ve nokta filtrelemeyi kullanmaktır. Bu, oyunun görsel kalitesini düşürebilir (özellikle alt piksel konumlandırması artık çalışmaz, bu nedenle hareket o kadar düzgün değildir).
Denediğim / düşündüğüm şeyler:
- kenar yumuşatma dikişleri azaltır, ancak tamamen ortadan kaldırmaz
- mipmaplemeyi kapatmanın hiçbir etkisi yoktur
- her döşemeyi ayrı ayrı işleyin ve kenarları 1 piksel ekstrüde edin - ancak bu, bir seferde fayans bölgelerini oluşturamayacağından ve saydamlık alanlarının kenarları boyunca başka eserler oluşturduğundan bir de-optimizasyon.
- kaynak görüntülerin etrafına 1 piksellik bir kenarlık ekleyin ve son pikselleri tekrarlayın - ancak artık ikisinin gücü değil, NPOT desteği olmayan sistemlerde uyumluluk sorunlarına neden oluyor
- döşenmiş görüntüleri işlemek için özel bir gölgelendirici yazmak - ama sonra farklı ne yapardınız?
GL_REPEAT
pikseli görüntünün karşı tarafından kenarlardan tutmalı ve saydamlık almamalıdır. - geometri tam olarak bitişiktir, kayan nokta yuvarlama hatası yoktur.
- fragman gölgelendiricisi aynı rengi döndürmek için sabit kodlanmışsa , dikişler kaybolur .
- dokular olarak belirlendiyse
GL_CLAMP
yerineGL_REPEAT
, dikişleri kaybolur (render yanlış olsa da). - dokular olarak belirlendiyse
GL_MIRRORED_REPEAT
, dikişler kaybolur (render yine yanlış olmasına rağmen). - arka planı kırmızı yaparsam, dikişler hala beyazdır. Bu, şeffaflıktan ziyade opak beyazdan bir örneklem aldığını gösterir.
Böylece dikişler sadece GL_REPEAT
ayarlandığında görünür . Herhangi bir nedenle sadece bu modda, geometrinin kenarlarında bir miktar kanama / sızıntı / şeffaflık vardır. Nasıl olabilir? Tüm doku opaktır.
GL_NEAREST
örnekleme ile 3B dokular R
da bu senaryoda çoğu şey için dizi dokularının yanı sıra çalışır . Mipmapleme işe yaramayacaktır, ancak uygulamanıza bakarak muhtemelen mipmap'lara ihtiyacınız yoktur.