แก้ไข: โปรดดูคำตอบอื่น ๆ ของฉันด้วยโซลูชันที่เป็นรูปธรรม
ฉันได้แก้ไขปัญหาที่แน่นอนนี้ในช่วงหนึ่งปีที่ผ่านมาสำหรับวิทยานิพนธ์ปริญญาโทของฉัน ในกระดาษ Valve พวกเขาแสดงให้เห็นว่าคุณสามารถและสองช่องทางไกลเพื่อให้ได้สิ่งนี้ซึ่งทำงานได้ตราบใดที่คุณมีมุมนูนเพียงมุมเดียว สำหรับมุมเลนส์เว้าคุณจำเป็นต้องมีหรือการดำเนินการ ผู้ชายคนนี้ได้พัฒนาระบบที่คลุมเครือเพื่อสลับระหว่างการทำงานสองอย่างโดยใช้สี่ช่องสัญญาณ
แต่มีการดำเนินงานที่ง่ายมากที่สามารถอำนวยความสะดวกทั้ง AND และ OR ขึ้นอยู่กับสถานการณ์และนี่คือความคิดหลักของวิทยานิพนธ์ของฉัน: เฉลี่ยของสาม โดยพื้นฐานแล้วคุณใช้สามช่องสัญญาณ (เหมาะสำหรับ RGB) ซึ่งสามารถใช้แทนกันได้อย่างสมบูรณ์และรวมเข้าด้วยกันโดยใช้การแบ่งกลาง (เลือกค่ากลางจากสามช่อง)
เพื่อรองรับการต่อต้านนามแฝงเราไม่ได้ทำงานเพียงแค่บูลีน แต่ค่าของจุดลอยตัวและการดำเนินการและ AND จะกลายเป็นค่าต่ำสุดและ OR หรือจะกลายเป็นค่าสูงสุดสองค่า ค่ามัธยฐานของสามแน่นอนสามารถทำทั้งสองอย่างถ้า< Bสำหรับ ( , , ข ) ค่ามัธยฐานคือขั้นต่ำและสำหรับ ( , B , B ) มันเป็นสูงสุด
กระบวนการแสดงผลยังคงง่ายมาก ส่วนของ shader ทั้งหมดรวมถึง anti-aliasing สามารถมีลักษณะดังนี้:
int main() {
// Bilinear sampling of the distance field
vec3 s = texture2D(sdf, p).rgb;
// Acquire the signed distance
float d = median(s.r, s.g, s.b) - 0.5;
// Weight between inside and outside (anti-aliasing)
float w = clamp(d/fwidth(d) + 0.5, 0.0, 1.0);
// Combining the background and foreground color
gl_FragColor = mix(outsideColor, insideColor, w);
}
ดังนั้นความแตกต่างจากวิธีการดั้งเดิมคือการคำนวณค่ามัธยฐานหลังจากสุ่มตัวอย่างพื้นผิว คุณจะต้องใช้ฟังก์ชั่นแบ่งแม้ว่าซึ่งสามารถทำได้ด้วยเพียง 4 นาทีการดำเนินงาน
แน่นอนว่าคำถามคือฉันจะสร้างสนามระยะทางสามช่องทางได้อย่างไรและนี่คือส่วนที่ยุ่งยาก วิธีที่ชัดเจนที่สุดที่ฉันใช้ในตอนแรกคือการสลายตัวของรูปร่างอินพุต / glyph ออกเป็นสามส่วนจากนั้นสร้างสนามระยะทางธรรมดาออกมาจากแต่ละส่วน กฎสำหรับการย่อยสลายนี้ไม่ซับซ้อน ประการแรกพื้นที่ที่มีช่องอย่างน้อย 2 ใน 3 ช่องเป็นด้านใน จากนั้นถ้าคุณจินตนาการว่านี่เป็นช่องสี RGB มุมนูนต้องทำจากสีทุติยภูมิและองค์ประกอบหลักสองส่วนนั้นออกไปด้านนอก มุมเลนส์เว้าคือสิ่งที่ผกผัน: สีรองสองสีล้อมรอบสีหลักทั่วไปของพวกเขาและลิ่มระหว่างที่ขอบทั้งสองด้านเข้าหากันเป็นสีขาว ฉันยังพบว่าจำเป็นต้องมีการขยายบางอย่างที่สองสีหลักหรือสองสีเป็นอย่างอื่นจะสัมผัสเพื่อหลีกเลี่ยงสิ่งประดิษฐ์ (เช่นในจังหวะกลางของ "N"
ภาพต่อไปนี้เป็นตัวอย่างการสลายตัวที่สร้างโดยโปรแกรมจากวิทยานิพนธ์ของฉัน:
อย่างไรก็ตามวิธีนี้มีข้อเสียอยู่บ้าง หนึ่งในนั้นคือเอฟเฟกต์พิเศษเช่นโครงร่างและเงาจะไม่ทำงานอย่างถูกต้องอีกต่อไป โชคดีที่ฉันยังมาพร้อมกับวิธีที่สองสวยงามมากขึ้นซึ่งสร้างเขตข้อมูลระยะไกลโดยตรงและยังสนับสนุนผลกราฟิกทั้งหมด มันรวมอยู่ในวิทยานิพนธ์ของฉันด้วยและก็มีอายุเกินหนึ่งปีเช่นกัน ฉันจะไม่ให้รายละเอียดใด ๆ เพิ่มเติมในขณะนี้เพราะฉันกำลังเขียนบทความที่อธิบายถึงเทคนิคที่สองนี้โดยละเอียด แต่ฉันจะโพสต์ไว้ที่นี่ทันทีที่ดำเนินการเสร็จ
อย่างไรก็ตามนี่คือตัวอย่างของความแตกต่างในด้านคุณภาพ ความละเอียดของพื้นผิวจะเหมือนกันในแต่ละภาพ แต่อันที่เหลือใช้พื้นผิวปกติส่วนที่อยู่ตรงกลางใช้สนามระยะทางธรรมดาและอันที่ถูกต้องใช้สนามระยะทางสามช่องทางของฉัน ค่าใช้จ่ายด้านประสิทธิภาพเป็นเพียงความแตกต่างระหว่างการสุ่มตัวอย่างพื้นผิว RGB กับสีเดียว