"ডাইরেক্টএক্স 11 রেন্ডারিং ইন ব্যাটলফিল্ড 3" এর স্লাইডগুলির একটিতে পাওয়ার পয়েন্ট আমি নকলের কোডটি লক্ষ্য করেছি:
struct Light {
float3 pos; float sqrRadius;
float3 color; float invSqrRadius;
}
আমি বুঝতে পারি না কেন তারা কেবল ব্যাসার্ধগুলি সংরক্ষণের পরিবর্তে স্কোয়ার্ড ব্যাসার্ধ এবং এমনকি বিপরীত স্কোয়ার (যা আমি বিশ্বাস করি যে এটি কেবল 1-স্কোয়ার্ড ব্যাসার্ধ) সংরক্ষণ করবে? তারা কীভাবে এই গণনাগুলিতে এই ডেটা ব্যবহার করছে? তাছাড়া, শঙ্কু এবং লাইন লাইট সম্পর্কে কী? এই স্ট্রাক্টটি কেবলমাত্র পয়েন্ট লাইটের জন্যই হতে হবে, আমি এটি অন্যান্য ধরণের জন্য কাজ করতে দেখতে পাচ্ছি না - উত্সাহিত ডেটা নেই। তবুও আমি কীভাবে তারা সেই বর্গ এবং invSquare ব্যবহার করে তা জানতে চাই।
আপডেট: ঠিক আছে আমি শেষ পর্যন্ত এটি পেয়েছি।
সহজেই নেটে পাওয়া যায় এটি সর্বোত্তম হালকা সূক্ষ্ম সমীকরণ:
float3 lightVector = lightPosition - surfacePosition;
float attenuation = saturate(1 - length(lightVector)/lightRadius);
এটি তুলনামূলকভাবে ব্যয়বহুল হিসাবে length(lightVector)
আসলে এটি করছে:
length(lightVector) = sqrt(dot(lightVector, lightVector);
তদুপরি বিভাগ অপারেশনও (/lightRadius)
বেশ ব্যয়বহুল।
এইভাবে হালকা মনোযোগ গণনা করার পরিবর্তে আপনি নিম্নলিখিত পদ্ধতিতে এটি গুণতে পারেন, এটি আরও দ্রুত হবে:
attenuation = saturate(1 - dot(lightVector, lightVector)*invRadiusSqr);
যেখানে invRadiusSqr সিপিইউ পর্যায়ে প্রাক-গণনা করা যেতে পারে এবং শেডার ধ্রুবক হিসাবে পাস হতে পারে।
তদ্ব্যতীত, আপনি ফলস্বরূপ একটি চৌকো আলোর আলোকপাত পেয়েছেন (পূর্ববর্তী ক্ষেত্রে লিনিয়ার পরিবর্তে) যা আরও ভাল, কারণ আইআরএল আলো চতুষ্কোণ ফলফ দেখিয়েছে।
সাহায্যের জন্য সবাইকে ধন্যবাদ!