ตามรหัส shader ที่คุณโพสต์คุณไม่ได้สอดแทรก UVs จากจุดยอด แต่ดูเหมือนว่าคุณกำลังแก้ไขตำแหน่ง 3D (fragVert
) แล้วคำนวณยูวีด้วยการเปลี่ยนเป็นรูปทรงกลมพิกัด
การวิเคราะห์ของคุณถูกต้องเนื่องจากมีการเลือก mipmap ที่เล็กที่สุดเมื่อมีความไม่ต่อเนื่องเนื่องจากการเลือก mipmap นั้นขึ้นอยู่กับอนุพันธ์ที่ประเมินตัวเลขจาก UV ที่ใช้ในพิกเซลข้างเคียง เมื่อหนึ่งพิกเซลมี u = 0 และอื่น ๆ มี u = 1 คุณจะได้อนุพันธ์ที่ใหญ่มาก การพยายามแก้ไขของคุณมีปัญหาเดียวกันในอนุพันธ์ที่มีขนาดใหญ่เกิดขึ้นรอบ u = 0.01 และ u = 0.99 ซึ่งเป็นสาเหตุที่ตะเข็บสองอันปรากฏที่ด้านใดด้านหนึ่งของรอยต่อเดิม
วิธีการที่ค่อนข้างง่ายในการแก้ไขปัญหาคือการตัดสินใจว่าระดับ mip ใดที่จะใช้ด้วยตัวคุณเองและโทรหา textureLod
ตัวอย่างโดยตรง หากดาวเคราะห์นั้นอยู่ใกล้กับกล้องเสมอคุณสามารถกำหนดระดับ mip ให้เป็น 0 ได้ยาก (หรือสำหรับเรื่องนั้นอย่ารวมระดับ mip ไว้ในพื้นผิวเลย) มิฉะนั้นอาจขึ้นอยู่กับ log2 ของระยะทางของจุดจากกล้องโดยปรับขนาดตามปัจจัยที่เหมาะสม โปรดทราบว่าสิ่งนี้จะปิดการใช้งานการกรอง anisotropic อย่างมีประสิทธิภาพ
แนวทางที่ถูกต้องมากขึ้นคือการคำนวณอนุพันธ์ที่มีคุณภาพสูงกว่า แทนที่จะใช้dFdx
และdFdy
ใน UVS ซึ่งมีต่อเนื่องเนื่องจากการที่atan2
คุณสามารถนำไปใช้dFdx
และdFdy
การfragVert
(ซึ่งจะมีอย่างต่อเนื่องทุกทางรอบทรงกลม) จากนั้นใช้แคลคูลัส (กฎโซ่) ในการหาสูตรที่จะได้รับสัญญาซื้อขายล่วงหน้ายูวี จากฐานะสัญญาซื้อขายล่วงหน้า สิ่งนี้จะซับซ้อนและช้าลง แต่มีข้อได้เปรียบที่การกรองแบบ Anisotropic ควรทำงาน
ในที่สุดเนื่องจากคุณเพิ่งเริ่มใช้งาน OpenGL ฉันจะทราบว่าในขณะที่การคำนวณ UV จากพิกัดทรงกลมเป็นวิธีที่ถูกต้องสมบูรณ์ในการสร้างรูปทรงกลมแบบทรงกลมมันไม่ใช่วิธี "ปกติ" ที่คนส่วนใหญ่เลือก มันเป็นเรื่องธรรมดามากที่จะสร้างตาข่ายทรงกลมที่มีรังสียูวีระบุต่อจุดยอดและผ่านจากจุดยอดไปยังจุดภาพพิกเซล (สอดแทรกเชิงเส้นตรงข้ามในแต่ละสามเหลี่ยม) จุดยอดจะถูกวางตามแนวรอยต่อเช่นนี้ซึ่งมีสองจุดของแต่ละจุดยอดในตำแหน่งเดียวกัน แต่ครึ่งหนึ่งกับ u = 0 เชื่อมต่อกับรูปสามเหลี่ยมด้านหนึ่งและอีกครึ่งหนึ่งที่เชื่อมต่อกับ u = 1 สามเหลี่ยมที่อยู่อีกด้านหนึ่ง วิธีนี้จะช่วยลดรอยตะเข็บที่มองเห็นได้และไม่จำเป็นต้องใช้ลูกเล่นในการปรับพิกเซล