ওপেনজিএল - প্রান্তগুলি সনাক্তকরণ


12

টুন-শেডিং চেহারাটি পেতে আমি নির্বিচারে মেসগুলি লোড করতে এবং প্রান্তগুলিতে ঘন কালো রেখা আঁকতে চাই। স্টেনসিল বাফার ব্যবহার করে আমি বস্তুর চারপাশে একটি কালো সিলুয়েট আঁকতে সক্ষম হয়েছি। আপনি এখানে ফলাফল দেখতে পারেন:

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

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

প্রান্ত সনাক্তকরণ সম্পর্কিত এই পদ্ধতির বা অন্য কোনও বিষয়ে কিছু সহায়তার জন্য আমি খুব খুশি হব।

সম্পাদনা করুন: আমি আমার মেসের জন্য কোনও টেক্সচার ব্যবহার করি না।

খুব সুনির্দিষ্টভাবে বলতে গেলে, আমি এমন একটি সিএডি / সিএএম সমাধান তৈরি করতে চাই যা দেখতে যতটা সম্ভব লাগে (শীর্ষ সলিড https://www.youtube.com/watch?v=-qTJZtYUDB4 থেকে নেওয়া ):

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


আমি বিশ্বাস করি আপনার আরও "প্রান্ত" বিস্তারিতভাবে সংজ্ঞায়িত করতে হবে। এটি একটি সাধারণ ওয়্যারফ্রেম থেকে কীভাবে আলাদা? সিআইপিজেড উত্তরে স্ক্রিন স্পেস পোস্ট-প্রক্রিয়াটির একটি ভাল বর্ণনা রয়েছে তবে আপনার প্রশ্ন থেকে এটি কার্যকর কিনা তা নির্ধারণ করা কঠিন।
Andreas

ভাল, প্রান্তের সাথে আমি বোঝাচ্ছি "ক্রিজ" এবং "শিরা" যা সলিউডগুলি গঠন করে। একটি ওয়্যারফ্রেম সমস্ত ত্রিভুজ মুখগুলি প্রদর্শন করবে যা আমি চাই না।
এএনএন ৮87

ঠিক আছে, আমি যা চেয়েছিলাম ঠিক সে জন্য :-) আমি cre ক্রিজ এবং শিরাগুলি থেকে একটি ওয়্যারফ্রেম তৈরি করব। ক্রিজে / রিজ কী তা নির্ধারণ করার জন্য জটিল অংশটি এখনও রয়েছে। কীভাবে এটি করবেন আপনার কোনও ধারণা আছে?
Andreas

1
ক্যাড প্রোগ্রামগুলি বেশিরভাগ শেডার দিয়ে এটি করে না। পরিবর্তে তারা মডেল থেকে শক্ত প্রান্তগুলি জানে এবং সেই তথ্যটি জাল ফর্মের উপরে একটি লাইন আঁকবে।
joojaa

এই কৌশলটি সম্পর্কে আপনার কাছে কি আর কোনও তথ্য আছে? ডাবল বাঁকানো ফর্ম ফর্ম পৃষ্ঠগুলির ক্ষেত্রে কী করা হয়? আমি নিশ্চিত না যখন আপনার শঙ্কু বা সিলিন্ডার থাকে যা কোনও ফ্রি ফর্ম দিয়ে কাটা / ছাঁটাই করা হয় তখন কী হয় what stackoverflow.com/questions/43795262/...
Dusan Bosnjak 'pailhead'

উত্তর:


18

উচ্চতর গ্রেডিয়েন্ট মান সহ চিত্রের অঞ্চলগুলি সনাক্ত করতে সাধারণত প্রান্ত সনাক্তকরণ ফোটে।

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

আপনি এই গ্রেডিয়েন্টটি কীভাবে খুঁজে পাচ্ছেন তা সত্যিই আপনি যা জিজ্ঞাসা করছেন এবং আমি এখনও উত্তর দেইনি :)

প্রচুর উপায়! এখানে একটি দম্পতি :)

শেডার ফাংশনে অন্তর্নির্মিত

এইচএলএসএল এবং জিএসএসএল উভয়ই ডেরাইভেটিভ ফাংশন সরবরাহ করে। জিএলএসএলে আপনার ডিএফডিএক্স এবং ডিএফডি রয়েছে যা আপনাকে যথাক্রমে x এবং y দিকের গ্রেডিয়েন্ট তথ্য দেয়। সাধারণত এই ফাংশনগুলি 2x2 টুকরা একটি ব্লকে মূল্যায়ন করা হয়।
যতক্ষণ না আপনি একটি একক দিক আগ্রহী, একটি ভালো উপায় একটি কম্প্যাক্ট ফলে ইঙ্গিত কিভাবে শক্তিশালী অঞ্চলে গ্রেডিয়েন্ট হয় আছে fwidth যে আপনি অন্য কিছুই কিন্তু dFdy এবং dFdy পরম মান এর সমষ্টি দেয়।
আপনি নির্দিষ্ট চ্যানেলের চেয়ে সামগ্রিক চিত্রের প্রান্তে আগ্রহী হওয়ার সম্ভাবনা রয়েছে, তাই আপনি নিজের চিত্রের ফাংশনটি লুমায় রূপান্তর করতে চাইতে পারেন। এটি মাথায় রেখে, যখন এটি শনাক্তকরণের বিষয়টি আসে তখন আপনার শেডার এর মতো কিছু অন্তর্ভুক্ত করতে পারে:

  float luminance = dot(yourFinalColour,vec3(0.2126, 0.7152, 0.0722));
  float gradient = fwidth(luminance );
  float isEdge = gradient > threshold;

