Artefak tekstur Skybox di tepi

12

Saya memiliki masalah aneh dengan menggambar tekstur skybox di Mac. Di iPhone semuanya baik-baik saja. Saya telah mencoba mengubah nilai pesawat dekat dan jauh tanpa hasil.

Ini adalah skybox dengan enam tekstur, dan untuk setiap tekstur saya atur ini:

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);

Apa yang bisa menjadi masalah?

Tangkapan layar:

Gambar langit dengan tepi langit terlihat

EDIT:

Saya telah mencoba mengatur warna latar belakang menjadi merah, untuk memastikan apakah warna tersebut berdarah melalui tekstur

Saya juga telah mencoba mengubah coords dari tekstur menjadi ini:

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,
    };

Dan kotak tersebut disusun dalam urutan ini:
GLubyte indices[14] = {0, 1, 2, 3, 7, 1, 5, 4, 7, 6, 2, 4, 0, 1};

LARUTAN:

Solusinya adalah dengan mengatur GL_CLAMP_TO_EDGE untuk cubemap itu sendiri!

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);
martin pilch
sumber

Jawaban:

8

Apakah Anda yakin telah menetapkan GL_CLAMP_TO_EDGE untuk setiap tekstur ? Ini adalah bagian dari status tekstur individual dan standarnya adalah GL_REPEAT, jadi ini perlu dilakukan setelah mengikat dengan glBindTexture. Saya menyadari dalam posting asli Anda benar-benar mengatakan bahwa Anda mengaturnya untuk setiap tekstur, tapi saya bertanya-tanya seperti apa sebenarnya kode itu?

Sebagai contoh:

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.

Ini tidak sama dengan:

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);
user_123abc
sumber
Saya telah menemukan kesalahan! Itu perlu untuk tidak mengatur GL_CLAMP_TO_EDGE untuk setiap tekstur peta kubus tetapi untuk cubemapp itu sendiri! glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);danglTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
martin pilch
1

sisipkan '0,5f / tekstur_width' dari sisi kiri dan kanan tekstur dan '0,5f / tekstur_tinggi' dari atas dan bawah. Anda melihat artefak pengambilan sampel - sampler tekstur biasanya sampel dari pusat texels sehingga di kiri dan kanan, atas dan bawah (pada 0 dan 1 uv) Anda mendapatkan 50% dari apa pun texel sampler Anda dapatkan ketika itu di luar batas . Entah itu sisi lain dari tekstur atau warna pengambilan sampel default.

Luther
sumber
Itu sebabnya ia mendapatkan GL_CLAMP_TO_EDGEhimpunan, seharusnya sampel yang keluar dari batas mengambil nilai piksel dalam tekstur terdekat. Apa yang Anda gambarkan mungkin bekerja dengan baik, tetapi itu tidak menjelaskan mengapa masalahnya ada di tempat pertama.
aaaaaaaaaaaa
Saya sudah mencobanya tanpa perubahan: /
martin pilch
0

Tebakan terbaik saya adalah bahwa perbedaan antara MAC dan iPhone disebabkan oleh antialiasing pada MAC. Pemrograman 3D saya agak berkarat, tapi saya kira Anda harus membuat semua bagian kotak dari mesh yang sama atau sesuatu seperti itu.

Solusi hack kotor akan membuat semua kotak sedikit terlalu besar sehingga mereka tumpang tindih dan klip satu sama lain dan menyesuaikan koordinat UV yang sesuai.

aaaaaaaaaaaa
sumber
Saya telah mencoba untuk mematikan anti-aliasing (oleh glDisable (GL_POLYGON_SMOOTH);) tanpa efek. Saya menggambar skybox sebagai strip segitiga dengan bentuk coord -1 hingga 1
martin pilch
1
Terdengar bagus untukku. Setidaknya untuk saat ini saya tidak dapat menebak, tetapi Anda mungkin ingin mempersempit masalahnya dengan mencari tahu apakah warna hitam itu adalah latar belakang yang berdarah atau tekstur tepi yang menunjukkan warna hitam. Jika Anda meletakkan poligon merah di suatu tempat di belakang artefak, akankah artefak mengambil warnanya?
aaaaaaaaaaaa
Saya ingin mencoba untuk memperpanjang dinding, sehingga tumpang tindih (seperti eBusiness menulis) - Saya pikir 0,0001 akan cukup. Anda tidak perlu mengubah koordinat UV.
zacharmarz
1/10000 tentu saja tidak cukup, besarnya masalah tampaknya berada dalam kisaran 1/4 hingga 1/2 piksel, jadi tergantung pada ukuran tekstur, besarnya minimum untuk ini untuk bekerja adalah sekitar 1/1000. Tidak menyesuaikan koordinat UV agak ceroboh, mengingat sifat tekstur lompatan visual yang dihasilkan mungkin tidak terlihat, tetapi masih akan salah. Bagaimanapun, saran lebih lanjut untuk peretasan harus bergantung pada jawaban atas pertanyaan yang saya tanyakan dalam komentar saya sebelumnya.
aaaaaaaaaaaa
Artefak bukanlah latar belakang yang berdarah melalui tekstur. Saya telah mengatur warna latar belakang menjadi merah tanpa perubahan. Saya juga mencoba memperluas koordinat tekstur
martin pilch
0

Ini adalah masalah biasa dengan cubemaps pada HW yang lebih lama (atau mungkin iPhone). Periksa untuk

GL_ARB_seamless_cube_map

ekstensi jika tersedia di hw Anda. Jika begitu. Masalah akan dipecahkan dengan menggunakannya.

Notabene
sumber
Masalahnya ada pada GeForce 9400M, bukan iPhone. Ekstensi ini tidak tersedia untuk saya.
martin pilch
Ini jelas BUKAN masalah yang disebabkan oleh cubemaps, terlepas dari mulus atau tidak. Ini adalah masalah pembungkus tekstur.
Tara
0

Apakah enam tekstur diatur, secara khusus, sebagai peta kubus atau masing-masing wajah skybox dirender secara terpisah dengan teksturnya sendiri? Saya mendengar beberapa sistem PC awal memiliki pemfilteran yang kurang baik dalam hal menangani cubemaps karena mereka tidak perlu menyaring dari dari satu tekstur permukaan ke permukaan berikutnya ketika Anda mengambil sampel di dekat tepi kubus. AFAIK SGX (iphone iphone) harus menyaring melintasi tepi dengan benar.

Terpikir oleh saya bahwa bagian bawah tekstur samping Anda terlihat seperti warna biru yang mirip dengan artefak. Bisakah Anda mencoba, katakanlah, membuat baris paling bawah (atau beberapa baris) piksel menjadi warna magenta yang mengerikan dan melihat apakah itu mengubah warna artefak? Itu mungkin memberikan beberapa gagasan tentang apa yang mungkin atau tidak mungkin terjadi.

Simon F
sumber