पिछले पाठ ने शारीरिक रूप से प्रशंसनीय प्रतिपादन मॉडल को लागू करने की मूल बातें का अवलोकन दिया। इस बार हम सैद्धांतिक गणनाओं से प्रत्यक्ष (विश्लेषणात्मक) प्रकाश स्रोतों: बिंदु, दिशात्मक, या सर्चलाइट की भागीदारी के साथ एक विशिष्ट रेंडर कार्यान्वयन को आगे बढ़ाएंगे।
पहले, चलो पिछले पाठ से चिंतनशीलता की गणना के लिए अभिव्यक्ति को ताज़ा करें:
Lo(p, omegao)= int limit Omega(kd fracc pi+ fracDFG4( omegai cdotn)( omegai cdotn))Li(p, omegai)n cdot omegaid omegai
अधिकांश भाग के लिए, हम पहले ही इस सूत्र के घटकों से निपट चुके हैं, लेकिन सवाल यह है कि विशेष रूप से
विकिरण का प्रतिनिधित्व कैसे किया जाए, जो कुल ऊर्जा चमक (
चमक ) है
एल पूरा दृश्य। हम सहमत हुए कि ऊर्जा की चमक
एल (कंप्यूटर ग्राफिक्स शब्दावली के संदर्भ में) विकिरण प्रवाह (
उज्ज्वल प्रवाह ) के अनुपात के रूप में माना जाता है
phi (प्रकाश स्रोत की विकिरण ऊर्जा) ठोस कोण के मूल्य के लिए
ओमेगा । हमारे मामले में, ठोस कोण
ओमेगा हमने इसे असीम होने के लिए लिया, और इसलिए ऊर्जा चमक प्रकाश की प्रत्येक व्यक्तिगत किरण (इसकी दिशा) के लिए विकिरण प्रवाह का एक विचार देती है।
इन गणनाओं को प्रकाश व्यवस्था के मॉडल से कैसे जोड़ा जाए जो हम पिछले पाठों से जानते हैं? पहले, कल्पना करें कि आपको एक RGB स्रोत (23.47, 21.31, 20.79) के रूप में परिभाषित विकिरण प्रवाह के साथ प्रकाश का एक एकल स्रोत (जो सभी दिशाओं में समान रूप से उत्सर्जन करता है) दिया जाता है। इस तरह के स्रोत की उज्ज्वल
तीव्रता सभी दिशाओं में इसके विकिरण प्रवाह के बराबर है। हालांकि, एक विशिष्ट बिंदु के रंग को निर्धारित करने की समस्या पर विचार किया
पी सतह पर, आप गोलार्ध में प्रकाश की घटना के सभी संभावित दिशाओं को देख सकते हैं
ओमेगा केवल वेक्टर
wi जाहिर है कि एक प्रकाश स्रोत से आएगा। चूंकि केवल एक प्रकाश स्रोत का प्रतिनिधित्व किया जाता है, जो अंतरिक्ष में एक बिंदु द्वारा दर्शाया जाता है, एक बिंदु में प्रकाश घटना के अन्य सभी संभावित दिशाओं के लिए
पी ऊर्जा चमक शून्य के बराबर होगी:
अब, यदि हम किसी दिए गए स्रोत के लिए प्रकाश क्षीणन के नियम को अस्थायी रूप से ध्यान में नहीं रखते हैं, तो यह पता चलता है कि इस स्रोत की घटना प्रकाश किरण के लिए ऊर्जा की चमक अपरिवर्तित बनी हुई है जहाँ भी हम स्रोत (कोण के आधार पर चमक की स्केलिंग) करते हैं
phi भी नह) ं गिनता। कुल मिलाकर, एक बिंदु स्रोत विकिरण कोण को देखने के कोण की परवाह किए बिना स्थिर रखता है, जो कि त्रिदोष स्थिरांक (23.47, 21.31, 20.79) के रूप में प्रारंभिक विकिरण प्रवाह के बराबर विकिरण बल लेने के बराबर है।
हालांकि, ऊर्जा चमक की गणना भी बिंदु के समन्वय पर आधारित है
पी कम से कम किसी भी भौतिक रूप से विश्वसनीय प्रकाश स्रोत एक बिंदु से एक स्रोत तक बढ़ती दूरी के साथ विकिरण बल के क्षीणन को दर्शाता है। आपको सतह के अभिविन्यास को भी ध्यान में रखना चाहिए, जैसा कि चमक के लिए मूल अभिव्यक्ति से देखा जा सकता है: विकिरण बल की गणना के परिणाम को सतह के सामान्य वेक्टर के स्केलर मूल्य से गुणा किया जाना चाहिए
एन और विकिरण घटना वेक्टर
wi ।
उपरोक्त को फिर से लिखना: प्रकाश के प्रत्यक्ष बिंदु स्रोत के लिए, विकिरण कार्य
एल बिंदु से कुछ दूरी पर क्षीणन को ध्यान में रखते हुए, घटना के प्रकाश का रंग निर्धारित करता है
पी और एक कारक द्वारा स्केलिंग को ध्यान में रखते हुए
n cdotwi लेकिन केवल प्रकाश की एक किरण के लिए
wi मुद्दे पर
पी - मूल रूप से स्रोत और बिंदु को जोड़ने वाला एकमात्र वेक्टर है। स्रोत कोड के रूप में, इसकी व्याख्या इस प्रकार है:
vec3 lightColor = vec3(23.47, 21.31, 20.79); vec3 wi = normalize(lightPos - fragPos); float cosTheta = max(dot(N, Wi), 0.0); float attenuation = calculateAttenuation(fragPos, lightPos); vec3 radiance = lightColor * attenuation * cosTheta;
यदि आप अपनी आंखों को थोड़ा संशोधित शब्दावली में बंद करते हैं, तो कोड का यह टुकड़ा आपको कुछ याद दिलाना चाहिए। हां, हां, यह हमारे लिए ज्ञात प्रकाश मॉडल में फैलाना घटक की गणना के लिए सभी समान कोड है। प्रत्यक्ष रोशनी के लिए, ऊर्जा चमक प्रकाश स्रोत के लिए एकल वेक्टर द्वारा निर्धारित की जाती है, क्योंकि गणना इस तरह से की जाती है कि हम अभी भी जानते हैं।
मैं ध्यान देता हूं कि यह कथन केवल इस धारणा के तहत सही है कि प्रकाश का एक बिंदु स्रोत अनंत है और अंतरिक्ष में एक बिंदु द्वारा दर्शाया जाता है। वॉल्यूम स्रोत को मॉडलिंग करते समय, इसकी चमक कई दिशाओं में शून्य से भिन्न होगी, और केवल एक बीम पर नहीं।
एकल बिंदु से विकिरण उत्सर्जित करने वाले अन्य प्रकाश स्रोतों के लिए, ऊर्जा चमक उसी तरह से गणना की जाती है। उदाहरण के लिए, एक दिशात्मक प्रकाश स्रोत में एक स्थिर दिशा होती है
wi और क्षीणन का उपयोग नहीं करता है, और स्रोत की दिशा के आधार पर प्रक्षेपण स्रोत एक अलग विकिरण शक्ति दिखाता है।
यहां हम अभिन्न के मूल्य पर लौटते हैं
int गोलार्ध की सतह पर
ओमेगा । चूँकि हम पहले से जानते हैं कि किसी विशेष बिंदु के छायांकन में भाग लेने वाले सभी प्रकाश स्रोतों की स्थिति, हमें अभिन्न को हल करने के लिए प्रयास करने की आवश्यकता नहीं है। हम प्रकाश स्रोतों की इस संख्या द्वारा प्रदान किए गए कुल विकिरण की सीधे गणना कर सकते हैं, क्योंकि सतह की ऊर्जा चमक प्रत्येक स्रोत से एक ही दिशा से प्रभावित होती है।
नतीजतन, प्रत्यक्ष प्रकाश स्रोतों के लिए पीबीआर की गणना काफी सरल मामला है, क्योंकि यह सभी प्रकाश में शामिल स्रोतों की क्रमिक खोज के लिए नीचे आता है। बाद में, पर्यावरण से एक घटक प्रकाश मॉडल में दिखाई देगा, जिसे हम छवि पर ट्यूटोरियल
- आधारित प्रकाश व्यवस्था (
छवि-आधारित प्रकाश ,
IBL ) में काम करेंगे। अभिन्न के अनुमान से कोई बच नहीं सकता है, क्योंकि इस तरह के मॉडल में प्रकाश कई दिशाओं से आता है।
पीबीआर सतह मॉडल
आइए उस खंड shader से शुरू करें जो ऊपर वर्णित PBR मॉडल को लागू करता है। सबसे पहले, हम सतह के छायांकन के लिए आवश्यक इनपुट डेटा निर्धारित करते हैं:
#version 330 core out vec4 FragColor; in vec2 TexCoords; in vec3 WorldPos; in vec3 Normal; uniform vec3 camPos; uniform vec3 albedo; uniform float metallic; uniform float roughness; uniform float ao;
यहां आप सरलतम वर्टिकल शेडर का उपयोग करके गणना किए गए सामान्य इनपुट को देख सकते हैं, साथ ही वर्दी का एक सेट भी देख सकते हैं जो ऑब्जेक्ट की सतह विशेषताओं का वर्णन करता है।
इसके अलावा, shader कोड की शुरुआत में, हम गणना करते हैं जो Blinn-Fry प्रकाश व्यवस्था के कार्यान्वयन से परिचित हैं:
void main() { vec3 N = normalize(Normal); vec3 V = normalize(camPos - WorldPos); [...] }
प्रत्यक्ष प्रकाश
इस पाठ के उदाहरण में केवल चार बिंदु प्रकाश स्रोत हैं जो स्पष्ट रूप से दृश्य के विकिरण को निर्दिष्ट करते हैं। परावर्तन की अभिव्यक्ति को संतुष्ट करने के लिए, हम प्रत्येक प्रकाश स्रोत से गुजरते हैं, व्यक्तिगत ऊर्जा चमक की गणना करते हैं और इस योगदान को सारांशित करते हैं, साथ ही साथ BRDF मान और प्रकाश किरण की घटनाओं के कोण को संशोधित करते हैं। आप सतह पर इंटीग्रल के समाधान के रूप में इस पुनरावृत्ति की कल्पना कर सकते हैं
ओमेगा केवल विश्लेषणात्मक प्रकाश स्रोतों के लिए।
इसलिए, हम पहले प्रत्येक स्रोत के लिए परिकलित मानों की गणना करते हैं:
vec3 Lo = vec3(0.0); for(int i = 0; i < 4; ++i) { vec3 L = normalize(lightPositions[i] - WorldPos); vec3 H = normalize(V + L); float distance = length(lightPositions[i] - WorldPos); float attenuation = 1.0 / (distance * distance); vec3 radiance = lightColors[i] * attenuation; [...]
चूंकि गणना रैखिक स्थान में की जाती है (
गर्डर सुधार गर्डर के अंत में किया जाता है), दूरी के व्युत्क्रम वर्ग के अनुसार अधिक शारीरिक रूप से सही क्षीणन कानून का उपयोग किया जाता है:
मान लीजिए कि उलटा वर्ग का कानून अधिक शारीरिक रूप से सही है, भिगोना की प्रकृति को बेहतर ढंग से नियंत्रित करने के लिए, पहले से ही परिचित सूत्र का उपयोग करना काफी संभव है जिसमें स्थिर, रैखिक और द्विघात शब्द शामिल हैं।
इसके अलावा, प्रत्येक स्रोत के लिए, हम दर्पण कुक-टोरेंस BRDF के मूल्य की भी गणना करते हैं:
fracDFG4( omegao cdotn)( omegai cdotn)
पहला कदम स्पेक्युलर और डिफ्यूज़ प्रतिबिंब के बीच के अनुपात की गणना करना है, या, दूसरे शब्दों में, परावर्तित प्रकाश की मात्रा और सतह द्वारा अपवर्तित प्रकाश की मात्रा के बीच का अनुपात।
पिछले पाठ से, हम जानते हैं कि फ्रेस्नेल गुणांक की गणना क्या है:
vec3 fresnelSchlick(float cosTheta, vec3 F0) { return F0 + (1.0 - F0) * pow(1.0 - cosTheta, 5.0); }
Fresnel-Schlick सन्निकटन इनपुट पर पैरामीटर
F0 की अपेक्षा करता है, जो
प्रकाश की घटनाओं के शून्य कोण पर सतह प्रतिबिंब की
डिग्री दिखाता है, अर्थात। प्रतिबिंब की डिग्री, यदि आप सतह को सामान्य से ऊपर से नीचे तक देखते हैं।
F0 का मूल्य सामग्री के आधार पर भिन्न होता है और धातुओं के लिए एक रंग डाली का अधिग्रहण करता है, जैसा कि PBR सामग्री के कैटलॉग को देखकर देखा जा सकता है।
धातु वर्कफ़्लो प्रक्रिया (पीबीआर सामग्रियों की संलेखन प्रक्रिया, सभी सामग्रियों को डाइलेक्ट्रिक्स और कंडक्टरों की कक्षाओं में विभाजित करते हुए) के लिए, यह माना जाता है कि सभी
डाइलेक्ट्रिक्स F0 = 0.04 के निरंतर मूल्य पर काफी विश्वसनीय दिखते हैं, जबकि धातु
एफबेडो के आधार पर धातु
F0 के लिए सेट किया जाता है। कोड के रूप में:
vec3 F0 = vec3(0.04); F0 = mix(F0, albedo, metallic); vec3 F = fresnelSchlick(max(dot(H, V), 0.0), F0);
जैसा कि आप देख सकते हैं, कड़ाई से गैर-धातु सतहों के लिए,
F0 0.04 के बराबर सेट है। लेकिन एक ही समय में, यह आसानी से सतह के "धातुता" सूचकांक के आधार पर इस मूल्य से अल्बेडो मूल्य में बदल सकता है। यह संकेतक आमतौर पर एक अलग बनावट के रूप में प्रस्तुत किया जाता है (यहां से, वास्तव में,
धातु वर्कफ़्लो लिया जाता है,
लगभग। ट्रांस। )।
प्राप्त किया हुआ
एफ हमें सामान्य वितरण फ़ंक्शन के मूल्य की गणना करने की आवश्यकता है
डी और ज्यामिति कार्य करता है
जी :
विश्लेषणात्मक प्रकाश व्यवस्था के मामले के लिए फ़ंक्शन कोड:
float DistributionGGX(vec3 N, vec3 H, float roughness) { float a = roughness*roughness; float a2 = a*a; float NdotH = max(dot(N, H), 0.0); float NdotH2 = NdotH*NdotH; float num = a2; float denom = (NdotH2 * (a2 - 1.0) + 1.0); denom = PI * denom * denom; return num / denom; } float GeometrySchlickGGX(float NdotV, float roughness) { float r = (roughness + 1.0); float k = (r*r) / 8.0; float num = NdotV; float denom = NdotV * (1.0 - k) + k; return num / denom; } float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness) { float NdotV = max(dot(N, V), 0.0); float NdotL = max(dot(N, L), 0.0); float ggx2 = GeometrySchlickGGX(NdotV, roughness); float ggx1 = GeometrySchlickGGX(NdotL, roughness); return ggx1 * ggx2; }
सैद्धांतिक भाग में वर्णित एक से एक महत्वपूर्ण अंतर: यहां हम सीधे सभी निर्दिष्ट कार्यों के लिए खुरदरापन पैरामीटर पास करते हैं। यह प्रत्येक फ़ंक्शन को अपने तरीके से मूल खुरदरापन मूल्य को संशोधित करने में सक्षम करने के लिए किया जाता है। उदाहरण के लिए, डिज्नी अध्ययन, एपिक गेम्स से इंजन में परिलक्षित, ने दिखाया कि अगर हम ज्यामिति फ़ंक्शन और सामान्य वितरण फ़ंक्शन में खुरदरापन के वर्ग का उपयोग करते हैं, तो प्रकाश मॉडल अधिक नेत्रहीन सही परिणाम देता है।
सभी कार्यों को निर्धारित करने के बाद, कोई व्यक्ति सीधे एनडीएफ और जी के मूल्यों को प्राप्त कर सकता है:
float NDF = DistributionGGX(N, H, roughness); float G = GeometrySmith(N, V, L, roughness);
संपूर्ण कुक-टॉरेंस BRDF की गणना के लिए कुल मूल्य हमारे पास हैं:
vec3 numerator = NDF * G * F; float denominator = 4.0 * max(dot(N, V), 0.0) * max(dot(N, L), 0.0) + 0.001; vec3 specular = numerator / denominator;
कृपया ध्यान दें कि हम स्केलर उत्पाद को शून्य करने के मामलों में विभाजन को रोकने के लिए भाजक को 0.001 के न्यूनतम मूल्य तक सीमित करते हैं।
अब हम परावर्तकता समीकरण के लिए प्रत्येक स्रोत के योगदान की गणना करने के लिए आगे बढ़ते हैं। चूंकि Fresnel गुणांक सीधे एक चर है
Ks , तब हम एफ के मूल्य का उपयोग सतह के स्पेक्युलर प्रतिबिंब के स्रोत के योगदान को इंगित करने के लिए कर सकते हैं। मात्रा से
Ks प्राप्त किया जा सकता है और अपवर्तक सूचकांक
Kd :
vec3 kS = F; vec3 kD = vec3(1.0) - kS; kD *= 1.0 - metallic;
चूँकि हम प्रकाश ऊर्जा की मात्रा को परावर्तित सतह के रूप में दर्शाने वाली मात्रा
kS पर विचार करते हैं, इसे एकता से घटाते हुए, हम सतह द्वारा अपवर्तित प्रकाश
केडी की अवशिष्ट ऊर्जा प्राप्त करते हैं। इसके अलावा, चूंकि धातु प्रकाश को अपवर्तित नहीं करती हैं और पुनः उत्सर्जित प्रकाश का एक विसरित घटक नहीं है, इसलिए घटक
केडी को एक ऑल-मेटल सामग्री के लिए शून्य होने के लिए संशोधित किया जाएगा। इन गणनाओं के बाद, हमारे पास प्रकाश स्रोतों में से प्रत्येक द्वारा प्रदान किए गए प्रतिबिंब की गणना करने के लिए हाथ में सभी डेटा होंगे:
const float PI = 3.14159265359; float NdotL = max(dot(N, L), 0.0); Lo += (kD * albedo / PI + specular) * radiance * NdotL; }
अंतिम मूल्य
लो , या आउटगोइंग एनर्जी ब्राइटनेस, मूलतः चिंतनशीलता की अभिव्यक्ति का एक समाधान है, अर्थात्। सतह एकीकरण परिणाम
ओमेगा । इस मामले में, हमें सभी संभावित दिशाओं के लिए सामान्य रूप में अभिन्न को हल करने की कोशिश करने की आवश्यकता नहीं है, क्योंकि इस उदाहरण में केवल चार प्रकाश स्रोत हैं जो कि संसाधित होने वाले टुकड़े को प्रभावित करते हैं। यही कारण है कि सभी "एकीकरण" मौजूदा प्रकाश स्रोतों के एक सरल चक्र तक सीमित है।
यह केवल प्रत्यक्ष प्रकाश स्रोत की गणना के परिणामों के लिए पृष्ठभूमि प्रकाश घटक की समानता को जोड़ने के लिए बनी हुई है और टुकड़े का अंतिम रंग तैयार है:
vec3 ambient = vec3(0.03) * albedo * ao; vec3 color = ambient + Lo;
रैखिक प्रतिपादन और एचडीआर
अब तक, हमने मान लिया था कि सभी गणना एक रैखिक रंग के स्थान पर की जाती हैं, और इसलिए हमारे shader में अंतिम राग के रूप में
गामा सुधार का उपयोग किया जाता है। PBR के सही सिमुलेशन के लिए रेखीय स्थान में गणना करना बहुत महत्वपूर्ण है, क्योंकि मॉडल को सभी इनपुट डेटा की रैखिकता की आवश्यकता होती है। किसी भी पैरामीटर की रैखिकता सुनिश्चित करने की कोशिश न करें और छायांकन परिणाम गलत होगा। इसके अलावा, प्रकाश स्रोतों को वास्तविक स्रोतों के करीब विशेषताओं के साथ सेट करना अच्छा होगा: उदाहरण के लिए, उनके विकिरण और ऊर्जा चमक का रंग स्वतंत्र रूप से एक विस्तृत श्रृंखला में भिन्न हो सकता है। नतीजतन,
लो काफी आसानी से बड़े मूल्यों को स्वीकार कर सकता है, लेकिन अनिवार्य रूप से डिफ़ॉल्ट फ्रेम बफर के कम गतिशील रेंज (
LDR ) के कारण अंतराल [0., 1.] में कटऑफ के अंतर्गत आता है।
गामा सुधार से पहले एचडीआर मूल्यों के नुकसान से बचने के लिए, टोन संपीड़न का संचालन करना आवश्यक है:
color = color / (color + vec3(1.0)); color = pow(color, vec3(1.0/2.2));
परिचित रेनहार्ड ऑपरेटर का उपयोग यहां किया जाता है, जो हमें छवि के विभिन्न हिस्सों की बहुत ही बदलती विकिरण की स्थितियों के तहत एक व्यापक गतिशील रेंज बनाए रखने की अनुमति देता है। चूंकि यहां हम पोस्ट-प्रोसेसिंग के लिए एक अलग शेडर का उपयोग नहीं करते हैं, वर्णित ऑपरेशनों को केवल shader कोड के अंत में जोड़ा जा सकता है।
मैं दोहराता हूं कि पीबीआर के सही मॉडलिंग के लिए रैखिक रंग की जगह और एचडीआर रेंडरिंग के साथ काम करने की विशेषताओं को याद रखना और उन पर विचार करना बेहद जरूरी है। इन पहलुओं की उपेक्षा गलत गणना और नेत्रहीन परिणामों को जन्म देगी।
विश्लेषणात्मक प्रकाश व्यवस्था के लिए PBR shader
तो, एक साथ तानवाला संपीड़न और गामा सुधार के रूप में अंतिम स्पर्श के साथ, यह केवल टुकड़ा के अंतिम रंग को अंश shader के उत्पादन में स्थानांतरित करने के लिए रहता है और प्रत्यक्ष प्रकाश व्यवस्था के लिए PBR shader कोड पूरा माना जा सकता है। अंत में, हम इस shader के
मुख्य () फ़ंक्शन के पूरे कोड को देखते हैं:
#version 330 core out vec4 FragColor; in vec2 TexCoords; in vec3 WorldPos; in vec3 Normal;
मुझे उम्मीद है कि
सैद्धांतिक भाग को पढ़ने के बाद और चिंतनशील क्षमता की अभिव्यक्ति के आज के विश्लेषण के साथ, यह लिस्टिंग डराने वाली नहीं दिखेगी।
हम चार बिंदु प्रकाश स्रोतों वाले एक दृश्य में इस शेडर का उपयोग करते हैं, एक निश्चित संख्या में गोले जिनकी सतह की विशेषताएं क्षैतिज और ऊर्ध्वाधर अक्षों के साथ क्रमशः उनकी खुरदरापन और धातु की डिग्री को बदल देंगी। आउटपुट पर हमें निम्न चित्र मिलते हैं:
धातुता शून्य से एक से नीचे और ऊपर से खुरदरापन में बदलती है, लेकिन खुरदरापन बाएं से दाएं होता है। यह स्पष्ट हो जाता है कि केवल इन दो सतह विशेषताओं को बदलने से सामग्री की एक विस्तृत श्रृंखला स्थापित करना पहले से ही संभव है।
पूर्ण स्रोत कोड
यहाँ है ।
पीबीआर और टेक्सचरिंग
हम बनावट के रूप में विशेषताओं को संचारित करके अपने सतह मॉडल का विस्तार करेंगे। इस तरह, हम सतह सामग्री मापदंडों के प्रति-टुकड़ा नियंत्रण प्रदान कर सकते हैं:
[...] uniform sampler2D albedoMap; uniform sampler2D normalMap; uniform sampler2D metallicMap; uniform sampler2D roughnessMap; uniform sampler2D aoMap; void main() { vec3 albedo = pow(texture(albedoMap, TexCoords).rgb, 2.2); vec3 normal = getNormalFromNormalMap(); float metallic = texture(metallicMap, TexCoords).r; float roughness = texture(roughnessMap, TexCoords).r; float ao = texture(aoMap, TexCoords).r; [...] }
ध्यान दें कि सतह एल्बेडो बनावट आमतौर पर कलाकारों द्वारा sRGB रंग अंतरिक्ष में बनाई गई है, इसलिए ऊपर दिए गए कोड में हम टेक्सल रंग को रैखिक स्थान पर लौटाते हैं ताकि इसका उपयोग आगे की गणना में किया जा सके। इस बात पर निर्भर करता है कि कलाकार
परिवेश रोड़ा नक्शा डेटा वाले बनावट को कैसे बनाते हैं, इसे रैखिक स्थान पर भी लाया जा सकता है। धातुकर्म और खुरदरापन के नक्शे लगभग हमेशा रैखिक स्थान में बनाए जाते हैं।
PBR एल्गोरिथ्म के साथ संयोजन में निश्चित सतह मापदंडों के बजाय बनावट का उपयोग पहले से उपयोग किए गए प्रकाश एल्गोरिथ्म की तुलना में दृश्य विश्वसनीयता में उल्लेखनीय वृद्धि देता है:
पूर्ण बनावट उदाहरण कोड
यहां है , और उपयोग किए गए बनावट
यहां हैं (पृष्ठभूमि छायांकन बनावट के साथ)। मैं इस तथ्य पर आपका ध्यान आकर्षित करता हूं कि प्रत्यक्ष प्रकाश की स्थिति के तहत दृढ़ता से धातु की सतहों को गहरा दिखाई देता है, क्योंकि फैलाना प्रतिबिंब का योगदान छोटा है (सीमा में कोई भी नहीं है)। उनका छायांकन अधिक सही तब होता है जब पर्यावरण से प्रकाश के दर्पण प्रतिबिंब को ध्यान में रखते हुए, जो हम अगले पाठों में करेंगे।
फिलहाल, परिणाम कुछ PBR प्रदर्शनों जितना प्रभावशाली नहीं हो सकता है - फिर भी हमने अभी तक एक छवि-आधारित प्रकाश व्यवस्था (
IBL ) को लागू नहीं किया है। फिर भी, हमारे रेंडर को अब भौतिक सिद्धांतों पर आधारित माना जाता है और IBL के बिना भी, यह पहले की तुलना में अधिक विश्वसनीय तस्वीर दिखाता है।