เหตุใดจึงเป็นไปได้ที่จะพบการประสานพื้นผิวมากกว่า 1 หรือน้อยกว่า 0


11

ฉันกำลังศึกษาข้อความเกี่ยวกับtexture mappingและในpreparing to drawเซสชั่นฉันอ่าน:

กำหนดพารามิเตอร์การห่อพื้นผิว สิ่งนี้จะควบคุมสิ่งที่จะเกิดขึ้นเมื่อมีการประสานพื้นผิวมากกว่า 1.0 หรือน้อยกว่า 0.0 ที่พบ:

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

โดยที่ wrap คือ:
GL_REPEAT: ระบุว่ารูปแบบนี้จะทำซ้ำ (เช่นล้อมรอบ) หากพบว่าพิกัดพื้นผิวที่แปลงสภาพน้อยกว่า 0.0 หรือมากกว่า 1.0 จะพบ

GL_CLAMP: ระบุว่ารูปแบบจะ“ ติด” กับค่าที่ 0.0 หรือ 1.0

แต่ไม่มีคำอธิบายว่าอะไรเป็นสาเหตุของการเผชิญหน้ากับพิกัดพื้นผิว
เช่นสมมติว่าฉันเพิ่งวาดสี่เหลี่ยมและฉันต้องการใช้รูปภาพเป็นพื้นผิวบนมันเป็นไปได้หรือไม่ที่จะพบพิกัดดังกล่าว?

คำตอบ:


5

ไม่ใช่พื้นผิวทั้งหมดที่ใช้พิกัดพื้นผิวที่มาจากข้อมูลตาข่าย ตัวอย่างเช่นด้วยพื้นผิวแบบฉายคุณเปลี่ยนโลกให้เป็นพื้นที่ของพื้นผิว โลกจำนวนมากตกอยู่นอกขอบเขต [0, 1] หากไม่มีโหมดการหนีบในสถานที่คุณจะได้รับปัญหา


10

แม่นยำในการทำซ้ำพื้นผิว

ดังนั้นถ้าคุณมีรูปสี่เหลี่ยมและพิกัดพื้นผิวเริ่มจาก 0 ถึง 1 พื้นผิวจะถูกวาดหนึ่งครั้ง หากพิกัดไปจาก 0 ถึง 2 และตัดเป็นชุดGL_REPEATแล้วพื้นผิวจะถูกวาดสองครั้ง

ลองและดูด้วยตัวเอง


ok @Panda Pajama ดังนั้นสำหรับรหัสเช่นนี้: float x0 = 0; // มุมบนซ้ายของรูปภาพลอย y0 = 0; float x1 = x0 + ImageWidth; // มุมล่างขวาของลอยภาพ 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); } ไม่มีความเป็นไปได้ที่จะพบพิกัดพื้นผิวเกินช่วงเวลา (0,1) หรือไม่?
Sepideh Abadpour

1
@sepideh: ไม่แน่นอน คุณเก็บพิกัดพื้นผิวไว้โดยเฉพาะในช่วง [0, 1] สิ่งที่คุณไม่เข้าใจคือคุณไม่จำเป็นต้อง ; คุณสามารถทำให้พวกเขาทำอะไรก็ได้ และอย่าโพสต์รหัสไว้ในความคิดเห็น หากคุณต้องการคำชี้แจงแก้ไขคำถามของคุณ
Nicol Bolas

ตกลงขอบคุณสำหรับคำแนะนำของคุณเกี่ยวกับการส่งรหัสคำถามของฉัน ฉันกำลังค้นหาวิธีจัดรูปแบบรหัสในคำสั่ง แต่หาไม่เจอ !!! ดังนั้นคุณหมายถึงการเผชิญหน้ากับพิกัดดังกล่าวไม่ใช่เหตุการณ์ที่เป็นไปได้ มันถูกระบุโดยโปรแกรมเมอร์อย่างชัดเจนเพื่อยกเลิกพื้นผิวหรือไม่
Sepideh Abadpour

1
@sepideh "ไม่มีเหตุการณ์ที่เป็นไปได้ในขณะใช้งาน" หมายความว่าอะไร? เป็นการดีที่จะเปลี่ยนรหัสของคุณในความคิดเห็นเพื่อglTexCoord2f(0, 2);เป็นตัวอย่าง สิ่งนี้มีความหมายที่เฉพาะเจาะจงอย่างชัดเจนทั้งในโค้ดและเมื่อโปรแกรมกำลังทำงาน หากคุณเห็นสิ่งนี้ผู้เขียนทำอย่างตั้งใจเพราะให้ผลลัพธ์ที่ต้องการ
Joseph Mansfield

2
@sepideh แน่นอน OpenGL ใช้ค่าอะไรก็ตามที่คุณให้ ถ้าคุณให้ค่าในช่วง 0 ถึง 1 คุณจะไม่ได้อะไรเลย
โจเซฟแมนส์ฟิลด์

5

ใช่คุณสามารถพบพิกัดพื้นผิวที่มากกว่า1.0และเล็กกว่า0.0ได้

ขึ้นอยู่กับรุ่นที่คุณโหลดอย่างสมบูรณ์ โดยปกติสำหรับแต่ละจุดสุดยอดจะมีการจัดตำแหน่งพิกัดปกติและพื้นผิวที่ประสานงาน ในรูปแบบไฟล์ mesh ส่วนใหญ่พิกัดพื้นผิวไม่ได้ จำกัด อยู่ที่ช่วงใด ๆ

นี้จะใช้ในการทำซ้ำเนื้อ ตัวอย่างเช่นในช่วงเวลาที่พื้นผิวระหว่างสี่รูปสี่เหลี่ยมของจุดพิกัดเนื้อจะเป็น0,0, 0,4, และ4,0 4,4โดยไม่ต้องตัดเนื้อคุณจะต้องจุดเพิ่มเติมเพื่อแยกพื้นผิวเป็น 4 ครั้ง 4 พื้นผิวย่อยกับแต่ละพิกัดเนื้อ0,0, 0,1, ,1,0 1,1จุดยอดน้อยลงส่งผลให้ประสิทธิภาพการแสดงผลดีขึ้น

โดยทั่วไปไม่ต้องการให้ผู้ใช้สังเกตเห็นขอบของพื้นผิวที่ซ้ำกัน ดังนั้นพื้นผิวที่ซ้ำกันจึงสามารถเรียงต่อกันได้ในกรณีส่วนใหญ่ กว่าขอบด้านขวาจะจางหายไปอย่างไร้รอยต่อไปทางซ้ายและขอบบนถึงล่างสุด ด้วยวิธีนี้การเปลี่ยนแปลงราบรื่นและหวังว่าผู้ใช้จะไม่สังเกตเห็น

หัวข้อขั้นสูงขึ้น แต่เกี่ยวข้องคือการบดบังความจริงที่ว่าพื้นผิวเดียวกันซ้ำหลายครั้ง ตัวอย่างเช่นการผสมพื้นผิวที่มีขนาดแตกต่างกันซ้ำ ๆ เช่นพื้นผิวผนังและรูปลอกดินเป็นเทคนิคทั่วไป


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,1นั่นคือคำอธิบายที่ใช้งานได้จริง! ขอบคุณ!
Amit Tomar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.