मैं एकता में दिन / रात चक्र के लिए 2 लाइटमैप कैसे मिश्रण कर सकता हूं?


16

इससे पहले कि मैं कुछ और कहूं: मैं दोहरे लाइटमैप का उपयोग कर रहा हूं, जिसका अर्थ है कि मुझे पास और दूर दोनों को मिश्रण करने की आवश्यकता है।

इसलिए मैं अभी कुछ समय के लिए इस पर काम कर रहा हूं, मेरे पास पूरे दिन / रात का चक्र रेंडरर्स और लाइटिंग के लिए सेट है, और सब कुछ ठीक काम कर रहा है और गहन प्रक्रिया नहीं है।

एकमात्र समस्या यह है कि मुझे पता चल रहा है कि मैं दो लाइटमैप को एक साथ कैसे मिला सकता हूं, मुझे पता चला है कि लाइटमैप कैसे स्विच किया जाए, लेकिन समस्या यह है कि एक तरह का अचानक और अनुभव को बाधित करता है।

मैंने इस पर घंटों शोध किया है, सभी प्रकार के शेड्स की कोशिश की है, पिक्सेल सम्मिश्रण द्वारा पिक्सेल, और बाकी सब कुछ वास्तविक लाभ के लिए नहीं। C # में पिक्सेल सम्मिश्रण से पिक्सेल मेरी पसंद के हिसाब से थोड़ी प्रक्रिया के रूप में बदल गया, हालाँकि मैं अभी भी इसे साफ करने और इसे अधिक सुचारू रूप से चलाने पर काम कर रहा हूँ। शेड्स आशाजनक लग रहे थे, लेकिन मुझे एक ऐसा शेडर नहीं मिला जो दो लाइटमैप को ठीक से मिश्रण कर सके।

क्या किसी के पास कोई सुराग है कि मैं इसे कैसे पूरा कर सकता हूं? मुझे बस अपने दिन और रात के लाइटमैप के बीच किसी प्रकार के सुचारु संक्रमण की आवश्यकता है। शायद मैं दो बनावट को ओवरले कर सकता हूं और एक अल्फा चैनल का उपयोग कर सकता हूं? या कुछ इस तरह का?


यदि आपके पास Pro है, तो शायद आप दो लाइटमैप टेक्सचर को तीसरे में रेंडर कर सकते हैं, और फिर इस तीसरे टेक्सचर को लाइटमैप के रूप में इस्तेमाल कर सकते हैं? यह पिक्सेल सम्मिश्रण की तरह होना चाहिए, लेकिन बड़े पैमाने पर तेजी से।
बात नहीं

मेरे पास प्रो। मैं दो लाइटमैप बनावट को एक साथ प्रस्तुत करने के बारे में कैसे जाऊंगा? यह मेरा मुख्य नेतृत्व था लेकिन मैं इसे पूरा करने के लिए कोड / प्रक्रिया का पता लगाने की कोशिश कर रहा हूं।
टिमोथी विलियम्स

उम्म एक ऐसी सामग्री बनाते हैं जो दो बनावटों को मिश्रित करती है, Graphics.Blit()इसे प्रस्तुत करने के लिए उपयोग करें? मैंने ऐसा कभी नहीं किया है, लेकिन मैनुअल में देखना, यह काम करना चाहिए।
बात नहीं

तो एक नई सामग्री बनाएं जो दो टेक्स्ट को आउटपुट में मिला सकती है, अफार -1 और बीफेर -1 को लागू कर सकती है, फिर लाइटमैप वेरिएबल के लिए आउटगोइंग टेक्सचर का उपयोग कर सकती है?
टिमोथी विलियम्स

हाँ कुछ इस तरह से। मैं इसका परीक्षण करूंगा, लेकिन मेरे पास फिलहाल प्रो संस्करण तक पहुंच नहीं है।
बात नहीं

जवाबों:


3

इसलिए मैंने हाल ही में इस पर अपना हाथ आजमाया और उन्हीं मुद्दों को लेकर आप लोगों के पास गया। रेंडर टेक्सचर सॉल्यूशन एक लाल हेरिंग का एक सा है। मैं इसे अलग धागे पर मल्टीथ्रेडिंग पिक्सेल हेरफेर का उपयोग करके हल करने में सक्षम था।

https://www.youtube.com/watch?v=T_zpFk1mdCI

