मॉडल के चारों ओर अजीब सफेद रूपरेखा


19

मैं XNA 4 में एक गेम पर काम कर रहा हूं और मैंने हाल ही में इस गाइड के बाद एक स्थगित छायांकन कार्यान्वयन पर स्विच किया है । एक अजीब सफेद रूपरेखा अब मेरे मॉडल पर दिखाई दे रही है और मुझे यकीन नहीं है कि यह क्या कारण है। मैंने सोचा कि शायद यह सामान्य रेंडर टारगेट या डेप्थ रेंडर टारगेट पर सटीक की कमी थी, लेकिन 32 (कलर) के बजाय 64 बिट्स (Rgba64) को बढ़ाने में मदद नहीं की। मैंने यह भी सोचा कि यह स्पेक्युलर गणना के साथ कुछ समस्या हो सकती है इसलिए मैंने स्पेक्युलर को 0 पर सेट करने की कोशिश की, लेकिन इससे भी मदद नहीं मिली। PIX में पिक्सेल को डिबग करना दिखाता है कि उस पिक्सेल के लिए लगभग सफेद के रूप में विसरित मूल्य की गणना की जा रही है। कोई विचार? मैंने नीचे दी गई समस्या की एक तस्वीर शामिल की, इसे पूर्ण आकार में देखना आसान है।

पिक्सेल शेडर:

float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
{
    input.ScreenPosition.xy /= input.ScreenPosition.w;

    float2 texCoord = 0.5f * (float2(input.ScreenPosition.x, -input.ScreenPosition.y) + 1) - halfPixel;

    float4 normalData = tex2D(normalSampler, texCoord);

    //Transform normal back into [-1, 1] range
    float3 normal = normalize(2.0f * normalData.xyz - 1.0f);

    float specularPower = normalData.a;
    float specularHardness = tex2D(colorSampler, texCoord).a * 255;
    float depthVal = tex2D(depthSampler, texCoord).r;

    //Compute screen-space position
    float4 position = float4(input.ScreenPosition.xy, depthVal, 1.0f);

    //Transform to world space
    position = mul(position, InvertViewProjection);
    position /= position.w;

    //Surface-to-light vector
    float3 lightVector = lightPosition - position;

    float3 projectedTexCoords = position - lightPosition;
    projectedTexCoords = mul(projectedTexCoords, float3x3(
                            float3(-1, 0, 0),
                            float3(0, 1, 0),
                            float3(0, 0, 1)));

    float distanceToLight = length(lightVector) / lightRadius;
    float shadow = ShadowContribution(projectedTexCoords, distanceToLight);

    float attenuation = saturate(1.0f - distanceToLight);

    lightVector = normalize(lightVector);

    //Compute diffuse light
    float normalDotLight = max(0, dot(normal, lightVector));
    float3 diffuseLight = normalDotLight * Color.rgb;

    float3 reflectionVector = normalize(reflect(-lightVector, normal));
    float3 directionToCamera = normalize(cameraPosition - position);
    float specularLight = specularPower * pow(saturate(dot(reflectionVector, directionToCamera)), specularHardness);

    return shadow * attenuation * lightIntensity * float4(diffuseLight.rgb, specularLight);
}

संपादित करें : JPG के बारे में क्षमा करें, stackexchange के अपलोडर ने अपने दम पर किया है। रॉय टी: मैंने वास्तव में एक्सएनए 3 से बदले हुए हिस्सों के लिए ट्यूटोरियल के आपके एक्सएनए 4 रूपांतरण का संदर्भ दिया था। चूँकि मैंने कोड में कोई बड़ा बदलाव नहीं किया था, इसलिए मुझे लगा कि यह बग मूल में मौजूद है, लेकिन चारों ओर घूम रही इतनी सारी लाइटों को देखना असंभव था, इसलिए मैंने सभी को हटा दिया लेकिन एक लाइट और बग फिर से दिखाई दिया (देखें छिपकली की कोहनी के पास)

यहाँ मेरे दृश्य के लिए GBuffer सामग्री दी गई है:

रंगीन बफ़र: गहराई बफ़र: सामान्य बफ़र: अंतिम रेंडर:

Edit2 :

मैं इस समस्या पर संदेह करना शुरू कर रहा हूं जब यह कलर मैप का नमूना होता है तो CombineFinal.fx है। यह सफेद पिक्सेल के ठीक ठीक रंगीन पिक्सेल के लिए अभिकलन है:

diffuseColor        : (0.435, 0.447, 0.412)
diffuseLight        : (1.000, 1.000, 0.902)
light               : (1.000, 1.000, 0.902, 0.000)
PixelShaderFunction : (0.435, 0.447, 0.371, 1.000)
specularLight       : 0.000

और यह सीधे उसके बगल में एक अनुचित रंगीन सफेद पिक्सेल से आउटपुट है:

diffuseColor        : (0.824, 0.792, 0.741)
diffuseLight        : (1.000, 1.000, 0.902)
light               : (1.000, 1.000, 0.902, 0.000)
PixelShaderFunction : (0.824, 0.792, 0.669, 1.000)
specularLight       : 0.000

डिफ्यूज़कोलर एकमात्र अंतर है, और यह रंग सीधे रंग के नक्शे से लिया जाता है। शायद बनावट की गणना में एक मामूली त्रुटि से नमूना करने के लिए समन्वय है?

प्रकाश पास:


4
कृपया ऐसा न करें कि कोई ऐसा स्क्रीनशॉट न लगाएं जो एक सूक्ष्म ग्राफिकल गड़बड़ दिखा रहा है। लोग समस्या को पूर्ण प्रजनन में देखना चाहेंगे।
आआआआआआआआआआआ आआआआ आआआआ

