ওপেনজিএল একাধিক ওভারল্যাপিং বস্তুর রূপরেখা পেয়েছে


10

আমার চলমান-গেমটি ওপেনগল দিয়ে সি ++ তে তৈরি করার জন্য আমার একটি ধারণা ছিল: খেলোয়াড় কিছু জিতলে আমি একাধিক ওভারল্যাপিং অবজেক্টে একটি বড় রূপরেখা (5-6 পিক্সেল) পেতে চাই।

আমি ভেবেছিলাম সবচেয়ে ভাল উপায় হ'ল স্টেনসিল বাফারটি ব্যবহার করা তবে এটি কয়েক ঘন্টা যা আমি স্টেনসিল বাফারের কিছু অফ-স্ক্রিন রেন্ডার করার চেষ্টা করছি এবং আমি কোনও প্রকারের ফলস্বরূপ ফলাফল অর্জন করতে পারি না prob আরও কিছু কৌশল আছে!

এটিই আমি পেতে চাই:

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

কোন ধারনা?


একটি প্রান্ত সনাক্তকারী ফিল্টার ব্যবহার করুন, ঘন রঙিন রেখাগুলি দিয়ে প্রান্তগুলি পূরণ করুন, তারপরে রঙিন রেখাগুলির স্তরের উপরে আকারগুলি এবং ওভারলেয়ের রেন্ডার করা চিত্রগুলি বের করুন?
শটগান নিনজা

একটি প্রান্ত সনাক্তকারী ফিল্টার দিয়ে আপনি কী বোঝাতে চাইছেন? একটি শেডার? একটি ইমেজ প্রসেসিং ফিল্টার? ওপেনসিভি (টেক্সচারে রেন্ডার করুন, টেক্সচারে ফিল্টার প্রয়োগ করুন, পরিবর্তিত টেক্সচারটি পিছনে চাপুন)?
nkint

আমার কোন ধারণা নাই; আমি 3 ডি রেন্ডারিং শুরু করতে খুব পারদর্শী নই।
শটগান নিনজা

আপনার মতো স্টেনসিল বাফারের কিছু উদাহরণ আছে কি? আমি মনে করি স্টেনসিল বাফারটি ব্যবহার করা পরিষ্কার উপায় তবে আমি কোনও স্টেনসিল বাফার কাজ করতে সক্ষম নই
nkint

উত্তর:


4
  1. স্টেনসিল বাফার সক্ষম এবং সাফ করুন।
  2. স্টেনসিল বাফার সেট করে, বস্তুগুলি আঁকুন। বস্তুগুলি আধা স্বচ্ছ হতে পারে ইত্যাদি etc.
  3. এখন স্টেনসিল মোড সেট করুন কেবলমাত্র পিক্সেল লিখতে যেখানে স্টেনসিল সেট করা নেই।
  4. এবং প্রতিটি বস্তুকে আবার আঁকুন, কিছুটা ছোট করে মাপসই করা, কাঙ্ক্ষিত সীমানা রঙে এবং বিন্যাস ছাড়াই।
  5. স্টেনসিল বাফারটি অক্ষম করুন।

আমি এখানে কাজ করছি এমন কিছু ওয়েবজিএল স্টেনসিল কোড থেকে গৃহীত কোডটি এখানে:

// drawing will set stencil stencil
    gl.enable(gl.STENCIL_TEST);
    gl.stencilFunc(gl.ALWAYS,1,1);
    gl.stencilOp(gl.KEEP,gl.KEEP,gl.REPLACE);
    gl.stencilMask(1);
    gl.clearStencil(0);
    gl.clear(gl.STENCIL_BUFFER_BIT);
// draw objects
for(var object in objects)
  objects[object].draw();
// set stencil mode to only draw those not previous drawn
    gl.stencilFunc(gl.EQUAL,0,1);
    gl.stencilOp(gl.KEEP,gl.KEEP,gl.KEEP);
    gl.stencilMask(0x00);
// draw object halo
for(var object in objects)
  objects[object].drawHalo(1.1,red); // each mesh should be individually scaled e.g. by 1.1
// done
    gl.disable(gl.STENCIL_TEST);

আমি মনে করি নির্বাচিত ইউনিটগুলির চারপাশে হলগুলি আঁকতে আমি আরটিএস গেমগুলিতে এই পদ্ধতির ব্যবহার করেছি, তবে এটি অনেক দিন আগে ছিল এবং কোনও গোটচাস এবং সমস্ত স্নিগ্ধতা আছে কিনা তা আমি মনে করি না।


