ইউনিটিতে দিন / রাতের চক্রের জন্য আমি কীভাবে 2 টি লাইট ম্যাপ মিশ্রণ করব?


16

আমি অন্য কিছু বলার আগে: আমি দ্বৈত লাইটম্যাপ ব্যবহার করছি, যার অর্থ আমার খুব কাছাকাছি এবং দূরবর্তী দুটি মিশ্রিত করা দরকার।

সুতরাং আমি এখন কিছুক্ষণের জন্য এটি নিয়ে কাজ করছি, আমার কাছে রেন্ডার এবং আলো জ্বালানোর জন্য একটি পুরো দিন / রাত্রি চক্র সেট আপ করা হয়েছে এবং সবকিছুই নিখুঁতভাবে প্রক্রিয়াজাত নয় এবং কাজ করছে।

আমি যে সমস্যাটি করছি তা হ'ল আমি কীভাবে দুটি লাইট ম্যাপ একসাথে মিশ্রিত করতে পারি, লাইটম্যাপগুলি কীভাবে স্যুইচ করতে হবে তা আমি বের করে ফেলেছি, তবে সমস্যাটি হ'ল আকস্মিক দেখায় এবং অভিজ্ঞতাকে বাধা দেয়।

আমি এটি নিয়ে কয়েক ঘন্টা গবেষণা করেছি, সব ধরণের শেডার, পিক্সেল মিশ্রণে পিক্সেল এবং অন্য কোনও কিছুই ব্যবহার করতে পারিনি। সি # তে পিক্সেল মিশ্রণ দ্বারা পিক্সেলটি আমার পছন্দ অনুসারে কিছুটা নিবিড় প্রক্রিয়া হিসাবে প্রমাণিত হয়েছে, যদিও আমি এখনও এটি পরিষ্কার করে এটিকে আরও সুচারুভাবে চালানোর জন্য কাজ করছি। শেডারগুলি আশাব্যঞ্জক লাগছিল, তবে আমি এমন একটি শেডার পেলাম না যা সঠিকভাবে দুটি লাইট ম্যাপ মিশ্রিত করতে পারে।

আমি কীভাবে এটি সম্পাদন করতে পারি তার কারও কি কোনও নেতৃত্ব আছে? আমার দিনের সময় এবং রাতের আলো হালকা মানচিত্রের মধ্যে আমার কিছুটা মসৃণ রূপান্তর দরকার। সম্ভবত আমি দুটি টেক্সচারটি ওভারলে করে এবং একটি আলফা চ্যানেল ব্যবহার করতে পারি? নাকি এরকম কিছু?


আপনার যদি প্রো থাকে, তবে আপনি দুটি লাইটম্যাপ টেক্সচারকে তৃতীয় হিসাবে রেন্ডার করতে পারেন, এবং তারপরে এই তৃতীয় টেক্সচারটি লাইটম্যাপ হিসাবে ব্যবহার করতে পারেন? এটি ঠিক পিক্সেল মিশ্রণের মতো হওয়া উচিত, তবে ব্যাপকভাবে দ্রুত।
20:33

আমার কাছে প্রো আছে আমি দুটি লাইটম্যাপ টেক্সচার একসাথে উপস্থাপনা সম্পর্কে কীভাবে যাব? এটি আমার প্রধান নেতৃত্ব ছিল তবে আমি এটি সম্পাদন করার জন্য কোড / প্রক্রিয়াটি বের করার চেষ্টা করছি।
টিমোথি উইলিয়ামস

উম্ম এমন একটি উপাদান তৈরি করুন যা দুটি টেক্সচারকে মিশ্রিত করে, Graphics.Blit()এটি রেন্ডার করতে ব্যবহার করে? আমি এটি কখনই করি নি, তবে ম্যানুয়ালটি দেখে এটি কাজ করা উচিত।
কিছু মনে করবেন না

সুতরাং একটি নতুন উপাদান তৈরি করুন যা আউটপুটে দুটি টেক্সচার মিশ্রিত করতে পারে, আফার -1 এবং বিফার -1 প্রয়োগ করুন, তারপরে লাইটম্যাপ ভেরিয়েবলের জন্য বহির্গামী টেক্সচারটি ব্যবহার করবেন?
টিমোথি উইলিয়ামস

হ্যাঁ, এরকম কিছু। আমি এটি পরীক্ষা করে দেখি তবে এই মুহুর্তে আমার কাছে প্রো সংস্করণে অ্যাক্সেস নেই।
কিছু মনে করবেন না

উত্তর:


3

সুতরাং আমি সম্প্রতি এটিতে আমার হাতটি চেষ্টা করেছিলাম এবং আপনার ছেলেরা যে একই সমস্যাগুলি পেয়েছি into রেন্ডার টেক্সচার সলিউশনটি একটি রেড হেরিং of আমি আলাদা থ্রেডে মাল্টিথ্রেডিং পিক্সেল ম্যানিপুলেশন ব্যবহার করে এটি সমাধান করতে সক্ষম হয়েছি।

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