इसलिए आमतौर पर graphics.blit()जहां कहीं भी जाने की जरूरत होती है, वहां रेंडर टेक्सचर का इस्तेमाल करते हैं और पास करते हैं, लेकिन लाइटमैप डेटा बनावट का समर्थन नहीं करता है, उन्हें बनावट 2ds की आवश्यकता होती है। अगला तार्किक कदम डेटा को बनावट 2 डी पर कॉपी करना और फिर लाइटमैप डेटा को फीड करना होगा। यह तकनीक फ्रेम दर को बर्बाद कर देती है क्योंकि यह केवल डेटा के संदर्भ के बजाय सीपीयू को डेटा भेजने के लिए GPU को रोक रहा है।

समाधान तो GPU का उपयोग नहीं करने के लिए है।

लाइट मैप ट्रांज़िशन समय की लंबी अवधि में होता है, इसलिए यह आवश्यक नहीं है कि हर फ्रेम में लाइट मैप को अपडेट किया जाए। तथ्य की बात के रूप में, खिलाड़ियों को शायद ध्यान नहीं होगा यदि प्रकाश मानचित्र केवल खेल के समय में हर 20-40 मिनट में अपडेट किए गए थे।

तो आप क्या करते हैं आप प्रत्येक प्रकाश मानचित्र के लिए अलग-अलग थ्रेड पर सीपीयू को कार्य जारी करते हैं।

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

https://www.youtube.com/watch?v=ja63QO1Imck

आपको बस एक श्रमिक थ्रेड क्लास बनाने की ज़रूरत है जो कलर सरण में लाइटमैप पिक्सेल डेटा की प्रतियों को बदलता है, और फिर एक मिश्रण फ़ंक्शन बनाता है।

एक रंग से अगले करने के लिए एक साधारण लार्प करेंगे।

फिर धागा बनाएं, इसे शुरू करें, और जब सभी थ्रेडमैप अलग-अलग थ्रेड में समाप्त हो जाते हैं तो आप पिक्सेल डेटा को लाइटमैप डेटा बनावट 2 डी में वापस कॉपी कर सकते हैं।

मैंने नीचे कुछ उदाहरण कोड पोस्ट किए हैं। यह निश्चित रूप से पूरी तरह से लागू किया गया संस्करण नहीं है, लेकिन यह आपको क्लास बनाने, थ्रेड बनाने और फिर लाइटडाटा सेट करने की मुख्य अवधारणाओं को दिखाता है।

अन्य चीजें जो आपको करनी होंगी, वह लाइटमैप्स को अपडेट करने के लिए हर बार एक फ़ंक्शन कॉल करना है। इसके अलावा, आपको या तो शुरुआत में या संकलन समय पर सभी पिक्सेल डेटा को कार्यकर्ता वर्ग में कॉपी करना होगा। जो भी इसे पाता है, उसे शुभकामनाएं। मुझे पता है कि ऑप उनके जीवन के साथ आगे बढ़ गया है, लेकिन मुझे पता है कि इसी तरह की समस्याओं वाले अन्य लोग इस पर ठोकर खा सकते हैं।

public class work
{
    Color[] fromPixels;
    Color[] toPixels;

    public float LerpValue = 0;
    public bool Finished = false;
    public Color[] mixedPixels;

    public work(Color[] FromPix, Color[] ToPix)
    {
        fromPixels= FromPix;
        toPixels= ToPix;
        Finished = false;
        mixedPixels = new Color[FromPix.Length];
    }
    public void DoWork()
    {
        for (int x = 0; x < fromPixels.Length; x++)
        {
            mixedPixels[x] = Color.Lerp(fromPixels[x], toPixels[x], LerpValue);
        }
        Finished = true;
    }
}

IEnumerator LightMapSet()
{
    Thread workerThread = new Thread(someworker.DoWork);
    someworker.LerpValue = lerpValue;
    workerThread.Start();
    yield return new WaitUntil(() => someworker.Finished);
    mixedMap.SetPixels(someworker.mixedPixels);
    mixedMap.Apply(true);
    LightmapData someLightmapData;
    someLightmapData.lightmapColor = mixedMap;
    lightDatas = { someLightmapData};
    LightmapSettings.lightmaps = lightDatas;
}

1

एक स्काईबॉक्स शेडर है जो स्काईबॉक्स टेक्सचर के दो सेटों के बीच मिश्रण करता है। दिन और रात का चक्र सोचो!

