2 ডি রেন্ডারিংয়ের জন্য গভীরতার বাফারের সম্পূর্ণ রেজোলিউশন ব্যবহার করা


9

আমি একটি অর্থোগ্রাফিক প্রজেকশন ব্যবহার করে 2 ডি ইঞ্জিনের জন্য সামনের টু-ব্যাক রেন্ডারারের সাথে কাজ করছি। ওভারড্রা এড়াতে আমি গভীরতার বাফারটি ব্যবহার করতে চাই। আমার কাছে একটি 16-বিট গভীরতা বাফার রয়েছে, জেড = 0-তে একটি ক্যামেরা জেড = 0 দেখছে, জেডনিয়ারটি 1, এবং জেডএফআর 1000 হয় Each নীচে যা কিছু।

তবে আমি সচেতন যেভাবে জেড প্যাসিফিকেশনগুলি জেড বাফার মানগুলির সাথে সমাপ্ত হয় তা অ-রৈখিক। আমি 16-বিট গভীরতার বাফারের সম্পূর্ণ রেজোলিউশনটি ব্যবহার করতে চাই, অর্থাৎ 65536 অনন্য মানকে অনুমতি দিচ্ছি। সুতরাং রেন্ডার করা প্রতিটি স্প্রাইটের জন্য, আমি পরবর্তী অনন্য গভীরতার বাফার মানের সাথে সম্পর্কিত করতে জেড অবস্থানটি পরবর্তী অবস্থানে উন্নীত করতে চাই।

অন্য কথায় আমি স্প্রাইটের একটি ইনক্রিমেন্টিং ইনডেক্স (0, 1, 2, 3 ...) চালু করতে চাই প্রতিটি স্প্রাইটের জন্য একটি অনন্য গভীরতার বাফার মান থাকার জন্য উপযুক্ত জেড পজিশনে আঁকানো। আমি এর পিছনে গণিত সম্পর্কে নিশ্চিত নই। এটি করার জন্য গণনা কী?

দ্রষ্টব্য আমি ওয়েবজিএলে কাজ করছি (মূলত ওপেনজিএল ইএস 2), এবং আমার বিস্তৃত হার্ডওয়্যারকে সমর্থন করা দরকার, তাই যখন gl_FragDepth এর মতো এক্সটেনশনগুলি আরও সহজ করে তুলতে পারে, আমি সামঞ্জস্যের কারণে এটি ব্যবহার করতে পারি না।


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

@ ম্যাটএশ: ধারণাটি এই যে সমস্ত গণনাগুলি জিপিইউতে অত্যন্ত তীব্র গতিতে সম্পন্ন করা হয়, সুতরাং এটি করা বোধগম্য নয়।
পান্ডা পাইজামা

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

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

@ ম্যাটশেক: কেবল ব্লিটিংয়ের মাধ্যমে আপনি এত কিছু করতে পারেন। আবর্তন, স্কেলিং এবং বিকৃতকরণগুলি মাথায় আসে, তবে যেহেতু আপনার পিক্সেল / ভার্টেক্স ছায়াছবি রয়েছে তাই হার্ডওয়্যার দিয়ে আপনি যা করতে পারেন তার সীমাটি কেবল ব্লিটিংয়ের সাথে আপনি যা করতে পারেন তার চেয়ে অনেক বেশি।
পান্ডা পাইজামা

উত্তর:


5

প্রকৃতপক্ষে, জেড-বাফারে সংরক্ষিত মানগুলি আপনার বস্তুর আসল z স্থানাঙ্কের ক্ষেত্রে রৈখিক নয়, তবে তাদের পারস্পরিক ক্ষেত্রে, পিছনের বিমানের কাছাকাছি যা রয়েছে তার চেয়ে চোখের কাছাকাছি যা রয়েছে তার চেয়ে বেশি রেজোলিউশন দেওয়ার জন্য।

আপনি কি আপনার মানচিত্র zNearথেকে 0এবং আপনার zFarজন্য 1zNear=1এবং এর জন্য zFar=2এটি দেখতে হবে

