ঝাপসা হয়ে না গিয়ে কীভাবে আমি ওপেনএল টেক্সচার স্কেল তৈরি করতে পারি?


15

আমি এলডাব্লুজেজিএল এর মাধ্যমে ওপেনজিএল ব্যবহার করছি।

আমার 16x16 টেক্সচার্ড কোয়াড রেন্ডারিং রয়েছে। আমি যখন এর স্কেলের পরিমাণ পরিবর্তন করি তখন কোয়াড বৃদ্ধি পায়, তত বড় হওয়ার সাথে সাথে ঝাপসা হয়ে যায়।

আমি মাইনক্রাফ্টের মতো ঝাপসা হয়ে না গিয়ে কীভাবে এটি স্কেল করতে পারি।

আমার রেন্ডারেবল এন্টিটি অবজেক্টের ভিতরে কোডটি এখানে রয়েছে:

public void render(){       
    Color.white.bind();
    this.spriteSheet.bind();        
    GL11.glBegin(GL11.GL_QUADS);
        GL11.glTexCoord2f(0,0);
        GL11.glVertex2f(this.x, this.y);
        GL11.glTexCoord2f(1,0);
        GL11.glVertex2f(getDrawingWidth(), this.y);
        GL11.glTexCoord2f(1,1);
        GL11.glVertex2f(getDrawingWidth(), getDrawingHeight());
        GL11.glTexCoord2f(0,1);
        GL11.glVertex2f(this.x, getDrawingHeight());
     GL11.glEnd();

}

এবং এখানে আমার গেম ক্লাসে আমার initGL পদ্ধতি থেকে কোড

GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glClearColor(0.46f,0.46f,0.90f,1.0f);
GL11.glViewport(0,0,width,height);
GL11.glOrtho(0,width,height,0,1,-1);

এবং এখানে কোড যা আসল অঙ্কন করে

public void start(){
    initGL(800,600);
    init();

    while(true){
        GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);

        for(int i=0;i<entities.size();i++){
            ((RenderableEntity)entities.get(i)).render();
        }

        Display.update();
        Display.sync(100);

        if(Display.isCloseRequested()){
            Display.destroy();
            System.exit(0);
        }
    }
}

উত্তর:


17

আপনার যেমন টেক্সচার ম্যাগনিফিকেশন ধরণের পরিবর্তন করতে হবে:

 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

GlTexParameter সম্পর্কে পড়ুন ।


টেক্সচারটি প্রশস্ত আকারে প্রদর্শিত হচ্ছে বলেই কি সে পরিবর্তন করতে চায়?
নীভরেন্দ্র

আপনার প্রতিক্রিয়া রিকেট জন্য ধন্যবাদ। আমি এখন glTexParameter এর ডকুমেন্টেশন পড়েছি এবং এখানে কাজ করার জন্য এখানে অনেক গুডি রয়েছে দেখুন। অতিরিক্তভাবে, আমি কোডটি রেন্ডার করতে GL_TEXTURE_MINএবং যুক্ত করেছি GL_TEXTURE_MAG। আমি প্রত্যাশা মত কাজ করে। এখন আমি আরও শিখতে চলেছি।
adorablepuppy

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

7

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

GL_NEAREST ব্যবহার করা অস্পষ্ট হবে না তবে এটি পরিবর্তে পিক্সেলটেড হয়ে যাবে।

সমাধানটি হ'ল মিপম্যাপ সহ বৃহত্তর টেক্সচার ব্যবহার করা। এইভাবে আপনি জ্যামিতিটি টেক্সচারযুক্ত আকারের যাই হোক না কেন ভাল মানের পান।


2
অ্যাডিয়েলপুপি পিক্সিল্যাটেড এফেক্টটির সন্ধান করছিলেন, যেমন আমি তাঁর কাছ থেকে " লাইফ মাইনক্রাফ্ট " বলছিলাম - তবে দুর্দান্ত ক্যাচ। এমনকি এটি সম্পর্কে জিজ্ঞাসা করা সম্পর্কে আমি ভাবিনি।
রিকিট

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

প্রশ্নটি হল, আপনি কেন একাধিক বার টেক্সচারটি ওভারল্যাপ করতে পারবেন না?
joehot200

2

আমি এই সমস্যাটি প্রথম হাতে পেয়েছি - কম রেজ (8px * 8px) টেক্সচারের সাথে একটি ব্লক-ভিত্তিক গেম তৈরি করছি। ক্যামেরাটি কতটা কাছাকাছি বা কতটা দূরে ছিল, ওপেনজিএল এর ডিফল্ট সেটিংস দ্বারা টেক্সচারগুলি "মিশ্রিত" হচ্ছিল - এগুলি অস্পষ্ট দেখাচ্ছে।

বিলিনিয়ার ফিল্টারিং অক্ষম করতে আপনাকে "নিকটতম" ম্যাগনিফিকেশন সক্ষম করতে হবে। অর্থাত, যখন ক্যামেরাটি জমিনটির কাছাকাছি জুম করা হয়; প্রতিটি পিক্সেল টেক্সেলের রঙ হিসাবে সংজ্ঞায়িত হয় যা নিকটতম - কোনও মিশ্রণ নেই।

আপনি এই দুটি লাইন দিয়ে এটি:

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