फैलाना और स्पेक्युलर शब्दों को ठीक से कैसे संयोजित करें?


18

जहां तक ​​मैं समझता हूं, एक BRDF में फ्रेस्नेल शब्द एक फोटॉन के परावर्तित होने या सतह से टकरा जाने पर अपवर्तित होने की संभावना बता रहा है।

परिलक्षित फोटोन स्पेक्युलर टर्म में योगदान करेंगे, जबकि अपवर्तित वाले डिफ्यूज़ टर्म में योगदान करेंगे। इसलिए, निर्धारित करते समय, भौतिक रूप से आधारित तरीके से, सामग्री के रंग के लिए एक प्रकाश का योगदान, मुझे लगता है कि मैं सिर्फ लिखना पसंद करता हूं:

// Assuming for example:
//   diffuse = dot(L, N);
//   specular = pow(dot(H, N), alpha) * (alpha + 2.0) / 8.0;
//   fresnel = f0 + (1.0 - f0) * pow(1.0 - dot(E, H), 5.0);
color = lightIntensity * Lerp(diffuse * albedo, specular, fresnel);

फिर भी, मुझे नहीं लगता कि मैंने कभी इस तरह से लिखा हुआ देखा है। मैंने देखा है कि फ्रेशर शब्द के अनुसार स्पेक्युलर शब्द को वेट किया जा रहा है, लेकिन डिफ्यूज़ एक नहीं। पीबीआर पर अपने बड़े पैमाने पर संदर्भित लेख में , सेबास्टियन लैगार्ड ने यहां तक ​​कहा कि विसरित शब्द को भारित करने के लिए का उपयोग करना गलत है।(1F)

मुझे किसकी याद आ रही है?
मैं एक स्पष्टीकरण का बहुत स्वागत करता हूं जो एक स्पष्ट तरीके से हाइलाइट करता है कि यह गलत क्यों होगा।

जवाबों:


14

दो Fresnel शब्दों का उपयोग करना इस अर्थ में सही है कि किसी भी दिए गए फैलाना पथ दो बार सतह से गुजरेंगे। यदि आप माध्यम से एक पथ को ट्रेस करके विसरण को हल कर रहे हैं, जब तक कि वह फिर से बाहर नहीं निकलता है, तो आपको उस पथ के लिए दो (या अधिक) फ्रेस्नेल शब्द मिलेंगे क्योंकि यह सतह के साथ इंटरैक्ट करता है।

1Fout

लाम्बर्टियन शब्द में क्या शामिल नहीं है ऊर्जा का वह भाग है जो प्रकाश के प्रसार से पहले परावर्तित होने से परावर्तित होकर खो जाता है। यह दृश्य-निर्भर है, लेकिन इसके ऊपर सटीक चमकदार पालि पर निर्भर करता है। एक (नॉन-मेटैलिक) सतह इंटरफेस में कोई ऊर्जा हानि नहीं होती है, इसलिए जो कुछ भी परिलक्षित नहीं होता है वह अपवर्तित हो जाएगा, जिसका अर्थ है कि आप वास्तव में जो चाहते हैं वह सभी बाहरी दिशाओं पर सतह पर कुल ऊर्जा हानि को एकीकृत करना है, अर्थात1glossy_bsdf(in,out)dout

1glossydout=1Fin

π

तो, लगभग:

// Assuming for example:
//   diffuse = albedo / PI;
//   specular = my_favorite_glossy_brdf(in_dir, out_dir, roughness);
//   fresnel = f0 + (1.0 - f0) * pow(1.0 - dot(E, H), 5.0);
//   total_surface_reflection = fresnel
color = lightIntensity * dot(L, N) * Lerp(diffuse, specular, total_surface_reflection);

¹ सचमुच का अभिन्नF


8

अपने प्रश्न को ठीक से लिखने के लिए ब्राउज़ करते समय, मुझे वास्तव में जवाब मिल गया , जो कि बहुत सरल होता है।

एक और फ्रेस्नेल शब्द भी वजन करने जा रहा है क्योंकि फोटॉनों सामग्री से बाहर का रास्ता बनाते हैं (इसलिए हवा में अपवर्तित किया जाता है) और फैलाना शब्द बन जाता है। इस प्रकार फैलाना शब्द के लिए सही कारक होगा:

(1Fin)(1Fout)

1
डिज्नी BRDF कागज खंड 5.3 अपने जवाब में समीकरण को संदर्भित करता है और फिर एक अलग मॉडल निर्दिष्ट करने के लिए चला जाता है। जैसा कि मैंने अभी-अभी अपना चमकदार BRDF कार्यान्वयन शुरू किया है, मैं इसे समझने का दावा नहीं करता!
23

मुझे लगता है कि यह यहाँ से जारी रहेगा, जहाँ प्रकाश जो आंतरिक रूप से वापस परिलक्षित होता है, वह सतह को फिर से अंदर से, विपरीत दिशा में, और फिर से, और फिर से, हर बार कम होने पर, अनंत पर: पी (या) सतह बिखरते हुए)
एलन वुल्फ

आप दूसरे फ्रेस्नेल शब्द की गणना कैसे करते हैं?
plasmacel
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.