1

我对 JOGL 非常陌生,我有两个关于 JOGL 的主要问题,第一个是关于精灵和动画,下一个是关于纹理。

(我不是在做 3d,这都是在 2d 的上下文中)

1.) 我已经能够在 JOGL 中创建四边形、多边形等,但我很好奇,这是获得可以在那里操作的图像类型的唯一方法吗?例如,如果你想让一个男人的精灵出现在 JOGL 中,当你移动精灵时,它会朝着你设定的方向移动,但也会显示动画。有没有办法在 JOGL 中有效地做到这一点,或者我必须从多边形中剥出一个形状,一次一个顶点,然后在它上面画一个纹理?或者是否有一种更简单的方法,只需加载精灵并立即显示它,当然还可以根据用户输入更改图像。如果有一种方法可以在不为精灵的每个角落创建顶点的情况下做到这一点,您能否显示一些代码或教程,以便我可以掌握您在做什么的想法。

2.) 我一直在寻找一种在 JOGL 中显示纹理的方法,但我仍然对如何做到这一点感到困惑。让我首先向您展示我发现的在形状上加载和显示纹理的方式。首先我创建 7 个变量:

Texture image;
private String textureFileName = "images/crate.png";
private String textureFileType = ".png";
private float textureTop, textureBottom, textureLeft, textureRight;

接下来在我的 init() 方法中,我通过执行以下操作来加载我的图像:

GL2 gl = drawable.getGL().getGL2(); 
gl.glShadeModel(GL_SMOOTH);
image = TextureIO.newTexture(getClass().getClassLoader().getResource(textureFileName),false, textureFileType);
// Use linear filter for texture if image is larger than the original texture
gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// Use linear filter for texture if image is smaller than the original texture
gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
TextureCoords textureCoords = image.getImageTexCoords();
textureTop = textureCoords.top();
textureBottom = textureCoords.bottom();
textureLeft = textureCoords.left();
textureRight = textureCoords.right();

然后在显示方法中我执行以下操作

GL2 gl = drawable.getGL().getGL2();
gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT);
image.enable(gl);
image.bind(gl);
gl.glBegin(gl.GL_QUADS);
gl.glTexCoord2f(textureLeft,textureTop);
gl.glVertex2d(c,a); // vertex 1
gl.glTexCoord2f(textureLeft, textureBottom);
gl.glVertex2d(c,b); // vertex 2
gl.glTexCoord2f(textureRight, textureBottom);
gl.glVertex2d(d,b); // vertex 3
gl.glTexCoord2f(textureRight, textureTop);
gl.glVertex2d(d,a); // vertex 4
gl.glEnd();
//Variables a,b,c,d are just doubles with certain values for each point

现在我只想知道如果我要拥有多个纹理,这是否是加载图像并显示它们的有效方法。看到这种方式,我已经制定了如何使用这种方法做到这一点的计划,但我想知道这是否是最好的方法。我看到人们谈论bmp 加载器,但听说他们做了什么,映射图像具有的所有单个整数值,似乎真的很复杂。没有简单的方法吗?但是,如果没有的话,有人可以告诉我如何或指出我加载纹理和显示这些纹理的最正确、最有效的方式。

最后一件事,当我把这条线:

        gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT);

这不是基本上只是清除缓冲区中像素等的整数吗?但是什么| 反正做吗?它会移动位吗?

还有这两行代码是做什么的?我被评论弄糊涂了。这两行出现在我用于加载纹理的 init() 方法中:

// Use linear filter for texture if image is larger than the original texture
gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// Use linear filter for texture if image is smaller than the original texture
gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

感谢您抽出宝贵时间阅读并回复此消息,谢谢。

-担

4

0 回答 0