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.

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


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 .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.