আপনার মতো স্টেনসিল বাফারের কিছু উদাহরণ আছে কি? আমি স্টেনসিল বাফার ব্যবহার ক্লিনার উপায় হবে মনে কিন্তু আমি সক্ষম কোনো স্টেনসিল বাফার কাজ নই
nkint

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

2
অবজেক্টগুলি স্কেলিংয়ের চেয়ে ভাল হ'ল একটি ভার্টেক্স শ্যাডার যা প্রতিটি প্রান্তকে তার স্বাভাবিক বরাবর একটি অল্প দূরত্বে অফসেট করে। এটি মসৃণ বস্তুগুলির জন্য বেশ ভাল কাজ করে তবে এটি শক্ত প্রান্তগুলিতে ফাটল তৈরি করবে। আপনি সর্বত্র ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে কম কেটে যাওয়া জাল তৈরির চেষ্টা করতে পারেন।
নাথান রিড

2

সমস্ত গ্রুপের অবজেক্টগুলি সন্ধান করে শুরু করুন, যেখানে বস্তুর একটি গ্রুপ হ'ল ওভারল্যাপ করে এমন অবজেক্টগুলির সংকলন। স্ট্যান্ডার্ড সংঘর্ষ সনাক্তকরণের কাজটি করা উচিত। প্রতিটি গ্রুপকে একটি অনন্য রঙ নির্ধারণ করুন। যে কোনও রঙ করত।

গোষ্ঠী রঙ ব্যবহার করে আপনার জমিনকে শক্ত রঙ হিসাবে একটি টেক্সচারে রেন্ডার করুন।

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

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

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

এই প্রান্ত সনাক্তকরণের জন্য একটি টুকরো টুকরো ছাঁটাই এর মতো দেখতে পাওয়া যেতে পারে;

precision mediump float;

uniform sampler2D s_texture;

varying vec2 v_texCoord;

void main()
{
    gl_FragColor = vec4(0.0);

    vec4 baseColor = texture2D(s_texture, v_texCoord);
    gl_FragColor += baseColor - texture2D(s_texture, top);
    gl_FragColor += baseColor - texture2D(s_texture, topRight);
    gl_FragColor += baseColor - texture2D(s_texture, right);
    gl_FragColor += baseColor - texture2D(s_texture, bottomRight);
    gl_FragColor += baseColor - texture2D(s_texture, bottom);
    gl_FragColor += baseColor - texture2D(s_texture, bottomLeft);
    gl_FragColor += baseColor - texture2D(s_texture, left);
    gl_FragColor += baseColor - texture2D(s_texture, topLeft);
}

টেক্সচার 2 ডিটিতে দ্বিতীয় মানটি যেখানে v_texCoord এর সাথে সম্পর্কিত 2 ডি স্থানাঙ্ক। আপনি পূর্ণ স্ক্রিন কোয়াডে টেক্সচার হিসাবে প্রথম রেন্ডার লক্ষ্যটিকে রেন্ডার করে এটি প্রয়োগ করবেন। এটি আপনি যেমন কোনও গাসিয়ান অস্পষ্টতার মতো পূর্ণ পর্দা ঝাপসা প্রভাব প্রয়োগ করবেন তার অনুরূপ।

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


2
দুঃখিত তবে "প্রতিটি টেক্সেলের মাধ্যমে স্ক্যান করুন" এর অর্থ কী? প্রতিটি পিক্সেল যদিও লুপ জন্য? সিপিইউতে? সুতরাং এটি এমন কিছু: কোনও টেক্সচারে শক্ত রঙ দিয়ে রেন্ডার করুন, চিত্রটি সিপুতে স্থানান্তর করুন, স্ক্যান করবেন না, তাদের আবার জমিনে রাখুন? বা এটি একটি শেডারে না?
nkint

অভ্যাস হিসাবে রেন্ডার টার্গেটটিকে টেক্সচার হিসাবে রেন্ডার টার্গেট ব্যবহার করে পুরো স্ক্রিন কোয়াড রেন্ডার করে একটি শেডারে অগ্রাধিকার হিসাবে করুন, তবে আপনি এটি প্রথমে লুপের জন্য সিপিইউতে কাজ করতে পারেন, কেবল দেখতে যদি এটি যথেষ্ট ভাল কাজ করে।
অরিজিনালডেমন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.