2010-07-08 3 views
0

다음 프로젝트에서는 JOGL을 배우려고합니다. 결과는 간단한 2 차원 애니메이션이어야합니다.JOGL을 사용할 때 텍스처 크기

텍스쳐는 2^n * 2^n 크기 여야합니다. 이 크기가 아닌 이미지를 계속 사용할 수 있습니까? 아니면 모든 이미지를 미리 편집해야합니까? 그런 텍스처를 사용할 때 무엇을 처리해야합니까?

예를 들어 이미지의 크기가 1024 * 96px 인 진행률 막대를 표시하려고합니다. 픽셀을 계산할 경우 쿼드 (예 : 1024 x 1024)를 정의하고 알파 블렌딩을 사용하여 "채워진"부분 만 표시해야합니까? 아니면 텍스처 좌표가가는 길입니까?

[편집] 작품, 솔루션 (정사영을 이용하여) 다음과 같습니다

@Override 
public void init(GLAutoDrawable drawable) { 
    GL gl = drawable.getGL(); // get GL 
    glu = new GLU(); 
    //... 
    t = load(".\\TEXTURES\\ProgressBarBG.png"); 
      //... 
} 

    public Texture load(String fileName){ 
    Texture text = null; 
    try{ 
     text = TextureIO.newTexture(new File(fileName), false); 
     text.setTexParameteri(GL.GL_TEXTURE_MAG_FILTER, GL.GL_NEAREST); 
     text.setTexParameteri(GL.GL_TEXTURE_MIN_FILTER, GL.GL_NEAREST); 
    }catch(Exception e){ 
     System.out.println(e.getMessage()); 
     System.out.println("Error loading texture " + fileName); 
    } 
    return text; 
} 

    private void drawProgressBG(GL gl, int z) { 

    gl.glPushMatrix(); 
    gl.glLoadIdentity(); 

    gl.glEnable(GL.GL_BLEND); 
    gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA); 

    gl.glEnable(GL.GL_ALPHA_TEST); 
    gl.glAlphaFunc(GL.GL_GREATER, 0); // only render if alpha > 0 

    // don't show source alpha parts in the destination 
    gl.glEnable(GL.GL_TEXTURE_2D); 

    TextureCoords tc = t.getImageTexCoords(); 

    t.enable(); 
    t.bind(); 


    gl.glTexEnvi(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, 
      GL.GL_REPLACE); 

    gl.glBegin(GL.GL_QUADS); 

    gl.glTexCoord2f(tc.left(), tc.bottom()); gl.glVertex3f(0f, 0f, z); 
    gl.glTexCoord2f(tc.right(), tc.bottom()); gl.glVertex3f(1024f, 0f, z); 
    gl.glTexCoord2f(tc.right(), tc.top()); gl.glVertex3f(1024f, 96f, z); 
    gl.glTexCoord2f(tc.left(), tc.top()); gl.glVertex3f(0f, 96f, z); 

    gl.glEnd(); 

    gl.glDisable(GL.GL_TEXTURE_2D); 
    // switch back to modulation of quad colours and texture 
    gl.glTexEnvi(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, 
    GL.GL_MODULATE); 
    gl.glDisable(GL.GL_ALPHA); // switch off transparency 
    gl.glDisable(GL.GL_BLEND); 


    gl.glPopMatrix(); 

} 

[/ 편집]

답변

0

내가 더 이상 2^N을 수 있다고 생각하지 않습니다. 당신은 쉽게 테스트 할 수 있습니다. nehe.gamedev.net에는 훌륭한 OpenGL 튜토리얼과 일부 JOGL이 있습니다. 1024 * 1024짜리 텍스처의 9 % 만 사용하면 비디오 램이 크게 낭비됩니다. 편집하는 것이 좋습니다. 텍스처의 일부만 필요하면 텍스처 좌표를 사용하십시오. 그래서 우리가 가지고 있습니다.

+0

예, 내 생각에 RAM (및 HDD)의 실제 낭비 - 그 이유는 내가이 질문을했습니다 :) - 귀하의 링크를 살펴 보겠습니다. – Elvith

+0

1024x96 px 텍스처를 사용하여 작업하고 있습니다. 링크에 추가하여이 링크가 매우 유용한 것으로 나타났습니다. http://fivedots.coe.psu.ac.th/~ad/jg2/ch16/jogl2.pdf – Elvith