यदि आप स्क्रिप्ट से स्काईबॉक्स का निर्माण या चेतन करना चाहते हैं, तो उपयोग करें skyboxmaterial.SetFloat("_Blend", yourBlend) तो सम्मिश्रण को बदलने के लिए करें; SetTextureबनावट को बदलने या बदलने के लिए सामग्री कार्यों का भी उपयोग कर सकते हैं।

दिन / रात चक्र के बारे में वीडियो ट्यूटोरियल: http://www.youtube.com/watch?v=FTfv9JhkmIA

उदाहरण कोड निम्नानुसार है:

Shader "RenderFX/Skybox Blended" {
Properties {
    _Tint ("Tint Color", Color) = (.5, .5, .5, .5)
    _Blend ("Blend", Range(0.0,1.0)) = 0.5
    _FrontTex ("Front (+Z)", 2D) = "white" {}
    _BackTex ("Back (-Z)", 2D) = "white" {}
    _LeftTex ("Left (+X)", 2D) = "white" {}
    _RightTex ("Right (-X)", 2D) = "white" {}
    _UpTex ("Up (+Y)", 2D) = "white" {}
    _DownTex ("Down (-Y)", 2D) = "white" {}
    _FrontTex2("2 Front (+Z)", 2D) = "white" {}
    _BackTex2("2 Back (-Z)", 2D) = "white" {}
    _LeftTex2("2 Left (+X)", 2D) = "white" {}
    _RightTex2("2 Right (-X)", 2D) = "white" {}
    _UpTex2("2 Up (+Y)", 2D) = "white" {}
    _DownTex2("2 Down (-Y)", 2D) = "white" {}
}

SubShader {
    Tags { "Queue" = "Background" }
    Cull Off
    Fog { Mode Off }
    Lighting Off        
    Color [_Tint]
    Pass {
        SetTexture [_FrontTex] { combine texture }
        SetTexture [_FrontTex2] { constantColor (0,0,0,[_Blend]) combine texture lerp(constant) previous }
        SetTexture [_FrontTex2] { combine previous +- primary, previous * primary }
    }
    Pass {
        SetTexture [_BackTex] { combine texture }
        SetTexture [_BackTex2] { constantColor (0,0,0,[_Blend]) combine texture lerp(constant) previous }
        SetTexture [_BackTex2] { combine previous +- primary, previous * primary }
    }
    Pass {
        SetTexture [_LeftTex] { combine texture }
        SetTexture [_LeftTex2] { constantColor (0,0,0,[_Blend]) combine texture lerp(constant) previous }
        SetTexture [_LeftTex2] { combine previous +- primary, previous * primary }
    }
    Pass {
        SetTexture [_RightTex] { combine texture }
        SetTexture [_RightTex2] { constantColor (0,0,0,[_Blend]) combine texture lerp(constant) previous }
        SetTexture [_RightTex2] { combine previous +- primary, previous * primary }
    }
    Pass {
        SetTexture [_UpTex] { combine texture }
        SetTexture [_UpTex2] { constantColor (0,0,0,[_Blend]) combine texture lerp(constant) previous }
        SetTexture [_UpTex2] { combine previous +- primary, previous * primary }
    }
    Pass {
        SetTexture [_DownTex] { combine texture }
        SetTexture [_DownTex2] { constantColor (0,0,0,[_Blend]) combine texture lerp(constant) previous }
        SetTexture [_DownTex2] { combine previous +- primary, previous * primary }
    }
}

Fallback "RenderFX/Skybox", 1
}

2
लाइटबॉक्स के बारे में पूछा गया सवाल, स्काईबॉक्स नहीं। लिंक के लिए धन्यवाद, हालांकि ऐसा लगता है कि यह मेरे लिए उपयोगी होगा।
मजाक

0

यदि आप जानते हैं कि कैसे स्विच करना है, तो पृष्ठभूमि थ्रेड पर कई ट्रांज़िशन लाइटमैप बनाने के साथ क्यों नहीं जाना है, और फिर लाइटमैप तैयार होने पर संक्रमण को सक्षम करें?

आप AssetStore पर एक दिलचस्प संपत्ति पर भी नज़र डाल सकते हैं: https ://www.assetstore.unity3den/en/#/content/5674

मुझे लगता है कि इसमें लाइटमैप सम्मिश्रण शामिल है, हालांकि मुझे नहीं पता कि कैसे।

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