Mengapa dimungkinkan untuk menemukan koordinat tekstur yang lebih besar dari 1 atau kurang dari 0

11

Saya mempelajari teks tentang texture mappingdan dalam preparing to drawsesi ini, saya membaca:

Tentukan parameter pembungkus tekstur. Ini akan mengontrol apa yang terjadi ketika tekstur berkoordinasi lebih besar dari 1,0 atau kurang dari 0,02 dijumpai:

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

di mana wrap adalah:
GL_REPEAT: menetapkan bahwa pola ini akan berulang (yaitu wrap-around) jika ditemui koordinat tekstur yang kurang dari 0,0 atau lebih besar dari 1,0.

GL_CLAMP: menentukan bahwa pola akan "menempel" ke nilai pada 0,0 atau 1,0.

Tetapi tidak ada penjelasan apa alasan menemukan koordinat tekstur seperti itu?
Sebagai contoh misalkan saya baru saja menggambar persegi panjang dan saya ingin menerapkan gambar sebagai tekstur di atasnya, apakah mungkin untuk menemukan koordinat seperti itu?

Sepideh Abadpour
sumber

Jawaban:

5

Tidak semua tekstur menggunakan koordinat tekstur yang berasal dari data mesh. Misalnya, dengan tekstur projektif , Anda mengubah dunia menjadi ruang tekstur. Ya, banyak dari dunia itu berada di luar rentang tekstur [0, 1]. Tanpa semacam mode penjepitan di tempat, Anda akan mendapatkan masalah.

Nicol Bolas
sumber
10

Tepatnya, untuk mengulang suatu tekstur.

Jadi, jika Anda memiliki quad, dan koordinat tekstur berubah dari 0 menjadi 1, tekstur akan digambar satu kali. Jika koordinat beralih dari 0 ke 2 dan membungkus diatur ke GL_REPEAT, maka tekstur akan digambar dua kali.

Cobalah dan lihat sendiri

Piyama Panda
sumber
ok @Panda Pyjama jadi untuk kode seperti ini: float x0 = 0; // sudut kiri atas float gambar y0 = 0; float x1 = x0 + ImageWidth; // sudut kanan bawah float gambar y1 = y0 + ImageHeight; glBegin (GL_TRIANGLE_STRIP); {glTexCoord2f (0, 1); glVertex2f (x0, y1); glTexCoord2f (0, 0); glVertex2f (x0, y0); glTexCoord2f (1, 1); glVertex2f (x1, y1); glTexCoord2f (1, 0); glVertex2f (x1, y0); } tidak ada kemungkinan untuk menemukan koordinat tekstur di luar interval (0,1)?
Sepideh Abadpour
1
@sepideh: Tentu saja tidak. Anda secara khusus menyimpan koordinat tekstur pada rentang [0, 1]. Apa yang tidak Anda mengerti adalah bahwa Anda tidak harus ; Anda bisa membuat mereka apa saja. Juga, jangan memposting banyak kode dalam komentar. Jika Anda ingin klarifikasi, edit pertanyaan Anda.
Nicol Bolas
ok terima kasih atas panduan Anda tentang meneruskan kode ke pertanyaan saya. Saya sedang mencari cara untuk memformat kode dalam perintah tetapi tidak dapat menemukannya !!! Jadi maksud Anda menemukan koordinat seperti itu bukanlah peristiwa run-time yang mungkin. Itu hanya ditentukan oleh programmer dengan jelas untuk mengulangi tekstur atau tidak.
Sepideh Abadpour
1
@sepideh Apa yang dimaksud dengan "bukan acara run-time possible"? Sangat baik untuk mengubah kode Anda di komentar untuk memiliki glTexCoord2f(0, 2);misalnya. Ini memiliki arti yang didefinisikan dengan sangat spesifik baik dalam kode dan ketika program sedang berjalan. Jika Anda melihat ini, programmer sengaja melakukannya karena memberikan hasil yang mereka inginkan.
Joseph Mansfield
2
@sepideh Tentu saja. OpenGL menggunakan nilai apa pun yang Anda berikan. Jika Anda memberinya nilai dalam rentang 0 hingga 1, Anda tidak akan pernah mendapatkan yang lain.
Joseph Mansfield
5

Ya, Anda dapat menemukan koordinat tekstur lebih besar dari 1.0dan lebih kecil dari 0.0.

Ini tergantung sepenuhnya pada model, Anda memuat. Biasanya, untuk setiap simpul ada posisi, koordinat normal, dan tekstur disimpan. Dalam sebagian besar format file mesh, koordinat tekstur tidak terbatas pada rentang apa pun.

Ini digunakan untuk mengulang suatu tekstur . Misalnya, untuk rentang tekstur empat waktu antara quad simpul, koordinat tekstur akan 0,0, 0,4, 4,0dan 4,4. Tanpa pembungkus tekstur, Anda akan perlu simpul tambahan untuk membagi permukaan menjadi 4 kali 4 sub permukaan dengan masing-masing koordinat tekstur 0,0, 0,1, 1,0, 1,1. Lebih sedikit simpul menghasilkan kinerja rendering yang lebih baik.

Biasanya, tidak diinginkan bahwa pengguna memperhatikan tepi tekstur berulang. Oleh karena itu, tekstur berulang dapat ubin dalam banyak kasus. Daripada berarti, tepi kanan memudar mulus ke kiri dan tepi atas ke bawah. Dengan cara ini, transisinya mulus dan mudah-mudahan tidak diperhatikan oleh pengguna.

Topik yang lebih maju, tetapi terkait, untuk mengaburkan fakta bahwa tekstur yang sama diulang berkali-kali. Misalnya, memadukan tekstur berulang dengan ukuran yang berbeda, misalnya tekstur dinding dan stiker tanah, adalah teknik yang umum.

danijar
sumber
Without texture wrapping, you would need additional vertices to split the surface into 4 times 4 sub surfaces with each the texture coordinates 0,0, 0,1, 1,0, 1,1Itulah beberapa penjelasan praktis yang nyata! Terima kasih!
Amit Tomar