মিপম্যাপের সাথে টেক্সচার সমন্বয় বিচ্ছিন্নকরণগুলি seams তৈরি করে


9

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

কুরুচিপূর্ণ সিউম http://cdn.imghack.se/images/6bbe0ad0173cac003cd5dddc94bd43c7.png

সুতরাং আমি টেক্সচারগ্রাড ব্যবহার করে গ্রেডিয়েন্টগুলি ম্যানুয়ালি ওভাররাইড করার চেষ্টা করেছি:

//fragVert is the original vertex from the vertex shader
vec2 ll = vec2((atan(fragVert.y, fragVert.x) / 3.1415926 + 1.0) * 0.5, (asin(fragVert.z) / 3.1415926 + 0.5));
vec2 ll2 = ll;
if (ll.x < 0.01 || ll.x > 0.99)
    ll2.x = .5;
vec4 surfaceColor = textureGrad(material.tex, ll, dFdx(ll2), dFdy(ll2));

এখন আমি একের পরিবর্তে দুটি সিম পাই। কীভাবে এগুলি থেকে মুক্তি পাব? এবং উপরের কোডটি 2 টি সিম তৈরি করে কেন?

2 টি ইমাম http://cdn.imghack.se/images/44a38ef13cc2cdd801967c9223fdd2d3.png

আপনি দুটি চিত্র থেকে বলতে পারবেন না তবে 2 টি seams মূল সীমের উভয় পাশে রয়েছে।


2
আপনার গোলকটি কি জাল, বা আপনি শেডার বা এ জাতীয় মতকে বিশ্লেষণ করে গোলকটি ছড়িয়ে দিচ্ছেন? যদি এটি কোনও জাল থাকে তবে লোকেরা সাধারণত এটিটি বামনগুলি বাম দ্বারা বামন করে সমাধান করে যাতে একপাশে ভার্টসগুলি আপনার ইউ = 0 এবং অন্য দিকে ইউ = 1 থাকতে পারে
নাথান রিড

আপনার কোডটি কেন দুটি সিম তৈরি করে, আমি আশা করি কারণ এটি দুটি বিযুক্তি তৈরি করছে - একটি যেখানে আপনি 0.01 থেকে 0.5 পর্যন্ত লাফ দেন এবং একটি যেখানে আপনি 0.99 থেকে 0.5 পর্যন্ত লাফ দেন। আপনি 0 থেকে 1 এ লাফানোর সময় একই সমস্যা - কোনও লাফের মতো বড় নয় তবুও একটি বড় লাফ।
নাথান রিড

আমার গোলকের জন্য একটি জাল আছে। এটি একটি ডিকাহেড্রন তাই শিখরের সাথে শীর্ষগুলি লম্বা হয় না। দুটি সীম সম্পর্কে মজাদার বিষয়টি মূল আসলটি চলে গেছে। এছাড়াও, আমি এটি .01 বা .99 এ ক্ল্যাম্প করা হলেও একই 2 টি সিম পাই।
ওমিকুন

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

আমি 2 টি চিত্রের ছবি সহ প্রশ্নটি আপডেট করেছি, তারা মূল সিমের উভয় পাশের, তবে আসল সিমটি নেই। আমি মনে করি ইউভিটি উল্লম্বগুলি থেকে বিভক্ত, নিশ্চিত নয়। কোডটি এখন প্রশ্নে রয়েছে।
ওমিকুন

উত্তর:


4

আপনি পোস্ট করেছেন শেডার কোডের উপর ভিত্তি করে, আপনি উল্লম্ব থেকে ইউভিগুলিকে বিভক্ত করছেন না - এটি প্রদর্শিত হয় আপনি 3 ডি অবস্থান ( fragVert) ব্যবহার করছেন, তারপরে গোলাকার স্থানাঙ্কে রূপান্তরিত করে ইউভিগুলি গণনা করছেন।

আপনার বিশ্লেষণটি ঠিক আছে যে ক্ষুদ্রতর মিপম্যাপটি যখন কোনও বিরতি থাকে তখন বেছে নেওয়া হয়, যেহেতু মিপম্যাপ নির্বাচনটি ডেরাইভেটিভের উপর ভিত্তি করে প্রতিবেশী পিক্সেলগুলিতে ব্যবহৃত ইউভি থেকে সংখ্যারূপে অনুমান করা হয়। যখন একটি পিক্সেলের ইউ = 0 এবং অন্যটিতে ইউ = 1 থাকে আপনি একটি খুব বড় ডেরিভেটিভ পান। আপনার চেষ্টা করা ফিক্সটির একই সমস্যাটি হ'ল u = 0.01 এবং u = 0.99 এর আশেপাশে বড় ডেরিভেটিভস দেখা দেয়, যার কারণে আসল সিমটি যেখানে ছিল সেখানে দুটি দিক দুটি seams প্রদর্শিত হবে।

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

আরও উচ্চতর মানের ডেরাইভেটিভগুলি গণনা করার জন্য আরও একটি "সঠিক" পদ্ধতি হবে। এর পরিবর্তে ব্যবহার করার dFdxএবং dFdyUvs, যা কারণে সান্তরতা উপর atan2, আপনি প্রয়োগ হতে পারে dFdxএবং dFdyকরা fragVert(যা গোলক প্রায় সব পথ একটানা হতে হবে), তারপর কিছু ক্যালকুলাস (চেইন নিয়ম) ব্যবহার এই UV- ডেরাইভেটিভস পেতে সূত্র খুঁজে পেতে অবস্থান ডেরাইভেটিভস থেকে। এটি আরও জটিল এবং ধীর হতে পারে তবে অ্যানিসোট্রপিক ফিল্টারিংয়ের কাজ করা উচিত এমন সুবিধা রয়েছে।

অবশেষে, যেহেতু আপনি ওপেনজিএলে নতুন রয়েছেন আমি কেবল লক্ষ্য করব যে গোলাকৃতির স্থানাঙ্কগুলি থেকে UV গণনা করার সময় একটি গোলকের অঙ্গবিন্যাসের সঠিক বৈধ উপায়, এটি বেশিরভাগ লোকেরা বেছে নেওয়ার "স্বাভাবিক" উপায় নয়। এমন একটি গোলক জাল তৈরি করা আরও সাধারণ যা ভার্টেক্স প্রতি ইউভি নির্দিষ্ট করা আছে এবং কেবল ভার্টেক্স শ্যাডার থেকে পিক্সেল শেডার (প্রতিটি ত্রিভুজ জুড়ে রৈখিকভাবে বিরক্ত) হয়েছে build প্রান্তবিন্দু, স্তর বরাবর স্থাপন করা হয় ভালো , প্রতিটি প্রান্তবিন্দু দুটি অনুলিপি, ঠিক একই অবস্থানে আছে যেমন যে, কিন্তু তোমার সাথে অর্ধেক = 0 একপাশে ত্রিভুজ সাথে সংযুক্ত, এবং তোমার সাথে বাকী অর্ধেক = 1 সংযুক্ত অন্যদিকে ত্রিভুজ। এটি কোনও দৃশ্যমান সিউমকে সরিয়ে দেয় এবং পিক্সেল শেডারটিতে কোনও কৌশল প্রয়োজন হয় না।

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