কোনও ইনপুট জ্যামিতি ছাড়াই জ্যামিতি শেডারে আদিম উত্পন্ন করার কোনও উপায় আছে কি?


17

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

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

সুতরাং, ওপেনজিএলকে কোনও ইনপুট জ্যামিতি ছাড়াই জ্যামিতি শেডার থেকে একটি রেন্ডারিং পাস শুরু করতে বলার উপায় আছে কি? বা জিনিসগুলি চলতে পেতে আমাকে সবসময় কিছু ডামি পয়েন্ট জিপিইউতে পাঠাতে হবে?

উত্তর:


15

না, এটি করার কোনও উপায় নেই।

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

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

তবে আপনি যা করেছেন তা প্রতিটি গ্রিড কোষের জন্য একটি বিন্দু রেন্ডারিং করে এবং সেখান থেকে মার্চিং কিউবস ত্রিভুজগুলি তৈরি করা হুবহু সোজা-সামনের পদ্ধতি approach অবশ্যই এই কোষের মধ্যে যা রয়েছে তার বৈশিষ্ট্যগুলি আপনার উপর নির্ভর করে, এটি 3 ডি পজিশন হতে পারে, একটি টেক্সডর্ড 3 ডি টেক্সচারে যাই হোক না কেন, তবে সেগুলি আপনার রেন্ডার গ্রিড কোষ। খাঁটি শব্দার্থগতভাবে বলা হয়, আপনি আসলে সেই বিন্দুগুলিকে "বাতিল" করেন না এবং তারপরে এগুলি ত্রিভুজ দ্বারা "প্রতিস্থাপন" করেন, আপনি প্রতিটি পয়েন্টকে ত্রিভুজগুলির একটি সেটে "রূপান্তর" করেন। জ্যামিতি শেডারটি ঠিক এটির জন্য এবং এটি সম্পর্কে "হ্যাকি" বা "অনুচিত" কিছুই নেই। Noone বলেছেন জ্যামিতি shader একই আউটপুট আদিম টাইপ জেনারেট করতে হিসাবে "সঠিক" হতে ইনপুট করেছে


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

সুতরাং, অতীতের দিকে দৃষ্টিপাত আমি শুরু থেকে আমার বক্তব্যের relativate উচিত: আপনি যে কোনো ইনপুট ছাড়াই প্রিমিটিভের জেনারেট করতে পারবেন না প্রিমিটিভের , কিন্তু আপনি ছাড়া কোনো ইনপুট তাদের তৈরি করতে পারেন জ্যামিতি

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