Làm cách nào để tạo tỷ lệ họa tiết OpenGL mà không bị mờ?


15

Tôi đang sử dụng OpenGL thông qua LWJGL.

Tôi có một kết xuất quad 16x16 kết cấu ở 16x16. Khi tôi thay đổi số lượng quy mô của nó, bộ tứ phát triển, sau đó trở nên mờ hơn khi nó lớn hơn.

Làm thế nào tôi có thể làm cho nó mở rộng quy mô mà không bị mờ, như trong Minecraft.

Đây là mã bên trong đối tượng RenderableEntity của tôi:

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();

}

Và đây là mã từ phương thức initGL của tôi trong lớp trò chơi của tôi

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);

Và đây là đoạn mã thực hiện bản vẽ

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);
        }
    }
}

Câu trả lời:


17

Bạn cần thay đổi loại phóng đại kết cấu, như vậy:

 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

Đọc về glTexParameter .


Sẽ không phải là phóng đại mà anh ấy muốn thay đổi, vì kết cấu đang được hiển thị ở tỷ lệ phóng đại?
Neverender

Cảm ơn bạn đã trả lời Ricket. Bây giờ tôi đã đọc tài liệu về glTexParameter và thấy có nhiều tính năng tốt ở đây để làm việc. Ngoài ra, tôi đã thêm GL_TEXTURE_MINGL_TEXTURE_MAGđể kết xuất mã. Hoạt động như tôi mong đợi. Bây giờ tôi nghỉ để tìm hiểu thêm.
đáng yêu

@ZachB, tôi nghĩ bạn đúng và chỉnh sửa cho phù hợp. Tôi đọc tài liệu rất cẩn thận khi chuẩn bị câu trả lời này, nhưng có lẽ chỉ nhầm lẫn bản thân mình làm như vậy. Tôi sẽ chỉ kiểm tra một cách và sau đó theo cách khác, nhưng tôi không có thứ gì thuận tiện để kiểm tra vào lúc này.
Ricket

7

Bạn không thể. Bản chất của bất kỳ loại dữ liệu kỹ thuật số nào là một khi thông tin đã bị xóa, nó không bao giờ có thể được đưa trở lại, và tương tự như vậy, bạn không thể điền thông tin chưa từng có ở nơi đầu tiên - điều tốt nhất bạn có thể làm là xấp xỉ thô, Điều này mang lại cho bạn sự mờ ảo.

Sử dụng GL_NEAREST sẽ không bị mờ nhưng thay vào đó, nó sẽ trở nên tối giản.

Giải pháp là sử dụng kết cấu lớn hơn với mipmap. Bằng cách đó bạn có được chất lượng tốt cho dù kích thước hình học đang được kết cấu là bao nhiêu.


2
Lovelypuppy đang tìm kiếm hiệu ứng pixelated, khi tôi nhận được từ anh ấy nói "như trong Minecraft " - nhưng rất hay. Tôi thậm chí không nghĩ về nó được hỏi theo cách đó.
Ricket

Cảm ơn bạn cho đầu vào của bạn là tốt. Tôi sẽ cần nó, vì tôi sẽ trộn một vài kiểu kết xuất khác nhau lại với nhau.
đáng yêu

Câu hỏi là, tại sao bạn không thể chồng lên kết cấu nhiều lần?
joehot200

2

Tôi đã trải nghiệm vấn đề này lần đầu tiên - tạo một trò chơi dựa trên khối với kết cấu độ phân giải thấp (8px * 8px). Cho dù camera ở gần hay xa đến đâu, họa tiết vẫn bị "trộn" bởi các cài đặt mặc định của OpenGL - chúng có vẻ mờ.

Bạn cần bật độ phóng đại "gần nhất" để tắt tính năng lọc song tuyến. Đó là, khi máy ảnh được phóng to gần với kết cấu; mỗi pixel được định nghĩa là màu của texel gần nhất - không pha trộn.

Bạn làm điều này với hai dòng sau:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.