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

时间:2013-09-17 23:09:51

标签: java jogl sprite texture-mapping polygons

我对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);

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

-Dan

0 个答案:

没有答案