Apa yang dilakukan dengan mengubah GL_TEXTURE_WRAP) _ (S / T)?

11

Saya sedang mengerjakan beberapa tutorial OpenGL pemula, dan yang sekarang mengajarkan cara menerapkan tekstur ke persegi panjang sederhana. Status tutorial memberitahu saya untuk mengatur parameter tekstur GL_TEXTURE_WRAP_S dan GL_TEXTURE_WRAP_T ke GL_CLAMP_TO_EDGE, namun saya tidak yakin apa sebenarnya ini. Saya sadar ini ada hubungannya dengan bagaimana tekstur lebih besar / lebih kecil daripada ruang mereka dipetakan ditangani, tapi saya tidak yakin apa perilaku ini sebenarnya menyebabkan. Apa yang GL_CLAMP_TO_EDGE lakukan, dan apa bedanya dengan GL_CLAMP, GL_CLAMP_TO_BORDER, GL_REPEAT? Terima kasih banyak sebelumnya, dan bonus bermanfaat jika Anda dapat memberikan gambar untuk orang idiot seperti saya.

w4etwetewtwet
sumber

Jawaban:

29

Nah S dan T hanya berarti U dan V (atau X dan Y jika Anda suka), atau dalam GLSL:

vec4.xyzw == vec4.rgba == vec4.strq

Mode GL_REPEAT memiliki tekstur berulang ketika Anda melewati rentang (0,0) hingga (1,1)

Mode GL_CLAMP_TO_EDGE memiliki tekstur berhenti pada piksel terakhir ketika Anda jatuh dari tepi.

GL_CLAMP dan GL_CLAMP_TO_BORDER disusutkan karena semua batas tekstur harus 0 piksel, sehingga mode tidak masuk akal lagi. (sekitar GL3 saya percaya)

Ada lebih banyak mode jadi pastikan untuk membaca dokumen. (Contoh: GL_MIRRORED_REPEAT, GL_MIRROR_CLAMP_TO_EDGE)


Ada beberapa contoh yang bagus di http://www.flipcode.com/archives/Advanced_OpenGL_Texture_Mapping.shtml , ini adalah pratinjau:

Bungkus S: GL_CLAMP / Bungkus T: GL_CLAMP

clamp clamp

Bungkus S: GL_CLAMP / Bungkus T: GL_REPEAT

penjepit ulangi

Bungkus S: GL_REPEAT / Bungkus T: GL_CLAMP

ulangi penjepit

Bungkus S: GL_REPEAT / Bungkus T: GL_REPEAT

ulangi ulangi

MickLH
sumber
Terima kasih. Jawaban yang bagus Apakah Anda tahu jika ada perbedaan antara GL_CLAMP_TO_EDGE dan GL_CLAMP, dan jika ada hanya mendapatkan tekstur untuk memperluas untuk mengisi ruang yang tersedia?
w4etwetewtwet
Maaf karena tidak mengklarifikasi, di mana saya katakan CLAMP maksud saya GL_CLAMP_TO_EDGE, GL_CLAMP hilang di OpenGL modern. Saya akan mengedit jawaban untuk menekankan itu.
MickLH
Adapun "memperluas" jika Anda hanya bermaksud meregangkan tekstur ke rentang yang berbeda, yang harus ditangani selama parameterisasi mesh. (Pemetaan UV, pekerjaan seniman) .. Jika Anda benar-benar harus melakukannya secara pragmatis maka Anda harus menulis rumus sendiri untuk digunakan dalam shader. (Atau saya kira matriks GL_TEXTURE jika aplikasi Anda sudah sangat ketinggalan jaman: P)
MickLH
3

Berikut adalah kutipan dari halaman Referensi OpenGL pada glTexParameter pada 2014/02/07, diformat sedikit untuk lebih mudah dibaca:

GL_TEXTURE_WRAP_S

Setel parameter bungkus untuk koordinat tekstur s menjadi GL_CLAMP_TO_EDGE, GL_CLAMP_TO_BORDER, GL_MIRRORED_REPEAT, GL_REPEAT, atau GL_MIRROR_CLAMP_TO_EDGE.

  • GL_CLAMP_TO_EDGE menyebabkan koordinat s akan dijepit ke kisaran jarak, di mana N adalah ukuran tekstur ke arah penjepitan.

  • GL_CLAMP_TO_BORDER mengevaluasi koordinat s dengan cara yang mirip dengan GL_CLAMP_TO_EDGE.
    Namun, dalam kasus di mana penjepitan akan terjadi dalam mode GL_CLAMP_TO_EDGE, data texel yang diambil diganti dengan nilai yang ditentukan oleh GL_TEXTURE_BORDER_COLOR.

  • GL_REPEAT menyebabkan bagian integer dari koordinat s diabaikan;
    GL hanya menggunakan bagian fraksional, sehingga menciptakan pola berulang.

  • GL_MIRRORED_REPEAT menyebabkan koordinat s diatur ke bagian fraksional dari koordinat tekstur jika bagian integer dari s adalah genap; jika bagian integer dari s adalah ganjil, maka koordinat tekstur s diatur ke 1-frac, di mana Fracmerupakan bagian pecahan dari s .

  • GL_MIRROR_CLAMP_TO_EDGE menyebabkan koordinat s diulang seperti untuk GL_MIRRORED_REPEAT untuk satu pengulangan tekstur, di mana titik koordinat harus dijepit seperti pada GL_CLAMP_TO_EDGE.

Awalnya, GL_TEXTURE_WRAP_S diatur ke GL_REPEAT .

usap
sumber