কার্ড গেমের কার্ডের জন্য ড্রপ শেডো এফেক্ট আঁকার জন্য আমি কোন রেন্ডারিং কৌশলগুলি ব্যবহার করব?


13

এ জাতীয় ছায়া তৈরি করতে কোন ধরণের শেডিং অ্যালগরিদম ব্যবহার করা যেতে পারে? এখানে চিত্র বর্ণনা লিখুন

আমি যেটি তৈরি করছি তা একই রকম তবে এটি সবই ওপেনজিএল দ্বারা চালিত 2D অঙ্কন এপিআই দিয়ে সম্পন্ন হয়েছে যাতে কোনও জেড সমন্বয় নেই।

তদাতিরিক্ত, নিজেই হাতের জন্য, আমি এখানে সত্যিই ছায়াময় অনুভূতি পেতে চাই: এখানে চিত্র বর্ণনা লিখুন

আমি কীভাবে তার কাছাকাছি শেডযুক্ত চেহারা অর্জন করব তা নিশ্চিত নই।

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

কোন ধরণের অ্যালগরিদমগুলিতে আমার নজর দেওয়া উচিত (অস্পষ্টতা বাদে আমি জানি যা করতে হবে?)

ধন্যবাদ

হালনাগাদ

আমি একটি 2 ডি কার্ড গেম তৈরি করছি। আমি কার্ডগুলি থেকে অফসেট ড্রপশেডো যুক্ত করতে চাই, কিছুটা:

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

আমি যেভাবে এটি করার কথা ভাবছি তা হ'ল:

  • একটি টেক্সচার রাখুন যা ব্যাকবুফারের সমান আকার।
  • সেই জমিনে অস্থায়ী কার্ড হিসাবে অন্ধকার আয়তক্ষেত্রগুলি আঁকুন।

  • এই জমিনটি অস্পষ্ট করুন।

  • এই টেক্সচারে আমার কার্ডগুলি আঁকুন।
  • কার্ডগুলিতে অতিরিক্ত আলোকসজ্জা করুন।
  • এই টেক্সচারটি ব্যাকবুফারে আঁকুন।

আমার প্রশ্নগুলি হ'ল:

  • এটি কি এটি করার সঠিক উপায়?

  • টেক্সচারে রেন্ডার ছাড়াই এটি করার কোনও উপায় আছে (
    ব্যাকব্যাপারের মতো বিটম্যাপটি বড় রেখে )?

  • এটা ধরে নেওয়া কি নিরাপদ যে সর্বাধিক টেক্সচারের আকার
    ব্যাকবুফার আকার দ্বারা ছাড়িয়ে যাবে না ? (আমি যা বলতে চাইছি তা হল, যদি ব্যাকবুফারটি 2000x3000
    হয় তবে এটি কি নিরাপদ যে আমি
    সেই আকারের ভিডিও মেমোরিতে একটি টেক্সচার তৈরি করতে পারি ?)

ধন্যবাদ


1
আপনার দ্বিতীয় ইস্যুতে একটি নান্দনিক বিন্দু: আপনি যদি সেই কার্ডগুলি আপনার হাতে ধারণ করেন তবে তা সম্ভব নয় । একে অপরের পাশে চাপানো কার্ডগুলি প্রশংসনীয়ভাবে একে অপরের ছায়া দেয় না। আপনি যদি তাদের অনেকগুলি ধরে না রাখেন তবে নয়। কার্ডগুলিকে সেই চিত্রটিতে যেভাবে চিত্রিত করা হয়েছে তা আপনি সত্যিই ধরে রাখতে পারবেন না; এই কার্ডগুলি দেখতে অনেকগুলি মিলিমিটার দ্বারা পৃথক করা হয়েছে বলে মনে হচ্ছে; তারা একে অপরের বিরুদ্ধে সমতল না। আমি শুধু এটি সম্পর্কে চিন্তা করব না।
নিকল বোলাস

উত্তর:


18

আমি মনে করি সবাই এই সমস্যার সমাধানের জন্য জটিল সমস্যা সমাধান করছে ..

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

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

এর পরে, খেলাতে, আমরা কার্ডটি আঁকতে চাইলে প্রথমে বহুগুণ (বা আলফা) মিশ্রণ দিয়ে অস্পষ্ট কালো চিত্রটি আঁকুন, কিছু দিক থেকে কিছুটা অফসেট করে তারপরে কার্ডটি আঁকুন। Voila।

আরও কৌতূহলের জন্য, আপনি ছায়া এবং কার্ডের মধ্যে বিকল্প (d) এর মতো কার্যকর করতে পারেন বা প্রথমে সমস্ত ছায়া আঁকুন এবং তারপরে কার্ডগুলি (e) এর মতো (আমি (ই) ক্ষেত্রে কার্ডগুলি রঙ করেছি তা দেখানোর জন্য) এখনও পৃথক =)

