흐릿하지 않게 OpenGL 텍스처의 스케일을 어떻게 조정할 수 있습니까?


15

LWJGL을 통해 OpenGL을 사용하고 있습니다.

16x16에서 16x16 질감 쿼드 렌더링이 있습니다. 배율을 변경하면 쿼드가 커지고 커질수록 흐려집니다.

마인 크래프트처럼 흐릿하지 않게 확장 할 수있는 방법

내 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_MINGL_TEXTURE_MAG렌더링 코드를 추가했습니다 . 내가 예상대로 작동합니다. 이제 더 배우려고 해요.
adorablepuppy

@ ZachB, 당신이 옳고 그에 따라 편집되었다고 생각합니다. 이 답변을 준비 할 때 문서를 매우 신중하게 읽었 지만 아마도 그렇게 혼란 스러울 것입니다. 나는 한 가지 방법으로 테스트 한 다음 다른 방법으로 테스트 할 것이지만 지금은 테스트하기에 편리한 것이 없습니다.
Ricket

7

당신은 할 수 없습니다. 모든 종류의 디지털 데이터의 본질은 일단 정보가 제거되면 다시 되돌릴 수 없으며, 처음에는 없었던 정보를 채울 수 없다는 것입니다. 최선의 방법은 대략적인 근사치입니다. 흐릿함을줍니다.

GL_NEAREST를 사용하면 흐려지지 않지만 대신 픽셀 화됩니다.

해결책은 밉맵과 함께 더 큰 텍스처를 사용하는 것입니다. 이렇게하면 텍스처 처리되는 지오메트리의 크기에 상관없이 좋은 품질을 얻을 수 있습니다.


2
adorablepuppy는 " Minecraft 에서와 같이"라고 말하면서 픽셀 화 된 효과를 찾고있었습니다 . 나는 그런 식으로 묻는 것에 대해 생각조차하지 않았다.
Ricket

입력 해 주셔서 감사합니다. 몇 가지 다른 렌더링 스타일을 혼합 할 것이므로 필요합니다.
adorablepuppy

문제는 텍스처를 여러 번 겹칠 수없는 이유입니다.
joehot200

2

나는이 문제를 직접 경험했습니다-저해상도 (8px * 8px) 텍스처로 블록 기반 게임을 만드십시오. 카메라의 거리와 거리에 관계없이 텍스처는 OpenGL의 기본 설정에 의해 "혼합"되었습니다.

이중 선형 필터링을 비활성화하려면 "가장 가까운"배율을 활성화해야합니다. 즉, 카메라가 텍스처에 가깝게 확대 될 때; 각 픽셀은 가장 가까운 텍셀의 색상으로 정의되며 블렌딩이 없습니다.

이 두 줄 로이 작업을 수행합니다.

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.