স্প্রিট শিট টেক্সচার সংলগ্ন টেক্সচারের প্রান্তগুলি তুলে নিচ্ছে


10

আমার একটি কাস্টম স্প্রাইট রুটিন রয়েছে (ওপেনজিএল ২.০) যা সাধারণ স্প্রাইট শিট ব্যবহার করে (আমার টেক্সচারগুলি একে অপরের পাশে অনুভূমিকভাবে সাজানো হয়)।

সুতরাং, উদাহরণস্বরূপ, এখানে 2 টি সাধারণ টেক্সচার সহ একটি পরীক্ষার স্প্রিট শীট রয়েছে:

এখানে চিত্র বর্ণনা লিখুন

এখন, আমার ওপেনজিএল স্প্রিট অবজেক্ট তৈরি করার সময় আমি যা করি তা এর আটলাসে ফ্রেমের মোট সংখ্যা নির্দিষ্ট করে এবং অঙ্কন করার সময়, আমি কোন ফ্রেমটি আঁকতে চাই তা নির্দিষ্ট করুন।

এটি কোথা থেকে টেক্সচারটি দখল করতে হবে তা নিয়ে কাজ করে:

প্রয়োজনীয় ফ্রেম সংখ্যাটি ফ্রেমের মোট সংখ্যার দ্বারা ভাগ করা (বাম স্থানাঙ্ক পেতে)

এবং তারপরে ফ্রেমের মোট সংখ্যা দ্বারা 1 টি ডাইভিং করুন এবং উপরের গণনা করা বাম হাতের স্থানাঙ্কে ফলাফল যুক্ত করুন।

এটি কাজ করে বলে মনে হয় তবে কখনও কখনও আমার সমস্যা হয়। উদাহরণস্বরূপ বলুন, আমি নীচের এক্সটি আঁকতে চাই এবং আমি ........... পাই

এখানে চিত্র বর্ণনা লিখুন

আমি প্রতিটি টেক্সচারের মধ্যে 1 পিক্সের একটি 'প্যাডিং' রাখার কথা শুনেছি তবে কেউ কীভাবে এটি কাজ করে তা ঠিক ব্যাখ্যা করতে পারে? মানে আমি যদি এটি করি তবে এটি টেক্সচারটি পাওয়ার জন্য গণনাগুলি অবশ্যই ফেলে দেবে।

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

কেউ যদি ব্যাখ্যা করতে পারে তবে প্রশংসা করবে।


আপনি কি টেক্সচারটি ব্যবহার করছেন GL_NEARESTবা GL_LINEARরেন্ডারিংয়ের জন্য?
MichaelHouse

আমি জিএল_লাইনার @ বাইট 56
বুঙ্গলবোনস

উত্তর:


15

টেক্সচার অ্যাটলেস এবং সংলগ্ন টেক্সেলগুলি ফাঁস ব্যবহারের সমস্যাটি লিনিয়ার টেক্সচার ফিল্টারিংয়ের সাথে সম্পর্কিত।

টেক্সেলের কেন্দ্রে হ'ল নমুনাযুক্ত জমিনের যে কোনও বিন্দুর জন্য, লিনিয়ার স্যাম্পলিং 4 সংলগ্ন টেক্সেলকে নমুনা দেবে এবং আপনি भारিত (নমুনা বিন্দু থেকে দূরত্বের ভিত্তিতে) সমস্ত 4 এর গড় হিসাবে গড় হিসাবে জিজ্ঞাসিত স্থানে মূল্য গণনা করবে নমুনা।

সমস্যার একটি দুর্দান্ত দৃশ্যায়ন এখানে:

  

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

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


প্রতিটি টেক্সচারের প্রান্তের চারপাশে একটি সীমানা ব্যবহার করে আমি কী বোঝাতে চাইছি তা বোঝাতে, ওপেনজিএলে উপলব্ধ বিভিন্ন মোড়ানো মোডগুলি বিবেচনা করুন। বিশেষ মনোযোগ দিন CLAMP TO EDGE

  http://lucera-project.com/blog/wp-content/uploads/2010/06/wrap.png

