আমি কীভাবে আমার 2.5 ডি ওয়ার্ল্ডে গভীরতা পরীক্ষা এবং জমিনের স্বচ্ছতা ব্যবহার করতে পারি?


11

দ্রষ্টব্য: আমি ইতিমধ্যে একটি উত্তর পেয়েছি (যা আমি এই প্রশ্নের পরে পোস্ট করব) - আমি কেবল ভাবছিলাম যে আমি এটি সঠিকভাবে করছি কিনা, বা আরও ভাল উপায় আছে কিনা।

আমি ওপেনজিএল ইএস (জওজিএল) ব্যবহার করে একটি "2.5 ডি" আইসোমেট্রিক গেম তৈরি করছি। "2.5 ডি" দ্বারা, আমি বোঝাতে চাইছি পৃথিবী 3 ডি, তবে এটি 2 ডি আইসোমেট্রিক টাইল ব্যবহার করে রেন্ডার করা হয়েছে।

আমার যে সমস্যাটি সমাধান করতে হয়েছিল তা হ'ল আমার টেক্সচারগুলি যথাযথভাবে (পিছন থেকে সামনের দিকে) রেন্ডার করতে হয়েছিল, যাতে সঠিক প্রভাব তৈরি করতে টাইলগুলি সঠিকভাবে ওভারল্যাপ হয়ে যায়। কিছু পড়ার পরে, আমি দ্রুত বুঝতে পারি যে এটি "পুরাতন টুপি" 2 ডি পদ্ধতির। এটি দক্ষতার সাথে করা শক্ত হয়ে উঠেছে, যেহেতু 3 ডি ওয়ার্ল্ডটি প্লেয়ারের মাধ্যমে সংশোধন করা যেতে পারে (সুতরাং 3D স্থানের যে কোনও জায়গায় জিনিস উপস্থিত হতে পারে) - সুতরাং এটি যৌক্তিক বলে মনে হয়েছিল যে আমি গভীরতার বাফারের সুবিধা নিয়েছি। এর অর্থ হ'ল আমাকে সঠিক ক্রমে স্ট্যান্ড রেন্ডারিংয়ের বিষয়ে চিন্তা করতে হবে না।

তবে, আমি একটি সমস্যার মুখোমুখি হয়েছি। যদি আপনি ব্যবহার করে GL_DEPTH_TESTএবং GL_BLENDএকসাথে হন তবে এটি এমন একটি প্রভাব তৈরি করে যেখানে জেড অর্ডার দ্বারা "সাজানো" হওয়ার আগে অবজেক্টগুলি পটভূমিতে মিশ্রিত হয় (যার অর্থ স্বচ্ছতা হওয়া উচিত যেখানে আপনি একটি অদ্ভুত ধরণের ওভারল্যাপ পাবেন)।

স্বচ্ছতা ওভারল্যাপ সমস্যা

এখানে এমন কিছু সিডো কোড যা সমস্যার চিত্রিত করবে (ঘটনাক্রমে, আমি অ্যান্ড্রয়েডের জন্য libgdx ব্যবহার করছি)।

create() {
    // ...
    // some other code here
    // ...

    Gdx.gl.glEnable(GL10.GL_DEPTH_TEST);
    Gdx.gl.glEnable(GL10.GL_BLEND);
}

render() {
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    Gdx.gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);

    // ...
    // bind texture and create vertices
    // ...
}

সুতরাং প্রশ্নটি হল: আমি কীভাবে স্বচ্ছতার ওভারল্যাপ সমস্যাটি সমাধান করব?


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

উত্তর:


7

ঠিক আছে, সুতরাং এখানে আমার সমাধান (দয়া করে মন্তব্য করুন যদি এটি আরও ভাল করা যায়) ...

দেখা যাচ্ছে যে আসলে আমার আলফা টেস্টিং ব্যবহার করা উচিত (যদিও, আমি এটি দুর্ঘটনাক্রমে আবিষ্কার করেছি, সুতরাং এটি কেন কাজ করে তা সম্পর্কে আমি পুরোপুরি নিশ্চিত নই)।

create() {
    // ...
    // some other code here
    // ...

    Gdx.gl.glEnable(GL10.GL_DEPTH_TEST);
    Gdx.gl.glEnable(GL10.GL_ALPHA_TEST);
}

render() {
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    Gdx.gl10.glAlphaFunc(GL10.GL_GREATER, 0);

    // ...
    // bind texture and create vertices
    // ...
}

উল্লেখ্য ব্যবহার GL_ALPHA_TEST, এবং glAlphaFunc


এটি আমার সমস্যাও সমাধান করেছে। ভাগ করে নেওয়ার জন্য ধন্যবাদ. আপনি দুর্দান্ত
ম্যাথলভার

2

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

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


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