การเปลี่ยนแปลง GL_TEXTURE_WRAP) _ (S / T) ทำอะไร


12

ฉันกำลังทำงานผ่านบทช่วยสอนสำหรับผู้เริ่มต้น OpenGL และปัจจุบันสอนวิธีใช้พื้นผิวกับสี่เหลี่ยมผืนผ้าอย่างง่าย สถานะการสอนบอกให้ฉันตั้งค่าพารามิเตอร์พื้นผิว GL_TEXTURE_WRAP_S และ GL_TEXTURE_WRAP_T เป็น GL_CLAMP_TO_EDGE แต่ฉันไม่แน่ใจว่าสิ่งนี้ทำอะไรได้จริง ฉันรู้ว่ามันเป็นเรื่องเกี่ยวกับการจัดการพื้นผิวที่มีขนาดใหญ่กว่า / เล็กกว่าพื้นที่ที่พวกเขาถูกแมปลงบน แต่ฉันไม่แน่ใจว่าพฤติกรรมนี้เกิดขึ้นจริงได้อย่างไร GL_CLAMP_TO_EDGE ทำอะไรและแตกต่างจาก GL_CLAMP, GL_CLAMP_TO_BORDER, GL_REPEAT อย่างไร ขอบคุณมากล่วงหน้าและโบนัสความช่วยเหลือหากคุณสามารถให้ภาพสำหรับคนงี่เง่าเช่นฉัน

คำตอบ:


29

S และ T หมายถึง U และ V (หรือ X และ Y หากคุณต้องการ) หรือใน GLSL:

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

โหมด GL_REPEAT มีพื้นผิวซ้ำเมื่อคุณผ่านช่วง (0,0) ถึง (1,1)

โหมด GL_CLAMP_TO_EDGE มีพื้นผิวหยุดที่พิกเซลสุดท้ายเมื่อคุณหลุดจากขอบ

GL_CLAMP และ GL_CLAMP_TO_BORDER ถูกคิดค่าเสื่อมราคาเนื่องจากขอบพื้นผิวทั้งหมดต้องเป็น 0 พิกเซลดังนั้นโหมดจึงไม่สมเหตุสมผลอีกต่อไป (เชื่อว่าอยู่แถว ๆ GL3)

มีโหมดเพิ่มเติมดังนั้นโปรดอ่านเอกสาร (ตัวอย่าง: GL_MIRRORED_REPEAT, GL_MIRROR_CLAMP_TO_EDGE)


มีตัวอย่างที่ดีบางอย่างในhttp://www.flipcode.com/archives/Advanced_OpenGL_Texture_Mapping.shtmlนี่คือตัวอย่าง:

Wrap S: GL_CLAMP / Wrap T: GL_CLAMP

ที่หนีบ

Wrap S: GL_CLAMP / Wrap T: GL_REPEAT

หนีบซ้ำ

Wrap S: GL_REPEAT / Wrap T: GL_CLAMP

หนีบซ้ำ

Wrap S: GL_REPEAT / Wrap T: GL_REPEAT

ทำซ้ำทำซ้ำ


ขอบคุณ คำตอบที่ดี คุณรู้หรือไม่ว่ามีความแตกต่างระหว่าง GL_CLAMP_TO_EDGE และ GL_CLAMP หรือไม่และหากมีเพียงการเพิ่มพื้นผิวเพื่อขยายพื้นที่ว่างให้เต็ม?
w4etwetewtwet

ขออภัยที่ไม่อธิบายที่ฉันพูดว่า CLAMP ฉันหมายถึง GL_CLAMP_TO_EDGE, GL_CLAMP หายไปใน OpenGL ที่ทันสมัย ฉันจะแก้ไขคำตอบเพื่อเน้นว่า
MickLH

สำหรับ "การขยาย" ถ้าคุณหมายถึงการขยายพื้นผิวให้อยู่ในช่วงที่แตกต่างกันนั้นควรจัดการในระหว่างการกำหนดพารามิเตอร์ตาข่าย (การทำแผนที่ UV งานศิลปิน) .. ถ้าคุณต้องทำอย่างจริงจังคุณจะต้องเขียนสูตรของคุณเองเพื่อใช้ใน shader (หรือฉันเดาว่าเมทริกซ์ GL_TEXTURE หากแอปของคุณล้าสมัยไปแล้วอย่างรุนแรงแล้ว: P)
MickLH

4

นี่คือส่วนแยกของหน้าการอ้างอิงของOpenGL ใน glTexParameter ตั้งแต่วันที่ 2014/02/50 ซึ่งได้รับการจัดรูปแบบให้อ่านง่ายขึ้น:

GL_TEXTURE_WRAP_S

ตั้งค่าพารามิเตอร์การตัดสำหรับการประสานพื้นผิวsเป็น GL_CLAMP_TO_EDGE, GL_CLAMP_TO_BORDER, GL_MIRRORED_REPEAT, GL_REPEAT หรือ GL_MIRROR_CLAMP_TO_EDGE

  • GL_CLAMP_TO_EDGEทำให้พิกัดของ sถูกจับไปที่ช่วงพิสัยโดยที่Nคือขนาดของพื้นผิวในทิศทางของการจับยึด

  • GL_CLAMP_TO_BORDERประเมินsพิกัดในลักษณะที่คล้ายคลึงกับ GL_CLAMP_TO_EDGE
    อย่างไรก็ตามในกรณีที่มีการหนีบเกิดขึ้นในโหมด GL_CLAMP_TO_EDGE ข้อมูลเท็กเซลที่ถูกดึงข้อมูลจะถูกแทนที่ด้วยค่าที่ระบุโดย GL_TEXTURE_BORDER_COLOR

  • GL_REPEATทำให้ส่วนจำนวนเต็มของพิกัดsถูกละเว้น
    GL ใช้เฉพาะส่วนที่เป็นเศษส่วนเท่านั้นดังนั้นจึงสร้างรูปแบบการทำซ้ำ

  • GL_MIRRORED_REPEATทำให้พิกัดของ sถูกตั้งค่าเป็นส่วนที่เศษส่วนของพื้นผิวพิกัดถ้าส่วนจำนวนเต็มของsเป็น; ถ้าส่วนจำนวนเต็มของ s เป็นเลขคี่แล้ว s เนื้อประสานงานมีการตั้งค่า1 fracที่fracหมายถึงส่วนที่เป็นเศษส่วนของวินาที

  • GL_MIRROR_CLAMP_TO_EDGEทำให้พิกัดของ sซ้ำแล้วซ้ำอีกสำหรับ GL_MIRRORED_REPEAT สำหรับการสะท้อนพื้นผิวหนึ่งครั้งซึ่งจุดพิกัดนั้นจะถูกจับยึดใน GL_CLAMP_TO_EDGE

ในขั้นต้นGL_TEXTURE_WRAP_Sถูกตั้งค่าให้GL_REPEAT

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.