मैं बिना धुंधले बने OpenGL बनावट कैसे बना सकता हूं?


15

मैं LWJGL के माध्यम से OpenGL का उपयोग कर रहा हूं।

मेरे पास 16x16 में 16x16 बनावट वाला क्वाड रेंडरिंग है। जब मैं इसे बदल देता हूं, तो यह राशि बढ़ जाती है, क्वाड बढ़ता है, फिर बड़ा हो जाता है।

मैं इसे बिना धुंधले कैसे बना सकता हूं, जैसे Minecraft में।

यहाँ मेरे RenderableEntity ऑब्जेक्ट के अंदर कोड है:

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 के बारे में पढ़ें ।


क्या यह आवर्धन नहीं होगा कि वह परिवर्तन करना चाहता है, क्योंकि बनावट को एक बड़े पैमाने पर प्रदर्शित किया जा रहा है?
नेवेंडर २

आपकी प्रतिक्रिया के लिए धन्यवाद Ricket। मैंने अब glTexParameter पर दस्तावेज़ीकरण पढ़ा है और देखा कि इसके साथ काम करने के लिए यहाँ कई उपहार हैं। साथ ही, मैं जोड़ा GL_TEXTURE_MINऔर GL_TEXTURE_MAGकोड प्रस्तुत करना। जैसा कि मुझे उम्मीद थी कि काम करता है। अब मैं और अधिक जानने के लिए तैयार हूँ।
adorablepuppy

@ZachB, मुझे लगता है कि आप सही हैं और तदनुसार संपादित किए जाते हैं। मैंने इस उत्तर को तैयार करते समय दस्तावेज को बहुत ध्यान से पढ़ा , लेकिन शायद ऐसा करने में खुद को भ्रमित किया। मैं सिर्फ एक तरह से और फिर दूसरे का परीक्षण करूंगा, लेकिन मेरे पास इस समय परीक्षण करने के लिए कुछ सुविधाजनक नहीं है।
Ricket

7

आप नहीं कर सकते। किसी भी प्रकार के डिजिटल डेटा की प्रकृति यह है कि एक बार सूचना को हटा देने के बाद उसे कभी वापस नहीं रखा जा सकता है, और इसी तरह आप ऐसी जानकारी नहीं भर सकते हैं जो पहले कभी नहीं थी - आप जो कर सकते हैं वह सबसे अच्छा है। जो आपको धुंधलापन देता है।

GL_NEAREST का उपयोग करने से धुंधला नहीं होगा बल्कि इसके बजाय पिक्सलेट हो जाएगा।

इसका उपाय यह है कि mipmaps के साथ एक बड़ी बनावट का उपयोग किया जाए। इस तरह से आपको अच्छी गुणवत्ता मिल जाती है चाहे कोई भी आकार हो, ज्यामिति की बनावट कैसी होती है।


2
adorablepuppy पिक्सेलेटेड इफ़ेक्ट की तलाश में था, जैसा कि मैंने उससे " Minecraft की तरह" कहा, लेकिन अच्छी पकड़ थी। मैंने इसके बारे में ऐसा नहीं पूछा।
रुका

आपके इनपुट के लिए भी धन्यवाद। मुझे इसकी आवश्यकता होगी, क्योंकि मैं कुछ अलग-अलग प्रतिपादन शैलियों को एक साथ मिलाने जा रहा हूँ।
adorablepuppy

सवाल यह है कि आप बनावट को कई बार ओवरलैप क्यों नहीं कर सकते?
joehot200 12

2

मैंने इस मुद्दे को पहले हाथ में अनुभव किया है - कम रेस (8px * 8px) बनावट के साथ ब्लॉक-आधारित गेम बनाना। कोई फर्क नहीं पड़ता कि कैमरा कितना दूर था या कितना दूर है, टेक्सचर को ओपनजीएल की डिफ़ॉल्ट सेटिंग्स द्वारा "मिश्रित" पार किया जा रहा था - वे धुंधले थे।

आपको बिलिनियर फ़िल्टरिंग को अक्षम करने के लिए "निकटतम" आवर्धन सक्षम करने की आवश्यकता है। यही है, जब कैमरा बनावट के करीब ज़ूम किया जाता है; प्रत्येक पिक्सेल को टेक्सल के रंग के रूप में परिभाषित किया गया है जो निकटतम है - कोई सम्मिश्रण नहीं।

आप इन दो लाइनों के साथ ऐसा करते हैं:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.