"ক্ল্যাম্প টু বর্ডার" নামে পরিচিত একটি মোড থাকা সত্ত্বেও এটি আমাদের আগ্রহী নয় mode এই মোডটি আপনাকে আপনার টেক্সচারের চারপাশে সীমানা হিসাবে কোনও টেক্সচারের স্থানাঙ্কের জন্য ব্যবহার করতে একটি রঙকে সংজ্ঞায়িত করতে দেয় যা স্বাভাবিকের বাইরে চলে যায় [0.0] -1.0] পরিসীমা।

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

আমরা জানি যে GL_LINEARউপরের চিত্রটিতে দেখা হিসাবে 4 নিকটতম প্রতিবেশী নমুনা হবে, সুতরাং আমাদের শুধুমাত্র 1-টেক্সেল সীমানা প্রয়োজন। আপনি যদি অ্যানিসোট্রপিক ফিল্টারিং ব্যবহার করেন তবে আপনার আরও বৃহত্তর টেক্সেল সীমানার প্রয়োজন হতে পারে, কারণ এটি কিছু শর্তে নমুনা পাড়ার আকার বাড়িয়ে তোলে।

এখানে এমন একটি জমিনের উদাহরণ যা সীমানাকে আরও স্পষ্টভাবে চিত্রিত করে, যদিও আপনার উদ্দেশ্যে আপনি সীমানাটি 1 টেক্সেল বা 2 টেক্সেল প্রশস্ত করতে পারেন।

  

(দ্রষ্টব্য: আমি যে সীমান্তের কথা উল্লেখ করছি তা চিত্রের চারটি প্রান্তের কালো নয়, তবে সেই অঞ্চলটি যেখানে চেকবোর্ড প্যাটার্নটি নিয়মিত পুনরাবৃত্তি থামিয়ে দেয়)

আপনি যদি ভাবছিলেন, এই কারণেই আমি অ্যানিসোট্রপিক ফিল্টারিং নিয়ে আসছি। এটি কোণের ভিত্তিতে নমুনা পাড়ার আকৃতি পরিবর্তন করে এবং ফিল্টারিংয়ের জন্য 4 টিরও বেশি টেক্সেল ব্যবহার করতে পারে:

  http://www.arcsynthesis.org/gltut/Texturing/ParallelogramDiag.svg

আপনি যে পরিমাণ অ্যানিসোট্রপির ডিগ্রি ব্যবহার করেন তত বেশি পরিমাণে আপনাকে 4 টিরও বেশি টেক্সেলযুক্ত নমুনা পাড়াগুলির সাথে ডিল করতে হবে। বেশিরভাগ অ্যানিসোট্রপিক ফিল্টারিং পরিস্থিতির জন্য একটি 2 টেক্সেলের সীমানা পর্যাপ্ত হওয়া উচিত।


সর্বশেষে তবে শেষ পর্যন্ত, এখানে একটি প্যাকড টেক্সচার অ্যাটলাস কীভাবে তৈরি করা হবে যা টেক্সচার ফিল্টারের GL_CLAMP_TO_EDGEউপস্থিতিতে আচরণের প্রতিরূপ তৈরি করবে GL_LINEAR:

( কালো স্থানাঙ্কে এক্স এবং ওয়াইয়ের 1 টি বিয়োগ করুন, আমি পোস্ট করার আগে ছবিটি পড়ার প্রমাণ পাইনি ))   

সীমান্ত স্টোরেজ হওয়ার কারণে, এই অ্যাটলাসে 4 256x256 টেক্সচার সংরক্ষণের জন্য 516x516 মাত্রা সহ একটি জমিন প্রয়োজন। অ্যাটলাস তৈরির সময় আপনি কীভাবে টেক্সেল ডেটা দিয়ে তা পূরণ করবেন তার উপর ভিত্তি করে সীমানাগুলি রঙিন কোড করা হয়:

  • লাল = সরাসরি নীচে টেক্সেল দিয়ে প্রতিস্থাপন করুন
  • হলুদ = সরাসরি উপরে টেক্সেল দিয়ে প্রতিস্থাপন করুন
  • সবুজ = টেক্সেল দিয়ে সরাসরি বাম দিকে প্রতিস্থাপন করুন
  • নীল = টেক্সেলটি সরাসরি ডানদিকে প্রতিস্থাপন করুন

কার্যকরভাবে এই বস্তাবন্দী উদাহরণে, অ্যাটলাসের প্রতিটি টেক্সচারটি আটলাসের একটি 258x258 অঞ্চল ব্যবহার করে, তবে আপনি সেই মানচিত্রটি দৃশ্যমান 256x256 অঞ্চলে সমন্বয় তৈরি করবেন। সীমানা টেক্সটগুলি কেবল তখনই ব্যবহৃত হয় যখন টেক্সচার ফিল্টারিংটি আটলাসে টেক্সচারের প্রান্তে করা হয় এবং যেভাবে সেগুলি নকশাকৃত GL_CLAMP_TO_EDGEআচরণের নকশা করা হয় ।

আপনি যদি ভাবছিলেন, আপনি একই ধরণের পদ্ধতির সাহায্যে অন্যান্য ধরণের মোড়কের পদ্ধতিগুলি GL_REPEATপ্রয়োগ করতে পারেন - টেক্সচার অ্যাটলাসে বাম / ডান এবং উপরের / নীচে বর্ডার টেক্সটগুলি এবং একটি চৌকস টেক্সচারের সমন্বয় গণিতকে কিছুটা বিনিময় করে প্রয়োগ করা যেতে পারে shader। এটি কিছুটা জটিল, তাই আপাতত এটি নিয়ে চিন্তা করবেন না। যেহেতু আপনি কেবল স্প্রিট শিটগুলি নিয়েই নিজেকে সীমাবদ্ধ করছেন GL_CLAMP_TO_EDGE:)


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

@ ব্যবহারকারী 22241 অবশ্যই, এই সীমান্তটি যেভাবে কাজ করে তা টেক্সচারের প্রান্তে টেক্সেলটিকে নকল করে দেওয়া।
অ্যান্ডন এম। কোলেম্যান

@ ব্যবহারকারী 22241: না, এই সীমানাটি সাধারণ পরিস্থিতিতে দৃশ্যমান হবে না। আপনি আপনার প্যাকড টেক্সচারকে টেক্সচারের স্থানাঙ্ক গণনার জন্য একই মাত্রা হিসাবে বিবেচনা করবেন, আপনি কেবল সীমানা পেরিয়ে যাওয়ার জন্য তাদের একটি অফসেট প্রয়োগ করুন। সীমানার পুরো পয়েন্টটি হ'ল রৈখিক টেক্সচার স্যাম্পলিংকে আপনার স্প্রিট শিটের পৃথক চিত্রগুলির সাথে সম্পর্কিত টেক্সেলগুলিকে অতিরিক্ত পৌঁছানো এবং স্যাম্পলিং থেকে রোধ করা। আপনি যদি নিকটবর্তী প্রতিবেশী নমুনা ব্যবহার করেন তবে এগুলির কোনওটিই প্রয়োজনীয় নয়, তবে তারপরে আপনি দুষ্টু এলিয়াসযুক্ত স্প্রাইট পান।
অ্যান্ডন এম। কোলেম্যান

উজ্জ্বলতার সাথে বিস্তারিত উত্তর - ধন্যবাদ! পারলে কেবল একটি শেষ জিনিস। আমি আমার টেক্সচারের স্থানাঙ্কগুলিতে যুক্ত করতে কীভাবে 'অফসেট' কাজ করব? আমি কি ঠিক বলেছি যে এটি কেবল 1 / প্রস্থের টেক্সচার হবে?
বাংলোবোনস

@ ব্যবহারকারী 22241: হ্যাঁ, টেক্সচার ইমেজটির সূচনাটি X দিকের +1 / প্রস্থঅফটেকচার এবং Y দিকের দিকে + 1 / উচ্চতাফটচার হবে। আপনার একটি সীমানা থাকবে যা প্রতিটি জমিনের চারপাশে যায় goes তৃতীয় অনুভূমিক টেক্সচারের জন্য আপনি টেক্সচারের স্থানাঙ্কগুলি গণনা করতে চান, এই টেক্সচারের জন্য প্যাক করা অবস্থানটি আসলে +5 টেক্সেল (প্রথম টেক্সচারের সীমানার জন্য +2 টেক্সেল, দ্বিতীয় টেক্সচারের সীমানার জন্য +2 এবং শুরুতে +1 এই টেক্সচারের) অন্যান্য 2 টেক্সচারের প্রস্থ ছাড়াও। এটাকে জটিল মনে হচ্ছে কেবল এটি লেখা; প্রয়োজনে আমি আপনাকে একটি চিত্র আঁকতে পারি :)
অ্যান্ডন এম। কোলেম্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.