ฉันคิดว่าปัญหาหลักคือช่วงไดนามิกหนึ่งอัลกอริทึมของคุณอาจถูกต้อง แต่คุณกำลังทำงานกับข้อมูลผิดประเภท
แหล่งกำเนิดแสงแบบจุดที่มิฉะนั้นจะตัดและไปสีขาวบริสุทธิ์จะแพร่กระจายไปทั่วพื้นที่ขนาดใหญ่ด้วยเลนส์ที่มีการตกกระทบเพื่อให้เกิดแผ่นดิสก์ที่ไม่สว่างและไม่ได้หนีบ
นั่นเป็นเหตุผลว่าทำไมคุณถึงได้วงกลมที่สวยงามในภาพโบเก้ที่แท้จริงของคุณ ถ้าคุณคลิปสัญญาณ (ทำให้มันสว่างน้อยกว่าที่ควรจะเป็นแล้วกระจายออกไปด้วยการจำลองโบเก้ของคุณคุณจะได้วงกลมสลัว (หรือหกเหลี่ยมหรืออะไรก็ตาม) ที่ไม่โดดเด่นและดูไม่เหมือนจริง
สิ่งที่คุณมีในห่วงโซ่ภาพที่แท้จริงคือ:
bokeh (from the lens) -> digitisation (clipping) -> gamma correction & dynamic range compression
สิ่งที่คุณกำลังทำคือ
sharp image -> digitisation (clipping) -> gamma correction & dynamic range compression -> bokeh simulation
คุณจะไม่ได้รับผลลัพธ์ที่ถูกต้องเพราะคุณไม่ได้ทำงานกับข้อมูลเชิงเส้น
สิ่งที่คุณสามารถทำได้คือพยายามทำข้อมูลเชิงเส้นให้เปลี่ยนช่วงไดนามิกใด ๆ ที่ขาดหายไปจากการเล็มทำการจำลองโบเก้ของคุณแล้วทำซ้ำการทำงานแบบไม่เชิงเส้น!
นี่คือตัวอย่าง ฉันเริ่มต้นด้วยภาพ HDR ที่ได้รับการ tonemapped ให้ผลไม่เชิงเส้นสูง นี่เป็นประเภทภาพที่แย่ที่สุดที่จะลองจำลองโบเก้ด้วย!
การดำเนินการโน้มน้าวมาตรฐานเพื่อจำลองโบเก้ (โดยใช้เครื่องมือเบลอเลนส์ของ Photoshop) ให้ผลลัพธ์นี้ซึ่งคล้ายกับสิ่งที่คุณได้รับ:
เพื่อให้ได้ผลลัพธ์ที่ดีขึ้นฉันได้ใช้เส้นโค้งที่รุนแรงเพื่อลองและรับภาพกลับคืนมาอย่างคร่าว ๆ ก่อนที่จะทำการ tonemapping ซึ่งมีไฮไลท์สว่างกว่าภาพที่เหลือ ฉันทำสิ่งนี้โดยใช้เครื่องมือระดับผลักดันอินพุตกลางไปทางขวาจาก 1.0 ถึงประมาณ 0.2) ฉันใช้เครื่องมือเบลอเลนส์เช่นเดียวกับก่อนหน้านี้ ในที่สุดฉันก็ใช้โค้งมากในทิศทางตรงกันข้ามกับโค้งแรก ผลที่ได้ในขณะที่ไกลจากความสมบูรณ์แบบนั้นดูเหมือนโบเก้เลนส์จริงมากขึ้น:
หากคุณกำลังทำสิ่งนี้ในโค้ดให้ลองคิดค่าแต่ละค่าจากนั้นใช้รูทีนการจำลองโบเก้ของคุณจากนั้นนำคิวบ์รูทของแต่ละค่า คุณควรเห็นการปรับปรุง อาจใช้เวลาปรับแต่ง
tl; drแม้ว่าคุณจะได้นำโมเดลทางคณิตศาสตร์ที่สมบูรณ์แบบของโบเก้มาแล้วมันจะต้องนำไปใช้กับข้อมูลเชิงเส้นที่ยังไม่ได้ตัด หากคุณใช้การคำนวณแบบเดียวกันกับข้อมูลที่มีการดัดแปลงอย่างหนัก (แม้แต่มาตรฐานในกล้อง JPEG ก็ถูกแก้ไขอย่างหนักจากมุมมองทางคณิตศาสตร์) คุณจะได้รับผลลัพธ์ที่แตกต่างกันมาก