代码之家  ›  专栏  ›  技术社区  ›  Elvith

使用JOGL时的纹理大小

  •  0
  • Elvith  · 技术社区  · 14 年前

    在我的下一个项目中,我正在努力学习慢跑。结果应该是一个简单的二维动画。

    我听说,纹理的大小必须是2^n*2^n。我还可以使用没有这个尺寸的图像吗,或者我必须事先编辑所有图像吗?使用这些纹理时,我需要注意什么?

    [编辑] 工作,解决方案如下(使用正交投影):

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

    1 回复  |  直到 14 年前
        1
  •  0
  •   Ishtar    14 年前

    nehe.gamedev.net 有很棒的opengl教程和一些JOGL教程。只使用9%的1024*1024纹理是对视频内存的极大浪费。你最好编辑一下。使用纹理坐标,如果你只需要你的纹理的一部分,这就是为什么我们有他们。