ฉันจะทำให้พื้นผิว OpenGL ปรับขนาดได้โดยไม่มัวหรือไม่?


15

ฉันใช้ OpenGL ผ่าน LWJGL

ฉันมีการเรนเดอร์รูปสี่เหลี่ยมขนาด 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


มันจะเป็นการขยายขนาดที่เขาต้องการเปลี่ยนหรือไม่เนื่องจากพื้นผิวกำลังแสดงในระดับขยาย
Neverender

ขอบคุณสำหรับคำตอบของคุณ Ricket ตอนนี้ฉันได้อ่านเอกสารเกี่ยวกับ glTexParameter และดูว่ามีสารพัดที่นี่เพื่อทำงานกับ นอกจากนี้ฉันเพิ่มGL_TEXTURE_MINและGL_TEXTURE_MAGเพื่อแสดงรหัส ทำงานได้ตามที่คาดไว้ ตอนนี้ฉันออกไปเพื่อเรียนรู้เพิ่มเติม
adorablepuppy

@ZachB ฉันคิดว่าคุณพูดถูกและถูกต้องแล้ว ฉันอ่านเอกสารอย่างระมัดระวังเมื่อเตรียมคำตอบนี้ แต่อาจสับสนในการทำเช่นนั้น ฉันจะทดสอบทางเดียวแล้วอย่างอื่น แต่ตอนนี้ฉันไม่สะดวกในการทดสอบ
Ricket

7

คุณทำไม่ได้ ลักษณะของข้อมูลดิจิตอลทุกประเภทคือเมื่อลบข้อมูลไปแล้วจะไม่สามารถนำกลับมาใช้ซ้ำได้เช่นเดียวกันคุณไม่สามารถกรอกข้อมูลที่ไม่เคยมีมาตั้งแต่แรก - สิ่งที่ดีที่สุดที่คุณทำได้คือการประมาณคร่าวๆ ซึ่งทำให้คุณมีความพร่ามัว

การใช้ GL_NEAREST จะไม่เบลอ แต่มันจะกลายเป็นพิกเซลแทน

การแก้ปัญหาคือการใช้พื้นผิวขนาดใหญ่ที่มี mipmaps ด้วยวิธีนี้คุณจะได้รับคุณภาพที่ดีไม่ว่าขนาดของรูปทรงเรขาคณิตจะเป็นเท่าใด


2
adorablepuppy กำลังมองหาเอฟเฟกต์แบบพิกเซลเช่นเดียวกับที่ฉันได้รับจากเขาพูดว่า "เหมือนในMinecraft " - แต่จับได้ดี ฉันไม่ได้คิดเกี่ยวกับมันที่ถูกถามอย่างนั้น
Ricket

ขอบคุณสำหรับการป้อนข้อมูลของคุณเช่นกัน ฉันต้องการมันเพราะฉันจะผสมผสานสไตล์การเรนเดอร์ต่าง ๆ เข้าด้วยกัน
adorablepuppy

คำถามคือทำไมคุณไม่สามารถซ้อนทับพื้นผิวหลาย ๆ ครั้งได้?
joehot200

2

ฉันเคยประสบปัญหานี้มาก่อน - การสร้างเกมที่ใช้บล็อกที่มีพื้นผิวความละเอียดต่ำ (8px * 8px) ไม่ว่ากล้องจะอยู่ใกล้แค่ไหนหรือไกลแค่ไหนพื้นผิวที่ถูก "ผสมผสาน" โดยการตั้งค่าเริ่มต้นของ OpenGL - ปรากฏว่าพร่ามัว

คุณต้องเปิดใช้งานการขยาย "ที่ใกล้ที่สุด" เพื่อปิดใช้งานการกรอง bilinear นั่นคือเมื่อกล้องถูกซูมเข้าใกล้พื้นผิว แต่ละพิกเซลถูกกำหนดให้เป็นสีของเท็กเซลที่ใกล้เคียงที่สุด - ไม่ผสมกัน

คุณทำได้ด้วยสองบรรทัดต่อไปนี้:

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.