Zbuffer

এটি গণনা করার উপায় দ্বারা সংজ্ঞায়িত করা হয়:

z_buffer_value = k * (a + (b / z))

কোথায়

 k = (1 << N), maximum value the Z buffer can store
 N = number of bits of Z precision
 a = zFar / ( zFar - zNear )
 b = zFar * zNear / ( zNear - zFar )
 z = distance from the eye to the object

... এবং z_buffer_value একটি পূর্ণসংখ্যা।

উপরে সমীকরণটি আপনার কাছে এই দুর্দান্ত পৃষ্ঠার সৌজন্যে নিয়ে আসে , যা জেড-বাফারগুলিকে সত্যিই ভাল উপায়ে ব্যাখ্যা করে।

সুতরাং, প্রদত্তটির প্রয়োজনীয় সন্ধানের zজন্য z_buffer_value, আমরা কেবল এটি সাফ করি z:

z = (k * b) / (z_buffer_value - (k * a))

উত্তরের জন্য ধন্যবাদ! যদিও আপনি আপনার চূড়ান্ত সূত্রটি পেয়েছিলেন আমি কিছুটা বিভ্রান্ত। যদি আমি গ্রহণ করি z_buffer_value = k * (a + (b / z))এবং কেবল সমাধানের জন্য পুনরায় সাজাইয়া রাখি zতবে আমি পাই: z = b / ((z_buffer_value / k) - a)- আপনি কীভাবে শেষের শেষ সূত্রে পৌঁছলেন?
অ্যাশলেব্রাইন 22'15

@ অ্যাশলেস ব্রেন: আপনি ডিনোমিনেটরকে নিয়ে যান (v / k) - a => (v - k * a) / kএবং এতে পতিত হন (k * b) / (v - (k * a))। এটি একই ফলাফল।
পান্ডা পাইজামা

আহ আমি দেখি. উত্তরের জন্য ধন্যবাদ, এটি দুর্দান্তভাবে কাজ করছে!
অ্যাশলেব্রাইন 22'15

0

সম্ভবত আপনার কিছু সহজ করার জন্য আপনার দৃষ্টিভঙ্গি পরিবর্তন করা উচিত। আমি কি করতাম; আপনার জেড গভীরতার জিনিস রাখুন, তবে আপনি যা সরবরাহ করেন তার একটি তালিকা রাখুন। Z গভীরতার মানের উপর ভিত্তি করে সেই তালিকাটি অর্ডার করুন এবং তালিকার ক্রমে অবজেক্টগুলি রেন্ডার করুন।

আশা করি এটি সাহায্য করতে পারে। লোকেরা সবসময় আমাকে সরল রাখতে বলে।


1
দুঃখিত, এটি খুব একটা সাহায্যকারী নয়। আমি ইতিমধ্যে এটি করছি। জেড পজিশনগুলি কী নির্বাচন করবেন তা নিয়ে প্রশ্ন।
অ্যাশলেব্রেইন

0

যেহেতু আপনার কাছে ইতিমধ্যে রেন্ডার করার জন্য জিনিসগুলির একটি সাজানো তালিকা রয়েছে (সামনে থেকে পিছনে) আপনার কি আসলেই জেড ইনডেক্সটি বাড়ানোর প্রয়োজন? আপনি কি "চেকিং ফাংশন" এর জন্য "কম বা সমান" ব্যবহার করতে পারবেন না? এইভাবে এটি নির্দিষ্ট পিক্সেলটি ইতিমধ্যে আঁকা আছে কিনা তা পরীক্ষা করে দেখবে।


"কম বা সমতুল্য" তবুও একেবারে সমস্ত কিছুকে ওভারড্রন করার কারণ করবে, কারণ সবসময় সর্বদা একটি সমান জেড সূচক থাকে এবং অতএব গভীরতা পরীক্ষা পাস করে।
অ্যাশলেব্রাইন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.