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://m.survivalescaperooms.com)
新聞熱點
疑難解答