Skybox doku yapı kenar


12

Mac'te skybox dokusu çizerken garip bir sorunum var. İPhone'da her şey yolunda gidiyor. Yakın ve uzak uçakların değerini değiştirmeye çalıştım.

Altı dokudan oluşan bir gökyüzü kutusu ve her doku için bunu ayarladım:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

Sorun ne olabilir?

Ekran görüntüsü:

Skybox görünür skybox kenarları ile

DÜZENLE:

Dokudan kanamasını sağlamak için arka plan rengini kırmızıya ayarlamaya çalıştım

Ayrıca doku koordinatlarını buna değiştirmeye çalıştım:

float err_corr = 0.5 / TEXTURE_SIZE;

GLfloat vertices[24] = {    
        -1.0f - err_corr, -1.0f - err_corr,  1.0f + err_corr,
    1.0f + err_corr, -1.0f - err_corr,  1.0f + err_corr,
    -1.0f - err_corr,  1.0f + err_corr,  1.0f + err_corr,
    1.0f + err_corr,  1.0f + err_corr,  1.0f + err_corr,
    -1.0f - err_corr, -1.0f - err_corr, -1.0f - err_corr,
    1.0f + err_corr, -1.0f - err_corr, -1.0f - err_corr,
    -1.0f - err_corr,  1.0f + err_corr, -1.0f - err_corr,
    1.0f + err_corr,  1.0f + err_corr, -1.0f - err_corr,
    };

Ve kutu şu sırayla çizilir:
GLubyte indices[14] = {0, 1, 2, 3, 7, 1, 5, 4, 7, 6, 2, 4, 0, 1};

ÇÖZÜM:

Çözüm, küp haritasının kendisi için GL_CLAMP_TO_EDGE ayarlamaktır !

glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

Yanıtlar:


8

Her bir doku için GL_CLAMP_TO_EDGE ayarladığınızdan emin misiniz ? Bu, tek tek doku durumunun bir parçasıdır ve varsayılan olarak GL_REPEAT'dir, bu nedenle glBindTexture ile bağlandıktan sonra yapılması gerekir. Orijinal yazıda, kelimenin tam anlamıyla her doku için ayarladığınızı söylüyorum, ama kodun gerçekten neye benzediğini merak ediyorum?

Örneğin:

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

glBindTexture(GL_TEXTURE_2D, tex1);
//upload texture, etc.

glBindTexture(GL_TEXTURE_2D, tex2);
//upload texture, etc.

Bu aynı değildir:

glBindTexture(GL_TEXTURE_2D, tex1);
//upload texture, etc.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glBindTexture(GL_TEXTURE_2D, tex2);
//upload texture, etc.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

Hatayı buldum! Her küp haritasının dokusu için değil, cubemapp'ın kendisi için GL_CLAMP_TO_EDGE ayarlamak gerekliydi ! glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);veglTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
martin yastık

1

dokunun sol ve sağ tarafından '0.5f / texture_width' ve üstten ve alttan '0.5f / texture_wightth' girin. Örnekleme artefaktları görüyorsunuz - doku örnekleyicileri genellikle metinlerin ortasından örnek alıyorlar, bu nedenle sol ve sağ, üst ve altta (0 ve 1 uv'da), örnekleyicinizin sınırların dışına çıktığı her türlü texelin% ​​50'sini alıyorsunuz . Bu, dokunun diğer tarafı veya varsayılan bir örnekleme rengi.


Bu yüzden GL_CLAMP_TO_EDGEseti aldı, sınırların dışına çıkan numunelerin en yakın doku içi piksellerin değerini almasını sağlamalıdır. Açıkladığınız şey çok işe yarayabilir, ancak sorunun neden ilk başta orada olduğunu açıklamaz.
aaaaaaaaaaaa

Ben hiçbir değişiklik olmadan denedim: /
martin yastık

0

En iyi tahminim, MAC ve iPhone arasındaki farkın MAC'ta kenar yumuşatmasından kaynaklanıyor. 3D programım biraz paslı, ancak sanırım tüm kareleri aynı ağın bir parçası veya bunun gibi bir şey yapmak zorunda kalacaksınız.

Kirli hack çözümü, tüm kareleri biraz fazla büyük hale getirmek, böylece üst üste binmek ve birbirlerini klipslemek ve UV koordinatlarını buna göre ayarlamak olacaktır.


Hiçbir etki ile kenar yumuşatma (glDisable (GL_POLYGON_SMOOTH);) tarafından kapatmaya çalıştım. -1'den 1'e kadar olan formları ile üçgen şerit olarak skybox çiziyorum
martin yastık

1
Bana iyi geliyor. En azından şimdilik tahminlerimin dışındayım, ancak siyahın arka planın kanaması mı yoksa doku kenarı siyah mı olduğunu öğrenerek sorunu daraltmak isteyebilirsiniz. Eserin arkasına kırmızı bir poligon yerleştirirseniz, eserler rengini alacak mı?
aaaaaaaaaaaa

Duvarları genişletmeye çalışıyorum, bu yüzden örtüşüyorlar (tıpkı eBusiness'ın yazdığı gibi) - Bence 0.0001 yeterli olacak. UV koordinatlarını değiştirmek zorunda değilsiniz.
zacharmarz

1/10000 kesinlikle yeterli değil, sorunun büyüklüğü 1/4 ila 1/2 piksel aralığında görünüyor, bu nedenle doku boyutuna bağlı olarak, bunun çalışması için minimum büyüklük 1/1000 civarında olacaktır. UV koordinatlarını ayarlamamak biraz özensizdir, dokunun doğası göz önüne alındığında, ortaya çıkan görsel sıçrama fark edilmeyebilir, ancak yine de yanlış olur. Her durumda, hack'lerle ilgili daha fazla tavsiye, önceki yorumumda sorduğum sorunun cevabına bağlı olmalıdır.
aaaaaaaaaaaa

Artefakt, dokudan akan bir arka plan değildir. Değişiklik yapmadan arka plan rengini kırmızıya ayarladım. Ayrıca doku koordinatlarını genişletmeye çalıştım
martin yastık

0

Bu eski HW (veya belki iPhone'lar) cubemaps ile ilgili olağan bir sorundur. Kontrol edin

GL_ARB_seamless_cube_map

hw. Öyleyse. Sorun, kullanılarak kolayca çözülecektir.


Sorun iPhone'da değil GeForce 9400M'de. Bu uzantı benim için mevcut değil.
martin yastık

Bu, kesintisiz ya da olmasa da, kübik haritaların neden olduğu bir sorun DEĞİLDİR. Bu bir doku sarma sorunudur.
Tara

0

Altı doku, özellikle bir küp haritası olarak mı oluşturulmuş yoksa gökyüzü kutusu yüzlerinin her biri kendi dokularıyla ayrı olarak mı oluşturulmuş? Bazı erken PC sistemlerinin, küp kenarlarının işlenmesi söz konusu olduğunda oldukça zayıf bir filtrelemeye sahip olduğunu duydum , çünkü küp kenarlarının yakınında örneklediğinizde bir yüz dokusundan diğerine filtre uygulamamışlardı. AFAIK SGX (iphone GPU) kenarlar boyunca doğru filtreleme yapmalıdır.

Yan dokularınızın alt kısmının esere benzer bir mavi tonu olduğu bana geldi. Diyelim ki piksellerin alt sırasını (ya da birkaç satırını) korkunç bir eflatun gölgesi haline getirmeye çalışabilir ve bunun artefakt rengini değiştirip değiştirmediğini görebilir misiniz? Bu, neler olabileceği veya olmayabileceği hakkında biraz daha fikir verebilir.

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.