আলোক গণনার জন্য স্কোয়ার্ড ব্যাসার্ধ এবং বিপরীত স্কোয়ারেস ব্যাসার্ধের কী কী উপকার?


16

"ডাইরেক্টএক্স 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 সিপিইউ পর্যায়ে প্রাক-গণনা করা যেতে পারে এবং শেডার ধ্রুবক হিসাবে পাস হতে পারে।

তদ্ব্যতীত, আপনি ফলস্বরূপ একটি চৌকো আলোর আলোকপাত পেয়েছেন (পূর্ববর্তী ক্ষেত্রে লিনিয়ার পরিবর্তে) যা আরও ভাল, কারণ আইআরএল আলো চতুষ্কোণ ফলফ দেখিয়েছে।

সাহায্যের জন্য সবাইকে ধন্যবাদ!


13
প্যাডিং। শেডারগুলি 16 বাইটস সারিবদ্ধ হয়। এবং যদি আপনি কোডটি কীভাবে গঠন করা হয় তা একবার দেখুন, আপনি দেখতে পাবেন যে এটি দুটি ফ্লোট 4 এ প্যাক হয়ে যাবে। আপনি যখন ক্যাশে থেকে ফ্রি পেয়ে যাবেন তখন কিছু ব্যবহারযোগ্য কেন সঞ্চয় করবেন না?
টর্ডিন

উত্তর:


23

এটি কেবলমাত্র এক ধরণের অপ্টিমাইজেশন যা প্রদত্ত invSqrRadius = 1/SqrRadiusপ্রতিটি বারের জন্য বিপরীত স্কোয়ার ব্যাসার্ধ গণনার পরিবর্তে তারা কেবল এটি ক্যাশে করে রাখার পরিবর্তে, কারণটি হ'ল কমপক্ষে গুণনের সাথে তুলনা করার সময় বিভাগটি সাধারণত "ধীর" অপারেশন হয়।

এই অপ্টিমাইজেশন বিশেষত প্রাসঙ্গিক:

  • যখন প্রতিটি আলোর জন্য অপারেশনটি প্রচুর পরিমাণে করা হয়ে থাকে, সুতরাং মানটি ক্যাশে করলে অতিরিক্ত সিপিইউ / জিপিইউ চক্র মুক্ত হবে
  • এবং মানটি পড়ার জন্য মেমরি অ্যাক্সেসের সময় ধরে ধরে নেওয়া আসলে এটি পুনরায় গণনার চেয়ে দ্রুত।

এটি কীভাবে ব্যবহৃত হয় সে সম্পর্কে, আমি তাদের নির্দিষ্ট প্রয়োগ সম্পর্কে নিশ্চিত নই, তবে সম্পর্কিত 1/sqrRadius, এটি কেবল হালকা আলোকপাত, ফলঅফ এবং ক্লুলিংয়ের জন্য ব্যবহৃত হয়। এটি দিকনির্দেশক এবং স্পটলাইটের জন্যও প্রাসঙ্গিক, স্পটলাইটের ক্ষেত্রে কেবলমাত্র পার্থক্য হ'ল মনোযোগ প্রয়োগের পরে স্পটলাইট ফ্যাক্টরটি আপনাকে গণনা করতে হবে । সূর্যের মতো দিকনির্দেশক আলো সম্পর্কে, এটিতে সাধারণত কোনও মনোযোগ বা ফলঅফ থাকে না, তাই আমি অনুমান করব যে এটি উপেক্ষা করা হবে।

[Edit] আরও সম্প্রসারিত, এটা না অপ্রাসঙ্গিক তথ্য। নীচের সমীকরণটি ব্যবহার করে হালকা ইরেডিয়েন্স গণনা করা যায়:

= ফি / 4 * পাই * আরএসকিআর;

কোথায়

ফ্লাক্সের ক্ষেত্রের ঘনত্ব।

ফি হ'ল তেজস্বী প্রবাহ।

4 * পাই * আরএসকিআর একটি গোলকের পৃষ্ঠতল ক্ষেত্র।

এই সমীকরণটি ব্যাখ্যা করে যে প্রাপ্ত শক্তির পরিমাণ স্কোয়ার দূরত্বের সাথে কেন বন্ধ হয়।

আরেকটি বিষয় হ'ল আপনাকে একটি নির্দিষ্ট শীর্ষবিন্দুতে আলোক অবদান গণনা করতে শীর্ষবিন্দু এবং আলোর মধ্যকার দূরত্ব গণনা করতে হবে (এই মানটি ক্যাশে হওয়ার সম্ভাবনা নেই), শীর্ষবিন্দু আলোক সীমাতে বা বাইরে থাকতে পারে যা আমাদের পরবর্তী বিন্দুতে নিয়ে আসে যেখানে Radius Squareculling জন্য দরকারী।