আরও সূক্ষ্ম, স্বচ্ছ ছায়া তৈরি করতে ছায়ার জন্য খাঁটি কালো (বা পূর্ণ আলফা) ব্যবহার না করা ভাল।


2
গেমের বাইরে ছায়াগুলি করার জন্য +1। আপনি এটিকে আরও একধাপ এগিয়ে নিয়ে যেতে এবং দৃশ্যের কোনও আলো থাকলে ছায়া যেখানে রাখা হয়েছে তা সংশোধন করতে পারেন।
ফ্রেঞ্চনিএনজেড

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

2

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

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


এসএসএও ওভারকিল =) উদাহরণটি অ্যানিমেটেড না দেখে শ্যাডিংয়ের কৌশলটি কী ব্যবহৃত হয় তা বলা খুব কঠিন। কার্ডগুলি যদি সর্বদা সেই ক্রমে পড়ে থাকে এবং একে অপরের উপরে ফাঁক থাকে তবে ছায়াগুলি কেবল প্রি-রেন্ডার করা সহজ, তবে আপনি কখনই ডাব্লু / আউটটিকে অ্যাকশনে দেখছেন তা জানতে পারবেন না।
প্যাট্রিক হিউজেস 4

0

আপনি একটি ছায়া মানচিত্র না করতে পারেন? একটি এফবোতে দৃশ্যটি রেন্ডার করুন। কেবলমাত্র গভীরতার মানগুলি সংরক্ষণ করুন এবং শেডারে স্বাভাবিক গভীরতার মান পরীক্ষা করে দেখুন যে কোনও ছায়া রেন্ডার করা উচিত কি না।


আমি জেড বাফার ব্যবহার করছি না, এর 'গভীরতা' নেই।
jmasterx

0

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

এছাড়াও, আপনার ফ্রেমবফারের জন্য একটি আলফা উপাদান প্রয়োজন।

  1. একটি কার্ডের গ্রেস্কেল চিত্র পান। এটি সম্ভবত এর আকার প্রসারিত করে প্রান্তগুলির চারদিকে अस्पष्ट করুন। এটি আপনার ছায়া কার্ডের চিত্র। মনে রাখবেন এটি একটি একক চ্যানেল চিত্র। আপনি যখন আপনার শ্যাডারটিতে এই টেক্সচারটি অ্যাক্সেস করেন তখন আপনার অবশ্যই নিশ্চিত হওয়া উচিত যে আপনি একক মান আলফা উপাদানটিতে রেখেছেন। এটি আপনার শেডার বা অন্য কোথাও করা যেতে পারে।

    চিত্রটিতে ০.০ এর মান বলতে কোনও ছায়া নেই। চিত্রটিতে 1.0 এর মানটির অর্থ মোট ছায়া । অর্থাৎ পুরোপুরি পিচ কালো। আপনার গা dark় রঙ হিসাবে আপনি সম্ভবত 0.5 বা তার মান চান।

  2. স্ক্রিনটি সাফ করুন যে আলফাটি শূন্যে সেট করা আছে ।

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

    glBlendEquation(GL_MAX);

    এই মিশ্রণ মোডটি ওভারল্যাপিং ছায়াগুলিকে আরও গাer় বা হালকা থেকে বাড়তে রাখতে ব্যবহার করা হয়। এটি কেবলমাত্র সেই পিক্সেলটিতে লেখা অন্ধকার মানটি নেয়। এটি যথেষ্ট ভাল দেখতে হবে।

    রঙিন রাইটগুলি বন্ধ করতে আপনার রঙিন রাইট মাস্কও ব্যবহার করা উচিত।

  4. টেবিলটি রেন্ডার করুন। এটি করার সময় মিশ্রণটি নিম্নরূপে সেট আপ করা উচিত:

    glBlendEquation(GL_ADD);
    glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_ZERO);
    

