Mascot Capsule v3是针对移动设备的图形渲染接口,由十个类构成,它们对开发一些大型的3D游戏和应用程序提供了充分的支持。Mascot Capsule v3提供了一些工具,可以帮助你创建资源像由3D建模和图像编辑的权威应用程序产生的.mbac、.mtra和.bmp文件。
你可以使用Mascot Capsule v3提供的工具和类真正地创建一些优秀的游戏程序。但是在这里我将解释它如何渲染基本的原型和如何使用这些原型元素在你的游戏和应用程序中创建一些奇妙的效果。
和很多其它图形渲染API一样,Mascot Capsule v3使用两个简单的原型结构渲染所有的3D数据:三角形或者四边形。我们同样可以使用这些原型实际调试游戏元素和程序。这些原型通过使用Mascot Capsule v3提供的命令列表来渲染。
在这篇文章中,在下列的几部分中,我将讨论原型渲染和效果产生:
l 什么是命令列表
l 如何定义和使用命令列表
l 命令列表的运行时操作
l 四边形的色彩抖动
l 四边形的纹理抖动
l 调试画线
什么是命令列表?
3D数据被传递给任何图形渲染引擎时,每一个顶点都是通过顶点位置(例如3D空间中的x、y和z坐标)、法线、纹理坐标、平面列表和点的颜色呈现。Mascot Capsule v3提供了命令列表的概念。一个简单的命令列表(Command List)只是一个上述所有数据包含在一个整数集合中,并称之为列表。Mascot Capsule v3给出了不同的渲染命令,针对提供数据的设置不同渲染指令。
我们可以渲染以下的原型类型:
l PRIMITIVE_LINES
l PRIMITIVE_POINT_SPRITES
l PRIMITIVE_POINTS
l PRIMITIVE_QUADS
l PRIMITIVE_TRIANGLES
渲染指令类型和命令类型:
l 命令
l 环境属性
l 原型属性
l 原始数据类型
l Point Sprite Flags(点精灵标记)
l 原型类型(线、三角形和四边形等)
如何定义和使用命令列表
定义一个命令列表是一项相当简单的工作。考虑将下面的模版作为一个在Mascot Capsule v3中定义命令列表的通用模版。
int nCommandList[] =
{
COMMAND_LIST_VERSION_1_0,
Other Command 1,
.
.
.
Other Command 2,
渲染指令数据和原型数量保存在一个整数中。(透明度、颜色、法线、原型类型和原型属性)
顶点:每个点有x、y和z坐标。描述一个点需要三个整数。
顶点法线:每个点有x、y和z坐标。描述一个法线需要三个整数(它是一个向量)。
顶点颜色red<<16green<<8blue:颜色为每一个平面设置。如果有五个三角形,那么需要五个整数为每一个三角形设置颜色。
顶点纹理坐标tu,tv:如上定义,每个顶点只需要两个整数设置纹理坐标。
COMMAND_END,
};
论述已经足够了。正好看一个简单的例子和对上面通用模版的解释。那么你可以绘制一个三角形,这是命令列表。
nCommandList = new int[16];
这句话决定了在你的命令列表中有几个整数。
nCommandList[0] = Graphics3D.COMMAND_LIST_VERSION_1_0;
这个命令指出了命令列表的版本。对命令列表的第一个元素来说,这是一直不变。
nCommandList[1] = Graphics3D.PRIMITVE_TRIANGLES Graphics3D.PDATA_NORMAL_PER_FACE
Graphics3D.PDATA_COLOR_PER_FACE Graphics3D.PATTR_BLEND_NORMAL
1<<16/*Number Of primitives*/;
这些是针对你的数据的渲染指令设置。不同命令属性和类型的合并放在一个整数中。这里我们设置原型类型为三角形。每个平面有一个法线,也就是,因为我们有一个三角形,所以有一个法线。整个平面设置一个颜色值。原型混合设置为法线。然后,设置你将要使用命令列表渲染的原型的数量。有趣的是,原型的数量向左移16。为什么这样呢?
一个非常简单的答案。所有的渲染指令命令和给出的原型数量一起放在一个整数中。32位整数如下划分:
FF
FF
FF
FF
所有命令和原型类型信息
原型数量保存在一个字节中
原型数据信息如法线、顶点、颜色等等
环境属性、原型属性和点精灵数据
如表格所示,原型的数量被存储在整数的第二个字节中,这就是为什么数字左移16位,可存储的最大值是255。这就意味着我们使用一个命令列表绘制的原型数量不能多于255个。如果我想绘制超过255个原型,如何做呢?使用其它的命令列表吗?简单。
nCommandList[2] = 0;
nCommandList[3] = 100;
nCommandList[4] = 0;
nCommandList[5] = -100;
nCommandList[6] = 0;
nCommandList[7] = 0;
nCommandList[8] = 100;
nCommandList[9] = 0;
nCommandList[10] = 0;
现在已经准备好了原型描述数据。这里它是一个三角形。因此我们需要三个顶点。每一个顶点有xyz三个坐标组成。这就是说对于一个三角形我们需要三个点乘以每点的三个坐标=9个整数。如果有两个三角形,那么我就需要声明18个整数从而描述两个三角形的顶点数据。
nCommandList[11] = 0;
nCommandList[12] = 0;
nCommandList[13] = 4096;
法线被用来计算光照信息,并且它们也可以被每个平面设置。每个法线需要三个整数,如果原型的数量等于X,那么你需要X法线,3*X=3X个整数。
nCommandList[14] = 255 << 16 0 << 8 0;
此外每个平面还需要颜色信息。它用一个整数值按照RGB格式表示颜色。格式是RED<<16GREEN<<8BLUE。
nCommandList[15] =Graphics3D.COMMAND_END;
需要最后一个元素表示命令列表的结束。它是最后一个常数值,被赋给了命令列表整数数据的最后一个元素。
一旦设置了命令列表数据,我们可以调用下面的函数来为我们产生一些东西。
g3d.drawCommandList(texture,0,0,layout,effect,nCommandList);
无论是否使用,你都必须提供一个纹理。设置你想要实现的布局和效果,只需把它提供给这个函数。它将会使用给定的渲染指令渲染所有数据。FigureLayout(图形布局)包含原型的位置(position)、方向(orientation)和投影(projection),以及要渲染的模型。Effects(效果)包含了像阴影、透明度和光照等信息的不同设置。通常这些东西也可以使用命令列表设置。但是drawCommandList丰富需要布局(layout)和效果(effect)对象,所以总是设置这些东西在命令列表以外的独立部分。
命令列表的运行时操作
一旦命令列表就绪,它们就可以渲染每一帧。通过改变命令列表的属性,你可以获得不同类型的效果。运行时操作十分容易。考虑我们在三角形渲染中设置的渲染指令。我们可以改变那个三角形的透明度的每一帧,通过改变整数来产生一个普通的效果。假定我们有一个固定的变量nCounter,每一帧将使用下面的代码:
nCounter = (nCounter + 1) % 2;
if(nCounter ==0 )
nCommandList[1] = Graphics3D.PRIMITVE_TRIANGLES Graphics3D.PDATA_NORMAL_PER_FACE
Graphics3D.PDATA_COLOR_PER_FACE Graphics3D.PATTR_BLEND_NORMAL
1<<16/*Number Of primitives*/;
else
nCommandList[1] = Graphics3D.PRIMITVE_TRIANGLES Graphics3D.PDATA_NORMAL_PER_FACE
Graphics3D.PDATA_COLOR_PER_FACE Graphics3D.PATTR_BLEND_HALF
1<<16/*Number Of primitives*/;
上面的代码将会改变每一帧三角形的渲染指令,将会改变透明度到正常和半混合状态。轻而易举!你可以设置任何整型参数,可以产生你想要的酷炫效果。
四边形的颜色抖动
如前面讨论一个原型的颜色抖动十分容易!只需要改变每帧的颜色值整数,然后就可以得到效果。下面的代码再次展示了颜色抖动:
nCommandList[14] = random.nextInt();
四边形的纹理抖动
在解释纹理抖动前,我们先看看如何设置四边形的纹理。
nCommandList = new int[26];
nCommandList[0] = Graphics3D.COMMAND_LIST_VERSION_1_0;
nCommandList[1] = Graphics3D.PRIMITVE_QUADS Graphics3D.PDATA_NORMAL_PER_FACE
Graphics3D.PDATA_COLOR_NONE Graphics3D.PATTR_BLEND_HALF
Graphics3D.PDATA_TEXURE_COORD 1<<16/*Number Of primitives*/;
nCommandList[2] = -100;
nCommandList[3] = 100;
nCommandList[4] = 0;
nCommandList[5] = -100;
nCommandList[6] = -100;
nCommandList[7] = 0;
nCommandList[8] = 100;
nCommandList[9] = -100;
nCommandList[10] = 0;
nCommandList[11] = 100;
nCommandList[12] = 100;
nCommandList[13] = 0;
nCommandList[14] = 0;
nCommandList[15] = 0;
nCommandList[16] = 4096;
nCommandList[17] = 0;
nCommandList[18] = 0;
nCommandList[19] = 0;
nCommandList[20] = 128;
nCommandList[21] = 128;
nCommandList[22] = 128;
nCommandList[23] = 128;
nCommandList[24] = 0;
nCommandList[25] =Graphics3D.COMMAND_END;
首先,设置渲染指令半混合,接着按照逆时针方向设置四个顶点。然后设置三个点到法线和从17到24整数作为顶点坐标。
看一下下面的图像。这个图像的大小是256*256像素。然而我只设置这个图像的第一个四分之一部分。为了设置纹理坐标,我们需要了解尺寸信息。这里我们设置它为图像的(0,0)像素,它必须映射到第一个顶点。然后(0,128)像素必须映射打第二个顶点,以此类推。记住,纹理映射也是顺时针方向旋转,和顶点一样。
命令列表问题可以分为两种方式。第一种方式,当使用drawCommandList方法绘制命令列表时,你可以直接设置不同的纹理。使用这种方式,纹理坐标保持完整无缺。然而第二种方式,如果你的图像压缩在一个最大尺寸为256*256像素的图像中,你可以实际改变纹理坐标。然后简单地映射不同的像素矩阵值到你的原型数据。
nCommandList[17] = 128;
nCommandList[18] = 128;
nCommandList[19] = 128;
nCommandList[20] = 255;
nCommandList[21] = 255;
nCommandList[22] = 255;
nCommandList[23] = 255;
nCommandList[24] = 128;
为调试绘制直线
直线可以用来调试你的程序。我使用直线检查我的相机观察点和视点,如下:
nCommandList[1] = Graphics3D.PRIMITVE_LINES Graphics3D.PDATA_COLOR_PER_FACE Graphics3D.PATTR_BLEND_NORMAL
3<<16;
原型类型被设置为PRIMITIVE LINES,混合被设置为正常。我只是想画三条线。
nCommandList[2] = 0;
nCommandList[3] = 0;
nCommandList[4] = 0; //First point of the first line
nCommandList[5] = 100;
nCommandList[6] = 100;
nCommandList[7] = 100; //Second point of the first line
nCommandList[8] = 100;
nCommandList[9] = 100;
nCommandList[10] = 100; //First point of the second line
nCommandList[11] = 100;
nCommandList[12] = 0;
nCommandList[13] = 100; //Second point of the second line
nCommandList[14] = 0;
nCommandList[15] = 0;
nCommandList[16] = 0; //First point of the third line
nCommandList[17] = 100;
nCommandList[18] = 0;
nCommandList[19] = 100; //Second point of the third line
然后是每个平面的颜色,也就是每条线作如下设置:
nCommandList[20] = 255 << 16 0 << 8 0; .//Red color
nCommandList[21] = 0 << 16 255 << 8 0; //Green Color
nCommandList[22] = 0 << 16 0 << 8 255; // Blue color
那么,如此就结束了讨论。更多的细节参考源代码。
代码示例和源文件
原文地址:http://developer.sonyeriCSSon.com/site/global/techsupport/tipstrickscode/mobilejava3d/p_indiagames_mascotcapsule_command+lists.jsp
(出处:http://www.knowsky.com)