একটি ভাল টেক্সচার প্যাকিং অ্যালগরিদম কী? প্রযুক্তিগতভাবে, বিন প্যাকিং হ'ল এনপি-হার্ড , সুতরাং একটি হিউরিস্টিক হ'ল আমি সত্যই পরে আছি।
একটি ভাল টেক্সচার প্যাকিং অ্যালগরিদম কী? প্রযুক্তিগতভাবে, বিন প্যাকিং হ'ল এনপি-হার্ড , সুতরাং একটি হিউরিস্টিক হ'ল আমি সত্যই পরে আছি।
উত্তর:
আমি একটি চাকরিতে কয়েক মাস অতিবাহিত করেছি একটি ভাল টেক্সচার প্যাকিং অ্যালগরিদম নিয়ে এসেছি।
আমরা যে অ্যালগরিদমটি দিয়ে শুরু করি তা সাধারণ ছিল। সমস্ত ইনপুট আইটেম সংগ্রহ করুন। মোট পিক্সেল সেবন করে বড়-থেকে-ছোট করে সেগুলি সাজান। আপনার টেক্সচারে স্ক্যানলাইন ক্রমে এগুলি রাখুন, কেবল শীর্ষ বাম পিক্সেল থেকে শীর্ষস্থানীয় পিক্সেলের স্টাফগুলি পরীক্ষা করুন, একটি লাইন নীচে সরানো এবং প্রতিটি সফল প্লেসমেন্টের পরে শীর্ষ বাম পিক্সেলে পুনরায় সেট করা e
হয় আপনাকে প্রস্থকে হার্ডকোড করতে হবে বা এর জন্য আর কোনও হিউরিস্টিকের সাথে আসা উচিত। বর্গক্ষেত্র সংরক্ষণের প্রয়াসে, আমাদের অ্যালগরিদমটি 128 থেকে শুরু হবে, তারপরে এটি 128 দ্বারা বৃদ্ধি করা হবে যতক্ষণ না এটির ফলাফল আসে যা প্রশস্তের চেয়ে গভীর ছিল না।
সুতরাং, আমাদের সেই অ্যালগরিদম ছিল এবং আমি এটি উন্নত করার সিদ্ধান্ত নিয়েছি। আমি একগুচ্ছ অদম্য হিউরিস্টিকস চেষ্টা করেছি - এমন বস্তুগুলিকে একসাথে ফিট করার চেষ্টা করার চেষ্টা করেছি, কাঙ্ক্ষিত স্পেস প্যাকিংয়ের বৈশিষ্ট্যগুলির একগুচ্ছ উপর কিছুটা ওজন করা, ঘোরানো এবং উল্টানো। আমার সমস্ত কাজ শেষে, আক্ষরিকভাবে তিন মাস কাজ করার পরে, আমি 3% স্থান সঞ্চয় করে শেষ করেছি।
হ্যাঁ। 3%।
এবং এটির পরে আমাদের সংকোচনের রুটিনটি চালানোর পরে এটি প্রকৃতপক্ষে বড় হয়ে যায় (যা আমি এখনও ব্যাখ্যা করতে পারি না) তাই আমরা পুরো জিনিসটি বাইরে ফেলে দিয়ে পুরানো অ্যালগরিদমে ফিরে যাই।
আইটেমগুলি বাছাই করুন, স্ক্যানলাইন ক্রমে টেক্সচারে জাম। আপনার অ্যালগোরিদম আছে। এটি কোড করা সহজ, দ্রুত চালানো এবং আপনি আশ্চর্য পরিমাণে কাজ ছাড়া আরও ভাল কিছু পাবেন না। আপনার সংস্থা কমপক্ষে 50 জন বড় এবং সম্ভবত আরও বেশি লোক না হলে এই কাজটি সার্থক নয় ।
এবং একটি পার্শ্ব নোট হিসাবে, আমি ঠিক আপনি ঠিক যে একই অ্যাপ্লিকেশনটি করছেন ঠিক সেই একই প্রয়োগের জন্য এই অ্যালগরিদম (নির্দিষ্ট প্রস্থ 512 পিক্সেল) বাস্তবায়িত করেছি (কোনও ফলগেল নয়, ওপেনগল-রেন্ডার ফ্রেইটাইপ গ্লাইফস) এখানে) ফলাফল এখানে। এটি অস্পষ্ট দেখাচ্ছে কারণ খনি ভালভের দূরত্ব-ক্ষেত্র ভিত্তিক পাঠ্য রেন্ডারিং অ্যালগরিদম ব্যবহার করছে যা গ্লাইফগুলির মধ্যে অতিরিক্ত স্থানের জন্যও দায়ী। স্পষ্টতই, খুব বেশি খালি জায়গা বাকি নেই, এবং এটি জিনিসগুলিকে উন্মুক্ত দাগগুলিতে ছড়িয়ে দেওয়ার ভাল কাজ করে।
এর জন্য সমস্ত কোড বিএসডি-লাইসেন্সযুক্ত এবং গিথুবে উপলভ্য ।
অ্যান্ড্রিয়া লোডির পিএইচডি থিসিসকে দুটি মাত্রিক বিন প্যাকিং এবং অ্যাসাইনমেন্ট সমস্যার জন্য অ্যালগরিদম শিরোনাম দেওয়া হয়েছে ।
থিসিস এই সমস্যার কয়েকটি শক্ত রূপকে অতিক্রম করে। ভাগ্যক্রমে, টেক্সচার প্যাকিং সবচেয়ে সহজ সংস্করণ। তিনি যে সেরা অ্যালগরিদম খুঁজে পেলেন তাকে বলা হয়েছিল টাচিং পেরিমিটার ।
52 পৃষ্ঠা থেকে উদ্ধৃতি:
স্পর্শ প্যারিমিটার (টিপিআরএফ) নামে অ্যালগরিদমটি আইটেমকে নন-ক্রেসিংয়ের অঞ্চল অনুসারে বাছাই করে শুরু করা হয় (নন-ক্রেইজিং মিন j wj, hj} মান দ্বারা সম্পর্কগুলি ভেঙে) এবং অনুভূমিকভাবে ওরিয়েন্টিং করে। অনুকূল সমাধানের মানটির উপর একটি নিম্ন সীমাবদ্ধ এলকে গণনা করা হয় এবং এল খালি বিনগুলি আরম্ভ করা হয়। (পূর্ববর্তী বিভাগে অবিচ্ছিন্ন নিম্নগামী এল 0 ডি fi এনড স্পষ্টতই 2BP | আর | এফের জন্যও বৈধ; ডেল'অ্যামিকো, মার্তেলো এবং ভিগো [better 56] দ্বারা আরও ভাল সীমানা প্রস্তাব করা হয়েছে)) অ্যালগরিদম একবারে একটি আইটেম প্যাক করে একটি বিদ্যমান বাক্সে, বা একটি নতুন শুরু করে। একটি বিন মধ্যে প্যাক প্রথম আইটেম সর্বদা নীচে বাম কোণে স্থাপন করা হয়। পরবর্তী প্রতিটি আইটেম তথাকথিত স্বাভাবিক অবস্থানে ভরপুর থাকে (দেখুন ক্রিস্টোসেস এবং হুইটলক [41]),
বিন এবং প্যাকিং অবস্থানের পছন্দটি স্কোরকে মূল্যায়নের মাধ্যমে করা হয়, বিন এবং ইতিমধ্যে প্যাক হওয়া অন্যান্য আইটেমগুলির স্পর্শকৃত আইটেমের ঘেরের শতাংশ হিসাবে fi এই কৌশলটি এমন নিদর্শনগুলির পক্ষে রয়েছে যেখানে প্যাক করা আইটেমগুলি ছোট ছোট অঞ্চলগুলিকে "ফাঁদ" দেয় না, যা আরও স্থানের জন্য ব্যবহার করা কঠিন হতে পারে। প্রতিটি পরীক্ষার্থী প্যাকিং পজিশনের জন্য দুটি আইটেমের অভিমুখীকরণের জন্য স্কোর দুটিবার মূল্যায়ন করা হয় (যদি উভয়ই সম্ভব হয়) এবং সর্বোচ্চ মান নির্বাচন করা হয়। স্কোরের সম্পর্কগুলি সর্বাধিক প্যাকড ক্ষেত্রযুক্ত বিনটি চয়ন করে ভেঙে যায়। সামগ্রিক অ্যালগরিদম নিম্নরূপ।touching_perimeter: sort the items by nonincreaseing w,h values, and horizontally orient them; comment: Phase 1; compute a lower bound L on the optimal solution value, and open L empty bins; comment: Phase 2; for j := 1 to n do score := 0; for each normal packing position in an open bin do let score1 and score2 be scores with tow orientations; score := max{score,score1,score2}; end for; if score > 0 then pack item j in the bin, position and orientation corresponding to score; else open a new bin and horizontally pack item j into i; end if; end for; end;
আগ্রহের পাশাপাশি, কাগজটি একটি অনুকূল প্যাকযুক্ত টেক্সচার মানচিত্রের আকার নির্ধারণ করতে একটি অ্যালগরিদম বর্ণনা করে। এটি একটি 1024x1024 অ্যাটলাসে সমস্ত টেক্সচারের মাপসই করা সম্ভব কিনা তা নির্ধারণে এটি কার্যকর হবে।
যদি এখনও কেউ আগ্রহী হন তবে আমি সম্পূর্ণরূপে রেকটপ্যাক 2 ডি লাইব্রেরিটি আবার লিখলাম যাতে এটি আরও দক্ষ হয়।
এটি std::vector
প্রাথমিক পর্যায়ে কিছু প্রাথমিক আকার (সাধারণত কোনও নির্দিষ্ট জিপিইউতে সর্বাধিক অনুমোদিত টেক্সচারের আকার) দিয়ে শুরু করে, প্রথম কার্যক্ষম খালি স্থানটি বিভক্ত করে এবং স্প্লিটগুলি ভেক্টরটিতে ফিরে সংরক্ষণ করে কাজ করে।
পারফরম্যান্স ব্রেকথ্রুটি পুরো গাছটিকে রাখার পরিবর্তে কেবল একটি ভেক্টর ব্যবহার করে তৈরি হয়েছিল, যেমনটি আগে করা হয়েছিল।
প্রক্রিয়াটি বিস্তারিতভাবে README তে বর্ণিত হয়েছে ।
লাইব্রেরিটি এমআইটির অধীনে রয়েছে, সুতরাং আপনি যদি এটি দরকারী মনে করেন তবে আমি আপনার জন্য খুশি!
3.50GHz @ ইন্টেল (আর) কোর (টিএম) i7-4770K সিপিইউতে পরীক্ষা করা হয়েছিল। বাইনারিটি -03 স্যুইচ ব্যবহার করে ঝনঝন 6.0.0 দিয়ে নির্মিত হয়েছিল।
রানটাইম: 4 মিলিসেকেন্ডগুলি নষ্ট
পিক্সেল: 15538 (0.31% - 125 x 125 বর্গের সমতুল্য)
আউটপুট (2116 x 2382):
রঙে:
(কালো স্থান নষ্ট)
রানটাইম: 3.5 - 7 এমএস নষ্ট
পিক্সেল: 9288 (1.23% - একটি 96 x 96 বর্গের সমতুল্য)
আউটপুট (866 x 871):
রঙে:
(কালো স্থান নষ্ট)
একটি ভাল হিউরিস্টিক অ্যালগরিদম এখানে পাওয়া যাবে । যখন আমি সম্প্রতি কিছু অনুরূপ চেষ্টা করছিলাম, আমি বেশিরভাগ বাস্তবায়নের জন্য এটি প্রাথমিক সূচনা পয়েন্ট হিসাবে উল্লেখ করেছি।
প্রচুর নিয়মিত আকারের, অনুরূপ আকারের আইটেমগুলির সাথে বা ছোট এবং কম বড় চিত্রগুলির একটি ভাল মিশ্রণ সহ বিশেষত ভাল কাজ করে। ভাল ফলাফল অর্জনের জন্য সর্বোত্তম পরামর্শটি হ'ল চিত্রের আকারের ক্ষেত্রে আপনার ইনপুটটিকে বাছাই করা, তারপরে বৃহত্তম থেকে ছোট পর্যন্ত প্যাক করুন কারণ ছোট চিত্রগুলি বৃহত্তর চিত্রগুলির আশেপাশের জায়গাগুলিতে প্যাক করবে। আপনি কীভাবে এই বাছাই করবেন তা আপনার লক্ষ্যগুলির উপর নির্ভর করতে পারে। আমি 1 ম অর্ডার সমীকরণ হিসাবে ক্ষেত্রের পরিবর্তে ঘের পরিধি ব্যবহার করেছি যেহেতু আমি দেখেছি যে লম্বা + পাতলা / সংক্ষিপ্ত + প্রশস্ত চিত্রগুলি (যা নিম্ন অঞ্চল হবে) পরে একটি প্যাকের উপরে পরে রাখা খুব শক্ত, তাই আপনি ঘেরিত ঘেরটি ব্যবহার করে এই বিজোড় আকারগুলি ক্রমের সামনের দিকে।
আমার ওয়েবসাইট ইমেজ ডাম্প ডিরেক্টরি থেকে র্যান্ডম সেটগুলিতে আমার প্যাকারের জন্য আউটপুটটির নমুনা ভিজ্যুয়ালাইজেশন এখানে রয়েছে:
স্কোয়ারের সংখ্যাগুলি গাছের ধারণকৃত ব্লকের আইডি এর ফলে আপনাকে সন্নিবেশের ক্রমটি ধারণা দেয়। প্রথমটি আইডি "3" কারণ এটি প্রথম পাতার নোড (কেবল পাতাগুলিতে চিত্র থাকে) এবং ফলস্বরূপ 2 জন বাবা-মা থাকে)।
Root[0]
/ \
Child[1] Child[2]
|
Leaf[3]
আমি যে কিছু ব্যবহার করেছি, যা অনিয়মিত ইউভি মানচিত্রের জন্যও ভাল কাজ করে তা হ'ল ইউভি প্যাচটিকে বিটম্যাপ মাস্কে পরিণত করা এবং টেক্সচারের জন্য নিজেই একটি মুখোশ বজায় রাখা, ইউভি প্যাচটি যে প্রথম স্থানে মাপসই হবে তার প্রথম সন্ধান করে। আমি কিছু সাধারণ হিউরিস্টিক (উচ্চতা, প্রস্থ, আকার, যাই হোক না কেন) অনুযায়ী ব্লকগুলি অর্ডার করি এবং আমি নির্বাচিত হিউরিস্টিককে ব্লকগুলির আবর্তনকে ছোট বা সর্বাধিকতর করতে দেয়। এটি ব্রুট ফোর্সের জন্য একটি পরিচালনাযোগ্য অনুসন্ধান-স্থান দেয়।
আপনি যদি আবার পুনরুক্ত করতে পারেন যে বেশ কয়েকটি হিউরিস্টিক্স চেষ্টা করে, এবং / অথবা ক্রমটি বেছে নেওয়ার এলোমেলো ফ্যাক্টর প্রয়োগ করে এবং কিছু সময়সীমা শেষ না হওয়া পর্যন্ত পুনরাবৃত্তি করতে পারে।
এই স্কিমের সাহায্যে আপনি ছোট UV দ্বীপগুলি বৃহত্তর দ্বারা তৈরি শূন্যস্থানগুলিতে প্যাক করে পাবেন এবং এমনকি একক UV প্যাচগুলির মধ্যে থাকা গর্তগুলিতেও।
আমরা সম্প্রতি একটি অজগর স্ক্রিপ্ট প্রকাশ করেছি যা একটি নির্দিষ্ট আকারের একাধিক চিত্র ফাইলে টেক্সচার প্যাক করবে।
আমাদের ব্লগ থেকে উদ্ধৃত:
"অনলাইনে পাওয়া যায় এমন অসংখ্য প্যাকার রয়েছে এমন সময়ে, আমাদের অসুবিধাটি ছিল একাধিক ডিরেক্টরিতে বিপুল সংখ্যক চিত্র হ্যান্ডেল করতে পারে এমন কোনও সমস্যা খুঁজে পাওয়া। সুতরাং আমাদের নিজস্ব আটলাস প্যাকার জন্মগ্রহণ করেছিল!
যেমনটি, আমাদের ছোট স্ক্রিপ্টটি বেস ডিরেক্টরিতে শুরু হবে এবং সমস্ত .PNG গুলি একটি অ্যাটলাসে লোড করবে। যদি সেই অ্যাটলাস পূর্ণ হয় তবে এটি একটি নতুন তৈরি করে। তারপরে, নতুন ছবিতে কোনও জায়গা খুঁজে পাওয়ার আগে এটি পূর্ববর্তী সমস্ত অ্যাটলাসে বাকী চিত্রগুলি ফিট করার চেষ্টা করবে। এইভাবে, প্রতিটি অ্যাটলাস যথাসম্ভব শক্ত করে তৈরি করা হয়েছে। অ্যাটলাসগুলির নাম তাদের ফোল্ডারগুলির ভিত্তিতে করা হয়েছে that
আপনি আটলাসের আকার (লাইন 65), প্যাক করতে চান এমন চিত্রগুলির বিন্যাস (লাইন 67), লোড ডিরেক্টরি (লাইন 10) এবং সেভ ডিরেক্টরিটি (লাইন 13) পাইথনের কোনও অভিজ্ঞতা ছাড়াই মোটামুটি সহজেই পরিবর্তন করতে পারবেন। একটি ছোট দাবি অস্বীকার হিসাবে, আমাদের ইঞ্জিনের সাথে বিশেষত কাজ করার জন্য কয়েক দিনের মধ্যে এটি একত্রে বেত্রাঘাত করা হয়েছিল। আমি আপনাকে বৈশিষ্ট্যগুলির অনুরোধ করতে, আপনার নিজস্ব প্রকরণের সাথে মন্তব্য করতে এবং কোনও ত্রুটির প্রতিবেদন করতে উত্সাহিত করছি, তবে আমার ফ্রি সময়ে স্ক্রিপ্টে কোনও পরিবর্তন ঘটবে। "
সম্পূর্ণ উত্স কোডটি এখানে নিখরচায় চেক করুন: http://www.retroaffect.com/blog/159/ ইমেজ_আ্যাটলাস_প্যাকার /# বি
ফন্টগুলি প্যাক করা বেশ সহজ কারণ গ্লাইফ টেক্সচারের সমস্ত (বা বিরাট সংখ্যাগরিষ্ঠ) প্রায় একই আকারের। আপনার কাছে ঘটে যাওয়া সবচেয়ে সহজ কাজটি করুন এবং এটি সর্বোত্তমের খুব কাছাকাছি থাকবে।
আপনি যখন খুব ভিন্ন আকারের চিত্রগুলি প্যাক করেন তখন চালাকি আরও গুরুত্বপূর্ণ হয়ে ওঠে। তারপরে আপনি শূন্যস্থান ইত্যাদিতে প্যাক করতে সক্ষম হতে চান তবুও, যদিও আগে আলোচনা করা স্ক্যানলাইন অর্ডার অনুসন্ধানের মতো একটি সাধারণ অ্যালগরিদম খুব যুক্তিসঙ্গত ফলাফল আনবে।
উন্নত অ্যালগোসের কোনওটিই যাদু নয়। এগুলি সরল আলগো চেয়ে 50% বেশি দক্ষ না হয়ে থাকে এবং আপনার কাছে টেক্সচার শিটগুলির অলস সংখ্যা না থাকলে আপনি তাদের কাছ থেকে ধারাবাহিক সুবিধা পাবেন না। এটি কারণ যে ভাল অ্যালগরিদমগুলি যে ছোট ছোট উন্নতি করে তা কেবল সামগ্রিকভাবে দেখা যায়।
সহজ হয়ে যান এবং এমন কিছুতে যান যেখানে আপনার প্রচেষ্টা আরও ভাল প্রতিদান পাবে
যদি এটি বিশেষত হরফ টেক্সচারের জন্য থাকে তবে আপনি সম্ভবত অপ-অনুকূল তবে সুন্দর এবং সাধারণ কিছু করুন:
উচ্চতা অনুসারে অক্ষর বাছাই করুন, সবচেয়ে দীর্ঘতম
0,0 থেকে শুরু করুন বর্তমান অক্ষরে প্রথম অক্ষর রাখুন, এক্স অগ্রিম, পরবর্তী একটি রাখুন, যতক্ষণ না আমরা অন্য ফিট করতে পারি না ততক্ষণ পুনরাবৃত্তি করুন
X থেকে 0 রিসেট করুন, সারির দীর্ঘতম চরিত্রের উচ্চতা দ্বারা Y এর নীচে অগ্রসর করুন এবং অন্য সারিটি পূরণ করুন
যতক্ষণ না আমরা অক্ষরের বাইরে থাকি বা অন্য সারিতে ফিট না করতে পারি তার পুনরাবৃত্তি করুন।