2010-07-08 95 views
0

在我的下一個項目中,我試圖學習JOGL。結果應該是一個簡單的二維動畫。使用JOGL時的​​紋理尺寸

我聽說過紋理必須是2^n * 2^n的大小。我仍然可以使用沒有這種尺寸的圖像,還是必須提前編輯所有圖像?使用這種紋理時我需要照顧些什麼?

作爲一個例子,我想展示一種進度條,其圖像尺寸爲1024 * 96px。我是否必須定義一個四邊形(例如,如果計算像素時,尺寸爲1024 * 1024),並使用alpha混合僅顯示「填充」部分?或者紋理座標要走的路?

[編輯] 作品,溶液看起來像這樣(使用正交投影):

@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%是視頻RAM的巨大浪費。你最好編輯它。如果您只需要紋理的一部分,請使用紋理座標,這就是我們擁有它們的原因。

+0

是的,在我看來它是一個真正浪費RAM(和硬盤) - 這就是爲什麼我問這個問題:) - 我會看看你的鏈接 – Elvith 2010-07-08 13:50:54

+0

我得到它使用1024x96像素紋理 - thx工作! 除了你的鏈接,我發現這個非常有用:http://fivedots.coe.psu.ac.th/~ad/jg2/ch16/jogl2.pdf – Elvith 2010-07-12 15:35:04