Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JOGL时的纹理大小_Java_Jogl_Texturing - Fatal编程技术网

Java 使用JOGL时的纹理大小

Java 使用JOGL时的纹理大小,java,jogl,texturing,Java,Jogl,Texturing,在我的下一个项目中,我试图学习慢跑。结果应该是一个简单的2d动画 我听说,纹理的大小必须是2^n*2^n。我仍然可以使用没有这个尺寸的图像,还是必须事先编辑所有图像?使用这些纹理时,我需要注意什么 例如,我想展示一种进度条,其图像大小为1024*96px。如果计算像素并使用alpha混合仅显示填充的部分,是否必须定义一个四元组,例如1024*1024?还是说纹理坐标就是要走的路 [编辑] 有效,使用正交投影的解决方案如下所示: @Override public void init(GLAutoD

在我的下一个项目中,我试图学习慢跑。结果应该是一个简单的2d动画

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

例如,我想展示一种进度条,其图像大小为1024*96px。如果计算像素并使用alpha混合仅显示填充的部分,是否必须定义一个四元组,例如1024*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();

}

[/EDIT]

我认为它不必再是2^n了。你可以很容易地测试它
有很棒的opengl教程,还有一些在JOGL中。仅使用1024*1024纹理的9%是对视频ram的巨大浪费。你最好编辑一下。如果您只需要一部分纹理,请使用纹理坐标,这就是我们拥有它们的原因。

是的,在我看来,这是对RAM和HDD的真正浪费-这就是我问这个问题的原因:-我会看看您的链接我使用1024x96 px纹理工作-thx!除了您的链接之外,我还发现此链接非常有用: