องค์ประกอบการลดทอนเชิงเส้นในแบบจำลองแสงมีองค์ประกอบทางกายภาพหรือไม่?


18

ใน OpenGL (และระบบอื่น ๆ ) ปัจจัยที่ลดทอนระยะทางสำหรับไฟจุดเป็นสิ่งที่ต้องการ1/(c+kd+sd^2)ที่dเป็นระยะทางจากแสงและc, kและsมีค่าคงที่

ฉันเข้าใจsd^2องค์ประกอบที่เป็นแบบจำลองของการลดทอน "ความถูกต้องตามกฎของสี่เหลี่ยมจัตุรัส" ที่รู้จักกันดีทางร่างกายซึ่งคาดหวังในความเป็นจริง

ฉันเดาค่าคงที่cหนึ่งมักจะมีการจัดการกับค่าที่น้อยมากของd(และอาจแบ่งการป้องกันโดยศูนย์?)

kdองค์ประกอบเชิงเส้นมีบทบาทอะไรในโมเดล (โดยค่าเริ่มต้นkคือศูนย์ใน OpenGL) คุณจะใช้ค่าอื่นเมื่อkใด ฉันรู้ว่าสิ่งนี้เรียกว่าองค์ประกอบ "การลดทอนเชิงเส้น" แต่พฤติกรรมแบบใดที่จำลองในรูปแบบของแสง ดูเหมือนจะไม่ปรากฏในรูปแบบทางกายภาพของแสงที่ฉันรู้

[แก้ไข]

David Gouveia ชี้ให้เห็นว่าอาจใช้ปัจจัยเชิงเส้นเพื่อช่วยให้ฉาก 'ดู' ใกล้เคียงกับสิ่งที่นักพัฒนา / ศิลปินตั้งใจหรือเพื่อควบคุมอัตราที่แสงตก ในกรณีใดคำถามของฉันจะกลายเป็น "ปัจจัยการลดทอนเชิงเส้นมีคู่ฟิสิกส์หรือเป็นเพียงแค่ใช้เป็นปัจจัยเหลวไหลเพื่อช่วยควบคุมคุณภาพของแสงในฉาก"


ฉันไม่ได้บอกว่าการลดทอนเชิงเส้นทำให้ฉากดูดีขึ้นหรือสมจริงยิ่งขึ้น สิ่งที่ฉันพูดคือมันอาจดูดีขึ้นสำหรับวัตถุประสงค์ของคุณ เครื่องฉายรังสีของฉันส่องสว่างเป็นฉากเล็ก ๆ และเมื่อเปรียบเทียบทั้งสองแบบเชิงเส้นจะดูดีขึ้น ฉันไม่ต้องการเหตุผลทางกายภาพที่จะบอกว่ามันดูดีขึ้น - เพียงแค่มองให้ใกล้เคียงกับเอฟเฟกต์ที่ฉันต้องการให้สำเร็จ ในทางกลับกันมันไม่ใช่ว่ากฎหมายจตุรัสผกผันไม่ได้ดูสมจริง แต่เพิ่งหลุดออกเร็วเกินไปและมีส่วนทำให้แสงสว่างน้อยกว่าที่ฉันต้องการ
David Gouveia

ขออภัยเดวิดฉันไม่ได้ตั้งใจที่จะแสดงคำตอบของคุณอย่างไม่ถูกต้อง ฉันเปลี่ยนการแก้ไขด้านบนแล้ว
Ken

1
เสมอดีที่จะจำไว้ว่าแสงเป็นสับบริสุทธิ์และ = ง่าย)
แพทริคฮิวจ์

คำตอบ:


21

แสงจากแหล่งกำเนิดที่มีลักษณะคล้ายจุดที่ตกลงมาด้วยกำลังสองของระยะทาง นั่นคือความเป็นจริงทางกายภาพ

การลดทอนเชิงเส้นมักปรากฏเพื่อให้ปรากฏเหนือกว่า แต่นี่เป็นจริงเฉพาะเมื่อทำงานในcolorpace ที่ไม่ใช่เชิงเส้น นั่นคือถ้าคุณไม่มีการแก้ไขแกมมาที่เหมาะสม เหตุผลง่ายมาก

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

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

1/kdนี่คือการลดทอนเชิงเส้น: นี่คือการลดทอนเชิงเส้นด้วยการใช้ gamma ramp ของจอภาพ: 1/(kd)^2.2. มันค่อนข้างใกล้เคียงกับความสัมพันธ์แบบผกผัน - กำลังสองที่เหมาะสม

แต่ค่าผกผันกำลังสองที่แท้จริง: 1/sd^2กลายเป็น: 1/((s^2)(d^4.4)). นี้จะทำให้การลดทอนแสงตกออกมากขึ้นอย่างรวดเร็วกว่าที่คาดไว้

โดยทั่วไปหากคุณใช้การแก้ไขแกมม่าที่เหมาะสม (เช่นการเรนเดอร์ไปยังเฟรมเฟรม sRGB) คุณไม่ควรใช้การลดทอนเชิงเส้น มันจะดูไม่ถูกต้อง เลย และถ้าคุณไม่ได้ใช้การแก้ไขแกมม่า ... เกิดอะไรขึ้นกับคุณ;)

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


4
+1 ฉันรู้เกี่ยวกับการเรนเดอร์แกมม่าที่ถูกต้องมาระยะหนึ่งแล้ว ฉันรู้เกี่ยวกับการลดทอนกำลังสองและเชิงเส้นในขณะที่ และนี่คือช่วงเวลาที่ฉันตระหนักถึงการเชื่อมต่อระหว่างคนทั้งสองเป็นครั้งแรก :-)
David Gouveia

เหตุผลใด ๆ สำหรับ -1?
Nicol Bolas

9

มีความยืดหยุ่น

เพราะคุณอาจต้องการให้แสงของคุณตกลงมาเป็นเส้นตรง ที่นั่นให้คุณควบคุมระดับนั้นได้ มันไม่จำเป็นต้องมีความถูกต้องทางร่างกายจริงๆ (และสมการแสงเงาของพงษ์ทั้งหมดนั้นแน่นอนว่าไม่ถูกต้องทางร่างกายเช่นกัน)

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

ตัวอย่างเช่นเมื่อฉันนำ raytracer มาใช้ฉันพบว่ากฎกำลังสองผกผันทำให้จุดไฟตกเร็วเกินไป ฉันเปลี่ยนเป็นโมเดลเชิงเส้นแบบยึด (ซึ่งแสงแต่ละดวงมีรัศมีต่ำสุดและสูงสุดโดยมีการแก้ไขเชิงเส้นตรงระหว่างกลาง) และมันก็ดูดีขึ้น

แก้ไข: เพียงแค่พบทรัพยากรที่ดีอธิบายนี้


6

โอเคฉันจะเดาได้

การสังเกตเบื้องต้น

ใน OpenGL (และระบบอื่น ๆ ) ปัจจัยที่ลดทอนระยะทางสำหรับไฟจุดเป็นสิ่งที่ต้องการ1/(c+kd+sd^2)ที่dเป็นระยะทางจากแสงและc, kและsมีค่าคงที่

ฉันเข้าใจsd^2องค์ประกอบที่เป็นแบบจำลองของการลดทอน "ความถูกต้องตามกฎของสี่เหลี่ยมจัตุรัส" ที่รู้จักกันดีทางร่างกายซึ่งคาดหวังในความเป็นจริง

เส้นโค้งสำหรับc+kd+sd^2เป็นรูปโค้งและเป็นเส้นโค้งสำหรับsd^2; ความแตกต่างนั้นไม่สำคัญเท่าที่ดู: พวกมันมีพฤติกรรมคล้ายกันที่อินฟินิตี้มันมีไว้สำหรับค่าเล็กน้อยที่แตกต่างกัน ไม่ว่าจะkหมายถึงอะไรก็ตามมันมีความหมายเฉพาะเมื่ออยู่ใกล้แสง

การทำให้เข้าใจง่ายเบื้องต้น

ตั้งแต่นี้เป็นการลดทอนปัจจัยที่คุณสามารถตั้งค่าเป็นอย่างดีs == 1หรือหารแต่ละอย่างต่อเนื่องโดยในการแสดงออกและแบ่งอำนาจแหล่งกำเนิดแสงของคุณโดยs sมีหนึ่งพารามิเตอร์ในสูตรมากเกินไป

คุณท้ายด้วย:

1/(c/s+(k/s)d+d^2)

การเปลี่ยนแปลงของตัวแปร

... ซึ่งเทียบเท่ากับ:

1/(A + D^2)

ด้วยA == c/s - k^2/(4s^2)และที่สำคัญกว่านั้นD == d + k/2sคือ

มัน1/(A+D^2)ดูเหมือนปกติ1/(c+d^2)ใช่ไหม?

ข้อสรุป

kปัจจัยความก้าวหน้าหรือความล่าช้าลดทอนแสงเพื่อที่จะเพียงเริ่มต้นที่รัศมีของ-k/2s (ใช่มันก็อาจมี "เชิงลบ" รัศมีคิดว่าไฟจุดจินตนาการภายในกระจกทรงกลมจินตนาการเท่านั้นที่จะช่วยให้แสงออกมาเป็นครั้งที่สอง) . ดูเหมือนว่าคณิตศาสตร์จะชนะอีกครั้ง!

แก้ไข:สำหรับวินาทีฉันคิดว่ามันเทียบเท่ากับแสงทรงกลม แต่ไม่ใช่ ที่สะดุดตาที่สุดคือมันจะไม่สร้างเงาที่นุ่มนวล

ประโยชน์?

ฉันเดาว่าพารามิเตอร์นี้สามารถใช้โดยศิลปินเพื่อให้แสงดูเหมือนว่ามันใกล้ชิด (หรือไกลออกไป) กับวัตถุในแง่ของการให้แสงสว่าง แต่ไม่มีการเคลื่อนไหว เนื่องจากไฟจุดสร้างเงาที่แข็งอาจเป็นข้อกำหนดที่แสงจะยังคงอยู่ในตำแหน่งที่ระบุ


3

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


ฉันไม่คิดว่ามันจะเป็นจริง แสงที่เดินทางผ่านตัวกลางจะถูกลดทอนโดย1/dในRพิกัดและยังคง1/d^2อยู่ในพิกัดกลมthetaและ phiสิ่งที่คุณอธิบายคือการ1/d^3ลดทอนของความเข้มแสง
sam hocevar

3

ปัจจัยการลดทอนเชิงเส้นจะมีสำหรับกรณีที่คุณอาจต้องการใช้การลดทอนเชิงเส้นสำหรับแสงของคุณ แต่สิ่งสำคัญคือ - คุณไม่จำเป็นต้องใช้มัน (หรือปัจจัยการลดทอนอื่น ๆ สำหรับเรื่องนั้น)

วิธีนี้ช่วยให้คุณปรับแสงให้เข้ากับรสนิยมส่วนตัวของคุณ ดังนั้นเพียงแค่ตั้งค่าตัวลดทอนใด ๆ ที่คุณไม่ต้องการเป็น 0 และสิ่งที่คุณต้องการไม่ใช่ -0

ตัวอย่างหนึ่งที่คุณอาจต้องการใช้การลดทอนเชิงเส้นคือถ้าอินเวอร์สแควร์ที่ถูกต้องทางคณิตศาสตร์มากขึ้นจะทำให้การตกหล่นเร็วเกินไป การใช้เส้นตรงจะทำให้ได้ผลลัพธ์ที่ดูดีขึ้นหรือน้อยลง (และมีแสงน้อยลงในฉาก) ดังนั้นคุณจะใช้ค่าคงที่ 0, 1 เชิงเส้นและเลขชี้กำลัง 0

เป็นที่น่าสนใจที่จะทราบ (แต่ไม่เป็นที่ยอมรับที่เกี่ยวข้องกับการสนทนานี้) ว่าสไปรต์จุดในทั้ง OpenGL และ D3D (และพารามิเตอร์จุดใน OpenGL) ใช้สูตรการลดทอนแบบเดียวกัน

นอกจากนี้ยังมีข้อสังเกตว่าแสงของ OpenGL / D3D ไม่ได้มีจุดประสงค์เพื่อแก้ไขอย่างถูกต้อง มันไม่เคยถูกออกแบบมาให้เป็นอะไรมากไปกว่าการประมาณที่ยอมรับได้และมันควรจะเป็นพาหะเมื่อนึกถึงสิ่งที่เกี่ยวข้องกับการทำงาน

แน่นอนว่าทุกวันนี้คุณจะใช้ shader เป็นส่วนใหญ่ดังนั้นสูตรแสงแบบเก่าจึงเป็นสิ่งที่น่าสนใจทางวิชาการ / ประวัติศาสตร์เท่านั้นคุณสามารถเขียนสูตรแสงที่คุณต้องการได้


1
  • c คือค่าการลดทอนคงที่สำหรับแหล่งกำเนิดแสง
  • lคือการลดทอนเชิงเส้น นั่นเป็นเหตุผลที่มันถูกคูณด้วยระยะห่างกับแหล่งกำเนิดแสง
  • s คือการลดทอนกำลังสองดังนั้นมันจึงคูณด้วยกำลังสองของระยะทาง

มีข้อมูลเพิ่มเติมในลิงค์นี้


ขอบคุณ แต่คำถามของฉันคือบทบาทขององค์ประกอบการลดทอนเชิงเส้นในการสร้างแบบจำลองแสงคืออะไร ฉันถามเพราะมันไม่ปรากฏในรูปแบบฟิสิกส์ของแสงที่ฉันรู้ ลิงก์ที่คุณระบุไม่ได้อธิบายว่าองค์ประกอบการลดทอนเชิงเส้นคืออะไร มันเพิ่งพูดว่า; "นี่คือการลดทอนเชิงเส้น" โดยไม่มีคำอธิบายอื่น ๆ
Ken

ตกลงฉันตีความคำถามของคุณผิด การลดทอนเชิงเส้นจะสังเกตได้ดีขึ้นในแหล่งกำเนิดแสงแบบหนึ่งมิติที่ไม่มีที่สิ้นสุด (คิดว่าหลอดฟลูออเรสเซนต์) ในขณะที่แบบจำลองกำลังสองของพฤติกรรมของแหล่งกำเนิดแสงทรงกลม จนถึงตอนนี้ฉันได้พบเพียงที่เดียวที่มีคำอธิบายของการโต้ตอบระหว่างแบบจำลองแสงจริงกับที่ใช้ในคอมพิวเตอร์กราฟิก: imdoingitwrong.wordpress.com/2011/01/31/31/light-attenuation
r2d2rigo

1

มันอาจจะเป็นผลมาจากความจริงที่ว่า Z ในคำพูดของเอริคที่นับถือ Lengyel ,

ไม่เชิงเส้นเนื่องจากการแรสเตอร์ไรเซชั่นที่ถูกต้องของเปอร์สเปคทีฟต้องใช้การประมาณเชิงเส้น 1 / z - การประมาณเชิงเส้นของ z เองนั้นไม่ได้ผลลัพธ์ที่ถูกต้อง ฮาร์ดแวร์จะต้องคำนวณ 1 / z ในแต่ละจุดสุดยอดและสอดแทรกข้ามรูปสามเหลี่ยมดังนั้นจึงสะดวกที่จะเขียนค่าลงในบัฟเฟอร์ความลึกแทนที่จะทำการแบ่งส่วนที่มีราคาแพงในทุก ๆ พิกเซลเพื่อกู้คืน z

ความจริงที่ว่าคุณได้รับความแม่นยำ z ใกล้กับระนาบใกล้เป็นเพียงผลข้างเคียงและไม่มีอะไรเกี่ยวข้องกับแรงจูงใจที่อยู่เบื้องหลังการประมาณ 1 / z

บัฟเฟอร์ความลึกเก็บระยะทาง แสงใช้ระยะทางในการลดทอนสัญญาณ อาจเป็นความสัมพันธ์ระหว่างความลึกของบัฟเฟอร์และการติดตั้งระบบไฟที่จำเป็นสำหรับสิ่งนี้ถึงแม้ว่ามันจะใช้เฉพาะในกรณีที่อัลกอริทึมการส่องสว่างทำงานในพื้นที่หน้าจอที่ฉันคิด โปรดจำไว้ว่าดีกว่าที่จะเก็บการผกผันของ precalculated (หรือการคำนวณฮาร์ดแวร์) เสมอกว่าจะต้องทำการหารด้วยค่าที่ไม่มีการแบ่งแยกสำหรับแต่ละ op ต่อเฟรมที่ต้องการ ... และนั่นเป็น ops จำนวนมาก

