ওপেনজিএল (এলডাব্লুজেজিএল) দিয়ে এইচডি / জিইআই তৈরি করা


15

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

public void lookThrough()
{
    GL11.glMatrixMode(GL11.GL_PROJECTION);
    GL11.glLoadIdentity();
    GL11.glOrtho(position.x, position.x + Display.getDisplayMode().getWidth()/zoom, position.y + Display.getDisplayMode().getHeight()/zoom, position.y, -1, 1);
    GL11.glMatrixMode(GL11.GL_MODELVIEW);
}

আমি দেখছি না কীভাবে আমি এই পদ্ধতিটি ব্যবহার করে পর্দায় কিছু ঠিক করতে সক্ষম হব? কোন উপায় এই কাছাকাছি? ধন্যবাদ :)


আমি উত্তর দেব না কারণ এটি ডাইরেক্ট 3 ডি দৃষ্টিকোণ থেকে, তবে আপনি যদি ([0...1], [0...1], 0, 1)কোনও প্রক্ষেপণ, দর্শন বা বিশ্ব ম্যাট্রিক্স সহ স্থানাঙ্কগুলি ব্যবহার করেন তবে তারা সর্বদা পর্দার জায়গাতে অবতরণ করবে।
জোনাথন ডিকিনসন

উত্তর:


13

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

  • ready3D ()3 ডি ওয়ার্ল্ড দৃশ্য রেন্ডার করতে ওপেনজিএল প্রস্তুত করার জন্য ।
  • ready2D ()2D জিইউআই রেন্ডার করতে ওপেনজিএল প্রস্তুত করার জন্য ।
  • render3D ()আসল 3 ডি ওয়ার্ল্ড দৃশ্যের অঙ্কনের জন্য 3 ডি ।
  • আসল 2D জিইউআই অঙ্কনের জন্য রেন্ডার 2 ডি ()

    void OGLRender::ready3D()
    {
        glViewport(0, 0, m_Setup.width, m_Setup.height);
        glMatrixMode(GL_PROJECTION);
    
        glLoadIdentity();
        gluPerspective(45, (float) m_Setup.width / m_Setup.height, 0.1, 5000.0);
    
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
    
        glDepthFunc(GL_LEQUAL);
        glEnable(GL_DEPTH_TEST);
    }
    
    void OGLRender::ready2D()
    {
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
    
        gluOrtho2D(0.0f, m_Setup.width, m_Setup.height, 0.0f);
    
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glTranslatef(0.375, 0.375, 0.0);
    
        glDisable(GL_DEPTH_TEST);
    }
    
    void OGLRender::render3D()
    {
        this->ready3D();
    
        // ... draw 3D world scene here ...
    }
    
    void OGLRender::render2D()
    {
        this->ready2D();
    
        // ... draw GUI here ...
    }

এবং তারপরে মূল থ্রেড লুপে আমি মূলত কেবল নিম্নলিখিত ক্রমে পদ্ধতিগুলি কল করব:

while(m_drawFrame)
{
    gm_Render->render3D(); // draw 3D scene
    gm_Render->render2D(); // draw GUI

    SDL_GL_SwapBuffers(); // make drawn frame visible
}

সুতরাং, আমি যা করছি তা হচ্ছে আমি প্রথমে আমার 3 ডি ওয়ার্ল্ড দৃশ্যটি আঁকছি এবং তারপরে আমি আমার জিইউআইকে শেষভাবে আঁকছি জিইউআই সর্বদা বিশ্বের দৃশ্যের শীর্ষে থাকে। রেডি 3 ডি () পদ্ধতি 3 ডি ওয়ার্ল্ড প্রজেকশনটি ওয়ার্ল্ড সিন ড্রইংয়ের জন্য প্রস্তুত পায় এবং রেডি 2 ডি () পদ্ধতিটি জিডিআই আঁকার জন্য 2D অর্থো দৃশ্যের জন্য প্রস্তুত হয়। m_Setup.widthএবং m_Setup.heightকেবল দেখুন পোর্ট স্ক্রিনের মাত্রা।

রেডি 2 ডি () পদ্ধতিটি সম্পর্কে বিশেষ যা gluOrtho2D()ফাংশনটি এটি যুক্তিগুলির সাথে ডাকা হয় যা যখন আমরা জিইউআই আদিমগুলি আঁকেন তখন উইন্ডোজ, ম্যাক এবং অন্যান্য ডেস্কটপ স্ক্রিনের সমন্বয় সিস্টেমগুলির সাথে মেলে নির্দিষ্ট স্ক্রিন স্থানাঙ্কগুলিতে তাদের আঁকেন it যেমন শীর্ষ-বামটি (0,0) (এক্স, ওয়াই) ফর্ম্যাটে রয়েছে যখন নীচে-ডানদিকে(ViewportWidth-1, ViewportHeight-1) । এবং glTranslatef()প্রতি পিক্সেল সঠিক অবস্থানের জন্য সঠিক করতে ব্যবহৃত হয়। যাতে আমরা যখন (0,0) থেকে (0,9) মাধ্যমে একটি লাইন আঁকব তখন লাইনটি উপরের বাম থেকে সোজা নীচে দশ পিক্সেল মোট দৈর্ঘ্যে এবং এক পিক্সেলের প্রস্থে আঁকবে।

সামগ্রিকভাবে আপনি সম্ভবত প্রস্তুত2 D () পদ্ধতিটি কী করছেন তাতে আগ্রহী। বেশিরভাগ গেমস কীভাবে 3 ডি ওয়ার্ল্ড সিন এবং জিইআইআই অঙ্কনের ক্রম করে তা সাধারণত আপনাকে ধারণা দেওয়ার জন্য আমি অন্যান্য পদ্ধতির উত্স কোড উদাহরণ সরবরাহ করেছি।


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

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