সুতরাং সাধারণভাবে graphics.blit()রেন্ডার টেক্সচারটি যেখানেই যেতে হবে সেখানে ব্যবহার করা হবে এবং লাইটম্যাপ ডেটা টেক্সচার সমর্থন করে না, তাদের টেক্সচার 2 ডিএস প্রয়োজন। পরবর্তী যৌক্তিক পদক্ষেপটি হবে কোনও টেক্সচার 2 ডি তে ডেটা অনুলিপি করা এবং তারপরে লাইটম্যাপের ডেটাতে ফিড করা। এই কৌশলটি ফ্রেম রেটগুলিকে নষ্ট করে দেয় কারণ এটি সিপিইউতে ডেটা কেবলমাত্র উল্লেখের চেয়ে ডেটা প্রেরণে জিপিইউ স্টল করছে st

সমাধানটি তখন জিপিইউ ব্যবহার না করা।

দীর্ঘ সময় ধরে হালকা মানচিত্রের স্থানান্তর ঘটে তাই প্রতিটি ফ্রেমের হালকা মানচিত্র আপডেট করা অগত্যা গুরুত্বপূর্ণ নয়। প্রকৃতপক্ষে, খেলোয়াড়রা সম্ভবত খেয়াল করবেন না যদি হালকা মানচিত্রগুলি প্রতি খেলার সময় প্রতি 20-40 মিনিটে আপডেট হয়।

সুতরাং আপনি যা করছেন তা হ'ল প্রতিটি হালকা মানচিত্রের জন্য পৃথক থ্রেডে সিপিইউতে টাস্কটি প্রকাশ করা।

সাধারণত ityক্য মাল্টিথ্রেডিং সমর্থন করে না। তবে এটি ঠিক আছে, সি # করে। এই লোকটি অসাধারণ কাজটি ইউনিটিতে মাল্টিথ্রেডিংয়ের ব্যাখ্যা দেয়, সুতরাং আপনি যদি এটির কথাটি কখনও শুনেন নি, বা Unক্যতে কীভাবে মাল্টিথ্রেড করবেন তা কখনই জানতেন না এটি এই ভিডিও:

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

আপনাকে যা করতে হবে তা হ'ল একটি কর্মী থ্রেড বর্গ তৈরি করা যা কালার অ্যারেগুলিতে লাইটম্যাপ পিক্সেল ডেটার অনুলিপি পরিবর্তিত করে এবং তারপরে একটি মিশ্রণ ফাংশন তৈরি করে।

এক রঙ থেকে পরের রঙের জন্য একটি সরল লির্প করবে।

তারপরে থ্রেডটি তৈরি করুন, এটি শুরু করুন, এবং সমস্ত লাইটম্যাপগুলি পৃথক থ্রেডে সমাপ্ত হলে আপনি পিক্সেল ডেটা লাইটম্যাপ ডেটা টেক্সচার 2 ডি তে আবার অনুলিপি করতে পারবেন।

আমি নীচে কিছু উদাহরণ কোড পোস্ট। এটি অবশ্যই পুরোপুরি বাস্তবায়িত সংস্করণ নয়, তবে এটি আপনাকে ক্লাস তৈরির, থ্রেডটি তৈরি করার এবং লাইটডেটা সেট করার মূল ধারণাটি দেখায় shows

আপনার অন্যান্য যে কাজগুলি করতে হবে তা হ'ল লাইট ম্যাপগুলি আপডেট করার ট্রিগার করার জন্য প্রায়শই একটি ফাংশন কল করা। এছাড়াও আপনাকে হয় শুরুতে বা সংকলনের সময়ে পিক্সেল সংক্রান্ত সমস্ত ডেটা শ্রমিক শ্রেণিতে কপি করতে হবে। এই যে কেউ এটি শুভকামনা। আমি অনুভব করি যে অপটি তাদের জীবন নিয়ে এগিয়ে গেছে তবে আমি জানি যে একই ধরণের সমস্যাযুক্ত অন্যান্য ব্যক্তিরা এটি নিয়ে হোঁচট খেতে পারে।

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

আপনি যদি কীভাবে স্যুইচ করতে জানেন, কেন পটভূমির থ্রেডে সংখ্যক ট্রানজিশন লাইটম্যাপ তৈরি করতে যাবেন না, এবং যখন লাইটম্যাপস প্রস্তুত হবে তখন ট্রানজিশনগুলি সক্ষম করবেন?

আপনি অ্যাসেটস্টোরের একটি আকর্ষণীয় সম্পদটিও দেখতে পারেন: https://www.assetstore.unity3d.com/en/#!/content/5674

আমার ধারণা এটিতে লাইটম্যাপস মিশ্রণ রয়েছে, যদিও আমি উপায়টি জানি না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.