นี่เป็นเพียงการเดา


คุณอาจเข้าสู่บางสิ่งที่นั่น มันอาจมีบางอย่างเกี่ยวข้องกับพื้นที่ที่คำนวณแสง แต่ฉันไม่คิดว่าบัฟเฟอร์ความลึกเป็นส่วนหนึ่งของมันเนื่องจากมันจัดเก็บ 'ระยะทางหลอก' จากตา (หรือระนาบด้านหน้า) ไปยังวัตถุไม่ใช่ระยะทางจากแสงไปยังวัตถุ เป็นระยะทางแสงที่ใช้ในแสง
Ken

@downvoter - สนใจที่จะแสดงความคิดเห็นหรือเพียงแค่หลอกล่อ? (เพื่อกล่าวอ้างกับ Jonathan)
วิศวกร

การลดทอนเช่นกันการลดทอนถูกคำนวณในพื้นที่ตาที่ไม่ได้เป็นพื้นที่ปกติ -> เปอร์สเปคทีฟ / z ไม่มีส่วนเกี่ยวข้องกับสิ่งนี้
Oliver Zendel

1

เช่นเดียวกับภาคผนวก: เมื่อใช้โมเดล openGL เพื่อประมาณค่าแหล่งกำเนิดแสงทรงกลมทั้งสามสัมประสิทธิ์ที่สมเหตุสมผลและถูกต้อง (ไม่ใช่ "เพื่อป้องกันการล้น" หรือเพื่อให้มี "อิสระทางศิลปะ"):

สำหรับทรงกลมที่มีรัศมี r เราจะได้รับ:

1 / (D / R + 1) ^ 2

แปลว่า

c = 1 k = 2 / r s = (1 / r ^ 2)

(ดูhttp://imdoingitwrong.wordpress.com/2011/01/31/light-attenuation/ )

Imho การประมาณนี้ดีกว่าการใช้ไฟจุดเล็ก ๆ ที่ไม่มีขอบเขตเลย!


สูตร 1 / (d / r + 1) ^ 2 มาได้อย่างไร บทความต้นฉบับกล่าวว่า "หลังจากดูผลลัพธ์จากการทดสอบหลายชุดมันก็ปรากฏชัดเจน" ซึ่งไม่น่าเชื่อเพียงพอในแง่ของคำถามที่ถามเกี่ยวกับการสร้างแบบจำลองทางกายภาพ
user1914692

0

ฉันมีมุมมอง / คำตอบที่แตกต่างเกี่ยวกับสูตร

เมื่อเราดูสปอตไลท์ตัวอย่างเช่นที่จริงเราเห็นการกระเจิงของแสง ดังนั้นสูตร 1 / d ^ 2 จึงใช้สำหรับแสงเปล่งของพิกเซลนั้นเท่านั้น แต่ความสว่างในกล้องของเราของพิกเซลนั้นจะมีสูตรที่ซับซ้อนมากขึ้นซึ่งจะใช้ทฤษฎีการกระเจิงของแสง ดูกระดาษ

"Epipolar Sampling สำหรับ Shadows และ Crepuscular Rays ในสื่อที่เข้าร่วมด้วยการกระเจิงเดี่ยว

โดย Thomas Engelhardt, Carsten Dachsbacher แต่น่าเสียดายที่พวกเขาไม่มีสูตรง่าย ๆ ขั้นสุดท้ายสำหรับการกระเจิงแสง ฉันคิดว่าบางทีเอฟเฟกต์การเลียนแบบ GPU ขั้นสุดท้ายจะคล้ายกับสูตรเชิงเส้นและสมการกำลังสอง

ดังนั้นฉันคิดว่าการเรียกร้อง:

"ถ้าคุณพยายามเลียนแบบความเป็นจริงคุณต้องการ Inverse-Squared (และแก้ไขแกมม่า)" ไม่ถูกต้อง

ที่จริงฉันใช้สูตรกับปัจจัยเชิงเส้นและสมการกำลังสองที่ไม่มีแกมม่าสามารถเลียนแบบเอฟเฟกต์เรืองแสงได้เป็นอย่างดี เชิงเส้นไม่สามารถ

ในการสรุปสั้น ๆ สูตรมีการกระจายทางกายภาพของการกระจายแสง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.