(libgdx学习)mesh的简单使用

您所在的位置:网站首页 opengl和opengles2 (libgdx学习)mesh的简单使用

(libgdx学习)mesh的简单使用

2023-05-09 20:37| 来源: 网络整理| 查看: 265

1.VertexAttributes 类

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

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

预定义名称:

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

构造方法:

VertexAttribute( 

int 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/VertexBufferObjectand 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):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; @Override public 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、2 0,1,2 }); } @Override public void dispose() { // TODO Auto-generated method stub } @Override public void pause() { // TODO Auto-generated method stub } @Override public void render() { Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); mesh.render(GL10.GL_TRIANGLES,0,3); } @Override public void resize(int arg0, int arg1) { // TODO Auto-generated method stub } @Override public void resume() { // TODO Auto-generated method stub } }



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3