在openGL(java)中,一切都必须是多边形吗?

在openGL(java)中,一切都必须是多边形吗?,java,jogl,sprite,texture-mapping,polygons,Java,Jogl,Sprite,Texture Mapping,Polygons,我对JOGL非常陌生,关于JOGL我有两个主要问题,第一个是关于精灵和动画,第二个是关于纹理 (我不是在做3d,这都是在2d的环境中) 1.)我已经能够在JOGL中创建四边形、多边形等,但我很好奇,这是获得可以在那里操作的图像类型的唯一方法吗?例如,如果您希望一个人的精灵出现在JOGL中,当您移动精灵时,它将沿您创建的方向移动,但也会显示动画。有没有办法在JOGL中有效地实现这一点,或者我必须从多边形中剥离出一个形状,一次一个顶点,然后在其上绘制纹理?或者有没有一种更简单的方法,只需加载精灵并立

我对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);
这不是基本上只是清除缓冲区中像素等的整数吗?但是|到底有什么作用呢?它会移位吗

这两行代码的作用是什么?我被这些评论弄糊涂了。这两行出现在加载纹理的my 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);
感谢您抽出时间阅读并回复此邮件,谢谢


-Dan

通常使用精灵绘制一个四边形或两个三角形,并为它们提供纹理。如果要为其设置动画,请移动四边形并使用不同的纹理。这些都是基于2D精灵的东西。如果你在画复杂的3D模型,情况就不同了。嗨,丹,看看这个小模型