ปัญหาเกี่ยวกับการใช้ atlases พื้นผิวและการรั่วไหลของข้อความที่อยู่ติดกันนั้นเกี่ยวข้องกับวิธีการทำงานของการกรองพื้นผิวเชิงเส้น
สำหรับจุดใด ๆ ในพื้นผิวที่ไม่ได้ถูกสุ่มที่กึ่งกลางของเท็กเซลการสุ่มตัวอย่างเชิงเส้นจะสุ่มตัวอย่าง 4 เท็กซัสที่อยู่ติดกันและคำนวณค่า ณ ตำแหน่งที่คุณถามว่ามีน้ำหนักเฉลี่ย (ขึ้นอยู่กับระยะห่างจากจุดตัวอย่าง) เฉลี่ยทั้ง 4 ตัวอย่าง
นี่คือการสร้างภาพที่ดีของปัญหา:
เนื่องจากคุณไม่สามารถใช้สิ่งที่ต้องการGL_CLAMP_TO_EDGE
ในแผนที่พื้นผิวคุณจึงต้องสร้างขอบข้อความรอบขอบของแต่ละพื้นผิว เท็กซัสชายแดนเหล่านี้จะป้องกันตัวอย่างที่อยู่ใกล้เคียงจากพื้นผิวที่แตกต่างอย่างสิ้นเชิงในแผนที่จากการแก้ไขภาพผ่านการแก้ไขน้ำหนักอธิบายไว้ข้างต้น
โปรดทราบว่าเมื่อคุณใช้ตัวกรอง anisotropic คุณอาจต้องเพิ่มความกว้างของเส้นขอบ นี่เป็นเพราะตัวกรอง anisotropic จะเพิ่มขนาดของพื้นที่ใกล้เคียงตัวอย่างในมุมที่รุนแรง
ในการอธิบายสิ่งที่ฉันหมายถึงโดยใช้เส้นขอบรอบ ๆ ขอบของแต่ละพื้นผิวให้พิจารณาโหมดการตัดคำที่หลากหลายที่มีอยู่ใน OpenGL CLAMP TO EDGE
ความสนใจเป็นพิเศษ
แม้จะมีโหมดที่เรียกว่า "Clamp to Border" แต่จริงๆแล้วไม่ใช่สิ่งที่เราสนใจโหมดนั้นให้คุณกำหนดสีเดียวเพื่อใช้เป็นเส้นขอบรอบ ๆ พื้นผิวของคุณสำหรับพิกัดพื้นผิวใด ๆ ที่อยู่นอกมาตรฐาน [0.0 ช่วง -1.0]
สิ่งที่เราต้องการคือการทำซ้ำพฤติกรรมของCLAMP_TO_EDGE
ซึ่งพื้นผิวใด ๆ ที่ประสานงานนอกช่วงที่เหมาะสมสำหรับพื้นผิว (ย่อย -) ได้รับค่าของศูนย์เท็กเซลสุดท้ายในทิศทางที่มันเกินขอบเขตเนื่องจากคุณเกือบจะควบคุมได้อย่างสมบูรณ์ พิกัดพื้นผิวในระบบ atlas สถานการณ์เดียวที่พิกัดพื้นผิว (มีผลบังคับใช้) อาจอ้างถึงตำแหน่งนอกพื้นผิวของคุณอยู่ในระหว่างขั้นตอนถัวเฉลี่ยถ่วงน้ำหนักของการกรองพื้นผิว
เรารู้ว่าGL_LINEAR
จะสุ่มตัวอย่างเพื่อนบ้านที่ใกล้ที่สุด 4 คนดังที่เห็นในแผนภาพด้านบนดังนั้นเราจึงจำเป็นต้องใช้ชายแดน 1 texel คุณอาจต้องใช้ขอบเท็กเซลที่กว้างขึ้นหากคุณใช้การกรองแบบแอนไอโซทรอปิกเนื่องจากมันจะเพิ่มขนาดพื้นที่ใกล้เคียงตัวอย่างภายใต้เงื่อนไขบางประการ
นี่คือตัวอย่างของพื้นผิวที่แสดงเส้นขอบที่ชัดเจนยิ่งขึ้น แต่สำหรับจุดประสงค์ของคุณคุณสามารถทำให้เส้นขอบ 1 texel หรือ 2 texels กว้าง
(หมายเหตุ: เส้นขอบที่ฉันอ้างถึงไม่ใช่สีดำรอบขอบทั้งสี่ของภาพ แต่พื้นที่ที่รูปแบบกระดานหมากรุกหยุดทำซ้ำเป็นประจำ)
ในกรณีที่คุณสงสัยนี่คือเหตุผลที่ฉันนำเสนอการกรองแบบแอนไอโซทรอปิก มันเปลี่ยนรูปร่างของละแวกใกล้เคียงตัวอย่างตามมุมและสามารถทำให้มากกว่า 4 texels ที่จะใช้สำหรับการกรอง:
http://www.arcsynthesis.org/gltut/Texturing/ParallelogramDiag.svg
ยิ่งคุณใช้ anisotropy มากเท่าไหร่คุณก็จะยิ่งมีแนวโน้มจัดการกับกลุ่มตัวอย่างที่มีมากกว่า 4 texels ขอบเท็กเซล 2 อันควรเพียงพอสำหรับสถานการณ์การกรองแบบแอนไอโซทรอปิกส่วนใหญ่
สุดท้าย แต่ไม่GL_CLAMP_TO_EDGE
ท้ายสุดนี่คือวิธีสร้างแผนที่พื้นผิวที่บรรจุซึ่งจะจำลองพฤติกรรมในการมีตัวกGL_LINEAR
รองพื้นผิว:
( ลบ 1 จาก X และ Y ในพิกัดสีดำฉันไม่ได้พิสูจน์อ่านภาพก่อนโพสต์ )
เนื่องจากการจัดเก็บข้อมูลแบบขอบการจัดเก็บพื้นผิว 4 256x256 ในแผนที่นี้ต้องใช้พื้นผิวที่มีขนาด 516x516 เส้นขอบนั้นใช้รหัสสีตามวิธีที่คุณเติมข้อมูล texel ในระหว่างการสร้างแผนที่:
- Red = แทนที่ด้วย texel โดยตรงด้านล่าง
- สีเหลือง = แทนที่ด้วย texel ด้านบนโดยตรง
- เขียว = แทนที่ด้วย texel ทางด้านซ้ายโดยตรง
- Blue = แทนที่ด้วย texel โดยตรงไปทางขวา
อย่างมีประสิทธิภาพในตัวอย่างที่บรรจุนี้พื้นผิวแต่ละอย่างในแผนที่ใช้พื้นที่ 258x258 ของแผนที่ แต่คุณจะสร้างพิกัดพื้นผิวที่แมปไปยังพื้นที่ 256x256 ที่มองเห็นได้ เท็กซัสที่มีพรมแดนติดจะใช้เมื่อทำการกรองพื้นผิวที่ขอบของพื้นผิวในแผนที่และวิธีที่พวกเขาได้รับการออกแบบเลียนแบบGL_CLAMP_TO_EDGE
พฤติกรรม
ในกรณีที่คุณสงสัยคุณสามารถใช้โหมดการห่ออื่น ๆ โดยใช้วิธีการที่คล้ายกัน - GL_REPEAT
สามารถนำไปใช้ได้โดยการแลกเปลี่ยนเท็กซัสเส้นขอบซ้าย / ขวาและบน / ล่างในแผนที่พื้นผิวและประสานงานคณิตศาสตร์พื้นผิวที่ฉลาดเล็กน้อยใน Shader มันซับซ้อนกว่านี้เล็กน้อยดังนั้นอย่ากังวลกับเรื่องนี้ในตอนนี้ เนื่องจากคุณกำลังจัดการแผ่นงานสไปรท์ จำกัด ตัวเองไว้ที่GL_CLAMP_TO_EDGE
:)
GL_NEAREST
หรือGL_LINEAR
แสดงพื้นผิวหรือไม่?