যদি সীমাবদ্ধতাগুলি আপনার পক্ষে খুব সীমাবদ্ধ থাকে তবে আপনাকে রেন্ডার লক্ষ্য ব্যবহার করতে হবে। এটি নিম্নলিখিত হিসাবে সম্পন্ন করা হয়:

  1. আগের মতো ছায়া কার্ড চিত্র তৈরি করুন।

  2. প্রথমে ছায়া রেন্ডার করুন। ছায়া ফ্রেমবফারটি বেঁধে রাখুন (যা কেবলমাত্র একটি একক চ্যানেল চিত্র হওয়া দরকার, যদি আপনার হার্ডওয়্যার সেগুলির মধ্যে একটিতে রেন্ডার করতে পারে)। এর মান শূন্যে সাফ করুন।

  3. প্রতিটি কার্ডের জন্য, ছায়া কার্ডের চিত্রটি রেন্ডার করুন, আগের মতো অফসেট করুন। আপনার শেডারটি আউটপুট রঙের চারটি উপাদানকেই একই মান লিখতে হবে। মিশ্রণ মোডটি আবার হওয়া উচিত glBlendEquation(GL_MAX)

  4. নিয়মিত ফ্রেমবাফারে ফিরে যান। আপনি ছায়া পেতে চান সবকিছু আঁকুন।

  5. আমরা রেন্ডার করে ছায়া চিত্র সহ একটি পূর্ণ-স্ক্রিন কোয়াড আঁকো। শেডারটি আউটপুটটির আলফায় ছায়া চিত্র থেকে প্রাপ্ত টেক্সেলটি সংরক্ষণ করতে হবে; আরজিবি অপ্রাসঙ্গিক। মিশ্রণ মোডটি হওয়া উচিত:

    glBlendEquation(GL_ADD);
    glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_ALPHA);
    

প্রথম পদ্ধতিতে, আমি মনে করি আপনি 5 ধাপ ভুলে গেছেন: মিশ্রণটি অক্ষম করুন এবং কার্ডগুলি রেন্ডার করুন। এছাড়াও, এটি লক্ষণীয় যে প্রথম পদ্ধতি আপনাকে ওপি-র দ্বিতীয় স্ক্রিনশটে যেমন দেখা যায় আন্তঃ কার্ডের ছায়া পেতে দেয় না।
নাথান রিড

@ নাথানরিড: আমি বুঝতে পেরেছিলাম যে কীভাবে সে নিজেকে কীভাবে বন্ধ করতে পারে তা তিনি জানতেন। এছাড়াও, "আন্তঃ কার্ডের ছায়া" কোনও অর্থবোধ করে না, কারণ আমি প্রশ্নের নীচে আমার মন্তব্যে উল্লেখ করেছি।
নিকল বোলাস

1
আপনি বাস্তবে কার্ডগুলি কীভাবে ধারণ করবেন এটি বাস্তবে উপস্থাপন করতে পারে না তবে এটি দুর্দান্ত দেখাচ্ছে! কার্ডগুলি প্রথম শটে যেমন টেবিলের উপরে ভেসে বেড়াচ্ছে এটি আসলেই "বোধগম্য নয়"
নাথান রেড

0

আমি স্টেনসিল বাফারটি ব্যবহার করব। এটিকে 1 এ সাফ করুন (আপনি গভীরতার সাথে সাফ করার সাথে সাথে একই সময়ে), আপনার টেবিলটি আঁকুন। তারপরে স্টেনসিল পরীক্ষা সক্ষম করুন, অস্পষ্ট আয়তক্ষেত্রের টেক্সচারটি ব্যবহার করে ছায়াগুলি আঁকুন, স্টেনসিল এবং গভীরতা পাস হলে বৃদ্ধি করুন, স্টেনসিল ব্যর্থ হলে কিছুই করবেন না, গভীরতা ব্যর্থ হলে কিছুই করবেন না, এবং আপনার স্টেনসিল ফানাকে GL_EQUAL এ সেট করুন (রেফ 1, মাস্ক 0xff), স্টেনসিল পরীক্ষা অক্ষম করুন । (আমি এটি পুরোপুরি পরীক্ষা করে দেখিনি তবে এটি কোড থেকে উদ্ভূত যা একই কাজ করে এবং কার্যকরভাবে কাজ করা উচিত; আপনাকে প্যারামগুলি টুইট করতে হবে)। তারপরে অন্য সব কিছু আঁকুন।

কলগুলি হবে:

glEnable (GL_STENCIL_TEST);
glStencilFunc (GL_EQUAL, 1, 2);
glStencilOp (GL_KEEP, GL_KEEP, GL_INCR);

// draw shadow textures

glDisable (GL_STENCIL_TEST);

কেবলমাত্র যদি সমস্যাটি দেখা দিতে পারে তবে আপনার যদি দুটি ঝাপসা প্রান্ত থাকে যা কিছুটা ওভারল্যাপ হয়; অন্যথায় এর জন্য বেসিক ওপেনজিএল ১.১ অফারগুলির বাইরে অভিনব কোনও প্রয়োজন নেই এবং সমস্ত হার্ডওয়্যারগুলিতে কাজ করবে (সম্ভবত পুরানো 3DFX কার্ডের প্রত্যাশা করুন, যা আমি ধরে নিয়েছি আপনি সমর্থন করার বিষয়ে সত্যই চিন্তিত নন ...)

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

বেসিক সেটআপটি এরকম হবে:

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

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

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