আপনি যদি হালকা ফ্যালঅফ এবং কুলিং গণনা করার জন্য ব্যবহারিক উদাহরণ চান তবে এটি টাইলযুক্ত বেসড ডিফার্ড রেন্ডারগুলিতে বিশেষভাবে কার্যকর, এখানে একটি উদাহরণ


অভিশাপ, আপনি আমাকে 7 সেকেন্ডের দ্বারা মারলেন! ;) (এবং আরও ব্যাপক উত্তরের সাথেও!)
ট্রেভর পাওয়েল

বিস্তারিত মন্তব্যের জন্য ধন্যবাদ, লিঙ্কটির জন্য এসএসপি! পরবর্তী লিঙ্কটি থেকে আমি যা বুঝতে পেরেছি তা থেকে, ব্যাটলফিল্ড 3 ব্যাসার্ধ নয় বরং আলোর উত্স এবং আলো গ্রহণের মধ্যে প্রকৃত দূরত্বটি সংরক্ষণ করে? নিবন্ধটিতে তারা "ডি" মানটি ব্যবহার করে।
কিউবারম্যান

@ কিউবারম্যান কোড না দেখে অনুমান করা শক্ত। আমার অনুমান যে এটি বিপরীত ব্যাসার্ধএসকিউআর। এবং তারা যে সমীকরণগুলি ব্যবহার করে সেগুলি নিবন্ধের থেকে বিস্তৃত হতে পারে।
ধারণা

তবে আমাকে বলুন, আপনি কীভাবে আলোকের গণনায় খালি উল্টানো হালকা ব্যাসার্ধ ব্যবহার করতে পারেন? নেটে প্রাপ্ত প্রতিটি উত্স আমাকে বলেছে যে গ্রহনকারী পৃষ্ঠ এবং আলোর উত্সের মধ্যে আমাকে DISTANCE সন্ধান করা উচিত, মূল আলোক ব্যাসার্ধের মধ্যবর্তী অংশটি বিভক্ত করুন এবং তারপরে ফলাফলটি বর্গাকার করুন। আপনি কখন স্কোয়ার্ড ব্যাসার্ধ বা ইনভ্যাস্ক্রেরিয়াস ব্যবহার করবেন? এটি আমার কাছে সম্পূর্ণ অপ্রাসঙ্গিক ডেটা বলে মনে হচ্ছে।
কিউবারম্যান

1
@ কুবারম্যান উত্তর আপডেট করেছেন।
ধারণা

6

invSqrRadius 1 নয় - sqrRadius; এটি 1 / sqrRadius।

এর অর্থ হল যে আপনি এসকিআরআরডিয়াস দ্বারা ভাগ করার পরিবর্তে, এনএসকিআরআরডিয়াস দিয়ে গুণ করতে পারবেন (বিভাগটি সাধারণত গুণনের চেয়ে অনেক বেশি ব্যয়বহুল)


6

এখানে অন্যান্য উত্তরগুলি বিপরীত বর্গাকার ব্যাসার্ধের সাথে মোকাবিলা করেছে, তবে আমি পরিবর্তে বর্গাকার ব্যাসার্ধটি দেখতে যাচ্ছি (যা ধারণা 3d স্পর্শ করেছে, তবে আমি বিশ্বাস করি এটি আরও আলোচনার যোগ্য হবে)।

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

যদি sqrt (x)> sqrt (y) হয় তবে এটি x> y এরও ক্ষেত্রে।

একটি আলোর জন্য, স্কোয়ার্ড ব্যাসার্ধটি আলোর কেন্দ্রের মধ্যবর্তী দূরত্বের সমান এবং এটি সর্বোচ্চ সীমা - অবশ্যই স্কোয়ার্ড।

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

আমি অবশ্যই জানি না যে এটি বিএফ 3 এটির জন্য ঠিক কী ব্যবহার করছে তবে আমি আশা করব যে আমি খুব বেশি দূরে নেই।


সুতরাং আমি যদি আপনাকে সঠিকভাবে বুঝতে পারি তবে কোডটি হ'ল: যদি (ডট ((লাইটপোস - সারফেসপোস)), (লাইটপোস - সারফেসপোস)> লাইটরেডিউসকিআর) আলোকসজ্জা করে না, তাই না?
কিউবারম্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.