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:
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);
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);
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.
sumber
GL_CLAMP_TO_EDGE
himpunan, 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.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.
sumber
Ini adalah masalah biasa dengan cubemaps pada HW yang lebih lama (atau mungkin iPhone). Periksa untuk
ekstensi jika tersedia di hw Anda. Jika begitu. Masalah akan dipecahkan dengan menggunakannya.
sumber
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.
sumber