(libgdx学习)mesh的简单使用——第一个三角形

来源:互联网 发布:海文考研 知乎 编辑:程序博客网 时间:2024/06/10 16:45

1.VertexAttributes 类

如果要介绍Mesh的话,那么就必须要先讲解下VertexAttributes,他的意思是“顶点数据”,熟悉3D模型的同学,可能都了解,mesh其实不仅仅是平面2D的东西,在3D方面也是可以使用的。既然mesh是网格,那么他就需要有顶点来确定这个mesh,下面我们就来介绍下 vertexAttributes ---- 顶点数据

PS:这个类了解就行,一般都是用他的内部类。

预定义名称:

libGDX是基于OpenGL的游戏引擎,这个mesh也是OpenGL带过来的,在OpenGL中规定我们在使用mesh的时候,必须先确定其中组成元素的属性。VertexAttributes 即顶点数据,它指定了每个顶点的各种属性数据。在OpenGL ES1.0中,顶点属性有四个预定义的名字:position(位置), normal(法线), color(颜色), 和 texture coordinates(纹理坐标)在OpenGL ES2.0中,用户必须定义“顶点属性的名字”,这个也是目前0.98版本libGDX中新增加的一项。

构造方法:

VertexAttributeint usage, int numComponents, java.lang.String alias) 

   第一个参数:储存顶点的数据类型

   第二个参数:数据元素的组成个数,范围 1 - 4。

   第三个参数:数据名称,也是在shader中使用该元素的“别名”,构建后可以修改

功能方法:(这里介绍的是较为常用的VertexAttributes的方法

(1)VertexAttributes.Usage :内部类,常用主要是其中集合了几个常用的预定义的名称其实就是你要用它储存的数据类型,例如是位置型、颜色型等。

(2)equals (Object obj): 不常用,Object的方法,这里不赘述了。

(3)get(int index) :不常用,获取当前索引号,这个我们在下面会讲到。

(4)findByUsage(int usage) :返回使用到Usage,中的第一个Usage类型。

(5)getOffset(int usage)  :返回的好像是一个位置,这个土豆不是很清楚。不过,如果Mesh使用了顶点缓存(vertex buffer) ,那么这个获取的就是指定绘制的起端。

(6)size() 返回的是一个int类型,找到顶点数据的个数。

VertexAttributes.Usage 类

这是一个内部类,比较常用,所以土豆这里特别拿出来讲解下。

功能方法:

(1)ColorPacked  : 颜色数据类型.

(2)Normal 法线数据类型。(这个土豆也没用过,好像是翻译为“法线”)。

(3)Position 坐标数据类型,一般是定义顶点坐标,基本使用数组,常用。

(4)TextureCoordinates 纹理绑定类型,通俗讲就是使用图片,绑定顶点。


2.Mesh 类

图元的顶点是由VertexAttributes实例中所指定的各元素构成。在使用过程中VARM(帧存储器)和随机存储器mesh都是支持的。前者高性能是很优越的,如果硬件支持,它是首选。

图元用顶点和索引项来确定图形。每个顶点都拥有组成属性,比如位置,法线,颜色或纹理坐标。请注意,并非所有的这些属性必须在全部给定的在使用OpenGL ES 2.0绘制一个Mesh的时候,每个属性都有一个别名。别名用于顶点属性和shader属性绑定。着色器源和别名的属性必须完全匹配这个工作。图元可以与任何的OpenGL ES 1.x或OpenGL ES 2.0的使用。

构造方法:

Mesh(boolean isStatic, int maxVertices, int maxIndices, VertexAttributes attributes) 

   第一个参数:定义Mesh是否静态,对于那些不需要经常改动的Mesh,设置为静态可以提高OpenGL性能。

   第二个参数:顶点数,范围 1 - 4。

   第三个参数:索引数,也就是libGDX绘制图形时,由哪个店开始绘制,绘制中各个顶点的绘制先后顺序

   第四个参数:指定Mesh将会储存什么类型的数据,比如: position ,color 等。

功能方法:

(1)bind() :在所有索引数给定的前提下,可以将VertexArray/VertexBufferObject and IndexBufferObject整合的方法。

(2)calculateBoundingBox() :根据mesh中给定的顶点创建一个新的BoundingBox实例。

(3)clearAllMeshes(Application app) :清除缓存。

(4)copy(boolean isStatic) :复制这个图元。

(5)create(boolean isStatic, Mesh[] meshes) :由参数内提供的mesh,构建一个新的mesh图元。

(6)getIndices(short[] indices) :获取当前索引数,得到的是一个数组。

(7)render(int primitiveType, int offset, int count)   其中primitiveType指定绘制的形状,offset如果Mesh 使用了顶点缓存(vertex buffer) ,那么这个数就是起点,最后一个参数是指定索引的个数

(8)setIndices(short[] indices) :设置mesh的索引数。

(9)setVertices(float[] vertices) :设置mesh的顶点。

在图元mesh中,还有一些其他的方法,不过都是重复的方法,只是参数变化而已,这里土豆每个类型的方法拿出一个来讲解,大家可以根据这个,来学习其他的方法,都是顾名思义的,很简单的方法。


package com.example.groupactiontest;import com.badlogic.gdx.ApplicationListener;import com.badlogic.gdx.Gdx;import com.badlogic.gdx.Input.Keys;import com.badlogic.gdx.Input.Peripheral;import com.badlogic.gdx.graphics.GL10;import com.badlogic.gdx.graphics.Mesh;import com.badlogic.gdx.graphics.VertexAttribute;import com.badlogic.gdx.graphics.VertexAttributes;import com.badlogic.gdx.graphics.VertexAttributes.Usage;public class MyGame implements ApplicationListener {Mesh mesh;@Overridepublic void create() {/** * 一个mesh可能保存一个对象的位置、颜色、纹理等方面的信息 * 这4个参数分别为:是否静态、最大顶点数、最大索引数、Vertex属性 */mesh = new Mesh(true, 3, 3, new VertexAttribute(Usage.Position, 3, "position"));mesh.setVertices(new float[]{-0.5f,-0.5f,0,//第0个定点的坐标0.5f,-0.5f,0,//第1个顶点的坐标0,0.5f,0//第2个顶点的坐标});mesh.setIndices(new short[]{//设置索引的顺序,这里制定了从第0个顶点到1、20,1,2});}@Overridepublic void dispose() {// TODO Auto-generated method stub}@Overridepublic void pause() {// TODO Auto-generated method stub}@Overridepublic void render() {Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);mesh.render(GL10.GL_TRIANGLES,0,3);}@Overridepublic void resize(int arg0, int arg1) {// TODO Auto-generated method stub}@Overridepublic void resume() {// TODO Auto-generated method stub}}





0 0