একটি উচ্চ প্রান্তিকের সাহায্যে আপনি মোটা প্রান্তগুলি পাবেন এবং আপনি কিছু মিস করতে পারেন, বিপরীতভাবে, একটি নিম্ন প্রান্তের সাথে আপনি মিথ্যা প্রান্তগুলি সনাক্ত করতে পারেন। আপনার প্রয়োজনীয়তাকে আরও ভাল মানায় এমন প্রান্তিক সন্ধান করতে আপনাকে পরীক্ষা করতে হবে।

এই ফাংশনগুলি কেন কাজ করে তা উল্লেখ করার মতো কারণ তবে এখনই আমার পক্ষে সময় নেই, আমি সম্ভবত এই উত্তরটি পরে আপডেট করব :)

স্ক্রিন স্পেস পোস্ট-প্রক্রিয়া

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

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

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

যা যথাক্রমে আপনাকে x এবং y দিকনির্দেশে গ্রেডিয়েন্ট দেয়:

                                  একটি পুরানো পিডিএফ থেকে আমি অনেক আগে লিখেছি।

as হিসাবে আপনি একক মান গ্রেডিয়েন্টের বাইরে পেতে পারেনGradientMagnitude=(Gradientx)2+(Gradienty)2

তারপরে আপনি উপরে উল্লিখিতভাবে একইভাবে প্রান্তিক করতে পারেন।

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

উপরেরটি বেশ ভালভাবে কাজ করে তবে আপনি স্মুথিং পছন্দ না করলে আপনি প্রিভিট কার্নেলগুলি ব্যবহার করতে পারেন:

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

(দ্রষ্টব্য আমি ভিড় করছি, শীঘ্রই চিত্রগুলির পরিবর্তে সঠিক বিন্যাসযুক্ত পাঠ্য লিখব!)

সত্যিকারের গ্রাফিক্সের চেয়ে চিত্র প্রসেস-ওয়াই পদ্ধতিতে প্রান্ত সনাক্তকরণের জন্য আরও প্রচুর কার্নেল এবং কৌশল রয়েছে, সুতরাং আমি ডিএফডিএক্স / ওয়াই ফাংশনগুলির সাথে আরও সুক্ষ্ম থাকব বলে সম্ভবত আরও সংশ্লেষিত (পাং উদ্দেশ্য নয়) পদ্ধতিগুলি বাদ দিয়েছি probably ।


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

আপনি যদি কোনও বিলম্বিত রেন্ডারার ব্যবহার করেন তবে আপনি একই কাজটি করতে পারেন তবে সাধারণ বাফারে বা আবারও, যদি আপনার প্রিপাস থাকে তবে আপনি গভীরতার সাথে অ্যালগরিদম প্রয়োগ করতে পারেন। তবুও আপনি ঠিক বলেছেন, একটি স্ক্রিন স্পেস পদ্ধতির ক্ষেত্রে সব ক্ষেত্রে আদর্শ নাও থাকতে পারে :) সমাধানটি কীভাবে কার্যকর তা এই প্রভাবটির জন্য আপনার বাজেট কী, আপনার দৃশ্যটি কতটা জটিল তা নির্ভর করে depends
সিআইফজে

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

আপনার সাহায্যের জন্য আবার সিফজে ধন্যবাদ। ভাল, আমি যা অর্জন করতে চাই তা হ'ল একটি সিএডি / সিএএম সমাধান বিকাশ করা যা এটির মতো দেখতে পাওয়া যায় : youtube.com/watch?v=-qTJZtYUDB4 এবং আমি সত্যিই জানতে চাই তারা কীভাবে এটি সমস্ত কালো প্রান্ত, ক্রিজগুলি রেন্ডার করতে পরিচালিত হয়েছিল? এবং সজ্জিত। সিআইফজেড, আপনি কি গ্রাফিক্স প্রোগ্রামিং বিশেষ হিসাবে মনে করেন যে তারা আপনার স্ক্রিন স্পেসের কোনও এক পদ্ধতির ব্যবহার করে এই চেহারাটি অর্জন করেছে? অথবা প্রতিবেশী নরমালগুলির উপর গ্রেডিয়েন্ট গণনা করে? আমি কীভাবে এটি করা যেতে পারে তা জানতে চাই। আবার ধন্যবাদ!
এনএন ৮87

1
কাউকে অর্থ প্রদানের দরকার নেই, অনলাইনে কয়েকটি টিউটোরিয়াল পড়া শুরু করুন, কয়েকটি বই কিনুন এবং কঠোর অধ্যয়ন করুন :) এটি শেষে খুব পুরস্কৃত হবে!
সিআইফজে

3

অন্য যে কোনও ব্যক্তিরও প্রান্ত সনাক্ত করতে হবে: যদি একটি ওয়্যারফ্রেম প্রদর্শন করতে হয় তবে একটি নিবন্ধ এখানে এবং এই নিবন্ধটি কীভাবে কেবল প্রান্তগুলি প্রদর্শন করবেন তা ব্যাখ্যা করে।

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