ठीक है, जेपीईजी संपीड़न वास्तव में काफी अच्छी तरह से मुझे लगता है, एक पिक्सेल केवल और केवल तब के माध्यम से गड़बड़ करता है जब कुछ चीजें फिर से जुड़ जाती हैं (जेड-डेप्थ में बड़ा अंतर और प्रकाश सभी पिक्सल पर उच्च) है। सौभाग्य, आस्थगित प्रतिपादन काफी तकनीकी है।
वालमंड

2
यकीन नहीं होता अगर यह मदद करता है, लेकिन आप कोड / ट्यूटोरियल के बहुत पुराने संस्करण का उपयोग कर रहे हैं, तो कैटलिन ज़िमा का वास्तविक कोड / ट्यूटोरियल अब है: catalinzima.com/tutorials/deferred-rendering-in-xna और एक स्वीकृत XNA4.0 संस्करण यहाँ स्थित है: roy-t.nl/index.php/2010/12/28/…
रॉय टी।

हमेशा की तरह डिबगिंग रेंडरिंग डिबगिंग के साथ, क्या आप सभी बफ़र्स से स्क्रीनशॉट पोस्ट कर सकते हैं? यह शायद प्रकाश बफर में है, लेकिन यह कुछ और हो सकता है।
रॉय टी।

मेरी वृत्ति यह है कि यह एल्गोरिथ्म के हिस्से के साथ एक मुद्दा होगा जो बिल्कुल 90 डिग्री के कोण को संभालता है, लेकिन आगे काम देखने के लिए मुझे ode के साथ खेलना होगा।
जोर्डन माइलोनस

जवाबों:


4

मेरे पास मेरे मॉडलों के आसपास भी यह सफेद रूपरेखा या "हेलो" था, जब मैंने अपने स्वयं के आस्थगित रेंडर पर शुरू किया था। समस्या यह थी कि रेंडर टारगेट को ओवरले करने के लिए बनावट ऑफ़सेट वैल्यू सही से सेटअप नहीं थी। -0.5 पिक्सेल के बजाय ऑफसेट के लिए कुछ बनावट को +0.5 पिक्सेल पर सेट करने की आवश्यकता है।

यह कुछ बनावट के मूल्यों के बंटवारे के बाद ही था कि रूपरेखाएं चली गईं। सबसे अधिक संभावना है कि यह प्रकाश व्यवस्था में से एक है।

संपादित करें: वैसे मैंने कैटालिन ज़िमा के ट्यूटोरियल से भी सीखा, जो आपके उदाहरण की एक शाखा है, इसलिए इसे काम करना चाहिए।


हाँ, यह बात थी। मैंने इसे हल्का छायादार में सभी समन्वय नमूने के लिए + आधाPixel में बदल दिया और प्रभामंडल अब चला गया है।
टेलानोर

0

मुझे यकीन नहीं है कि वास्तव में क्या हो रहा है, लेकिन कुछ चीजों को दोबारा जांचना है:

  1. सुनिश्चित करें कि जी-बफ़र्स का नमूना लेते समय आपको बनावट फ़िल्टरिंग बंद हो गई है - कोई बिलिनियर या अनिसोट्रोपिक या कुछ भी नहीं।

  2. मैं देखता हूं कि आप बनावट के निर्देशांक में आधे पिक्सेल की ऑफसेट जोड़ रहे हैं; डबल-चेक करें कि यह सही है। मैं XNA से परिचित नहीं हूं कि यह जानना सही है कि सही ऑफसेट क्या होना चाहिए, लेकिन आपको इसे एक shader लिखकर चेक करना चाहिए जो G- बफ़र्स में से किसी एक का नमूना लेता है और सिर्फ नमूने का आउटपुट करता है। इसके बाद आगे और पीछे फ्लिप करें और जी-बफर को सीधे स्क्रीन पर प्रदर्शित करें। यदि आपको सही ऑफ़सेट मिला है, तो आपको कोई अंतर नहीं देखना चाहिए, एक पिक्सेल भी नहीं।


मैं गया और GBuffer से संबंधित सभी चीजों को POINT में बदल दिया (मेरा मानना ​​है कि फ़िल्टरिंग को अक्षम करता है?) और अभी भी वही है। अपने दूसरे बिंदु के बारे में, GBuffer को सीधे आउटपुट देना बिल्कुल वैसा ही नहीं होगा: एक ऐसा शेडर बनाएं जो सिर्फ डेटा को आउटपुट करता हो? क्या आप उस पर थोड़ा और विस्तार कर सकते हैं?
टेलानोर

खैर, आपने ऊपर जी-बफर के स्क्रीनशॉट कैसे उत्पन्न किए? मुझे लगता है कि आप जी-बफर से स्क्रीन (बैक बफर) में एक-एक करने के लिए पिक्सेल को कॉपी करने के लिए किसी तरह के अंतर्निहित एपीआई फ़ंक्शन को कॉल करते हैं? (मैं XNA नहीं जानता, इसलिए मुझे नहीं पता कि इसे क्या कहा जाएगा।) मैं कह रहा हूं, एक पिक्सेल shader के आउटपुट के लिए बिल्ट-इन-वन-टू-वन कॉपी फ़ंक्शन के आउटपुट की तुलना करें एक-से-एक प्रतिलिपि ... इस तरह से आप सुनिश्चित कर सकते हैं कि बनावट निर्देशांक बिल्कुल सही हैं और आप वास्तव में एक-से-एक नमूना प्राप्त कर रहे हैं
नाथन रीड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.