プリミティブの描画
MascotCapsule V4(V3互換) では Low Level API を利用したプリミティブの描画が可能です。
目次
描画できるプリミティブは以下のものがあります。
| プリミティブ | 説明 |
|---|---|
| 点 | 1ピクセルで描画される点 プリミティブ単位で色を指定できる ブレンド処理方法(ブレンドなし、半透明、加算、減算)を属性として選択できる |
| ライン | 2点を直線で結んだ幅1ピクセルのライン プリミティブ単位で色を指定できる ブレンド処理方法を属性として選択できる |
| 三角ポリゴン |
3点を指定することで描画される三角ポリゴン
|
| 四角ポリゴン | 4点を指定することで描画される四角ポリゴン 選択できるポリゴン属性は三角ポリゴンと同様 |
| ポイントスプライト | 表示座標を指定し、常に視点方向を向いた四角ポリゴンを描画する ブレンド処理方法を指定できる |

SamplePrimitive3D 実行画面 ( 左画像 : 表面,右画像 : 裏面 )
1. 各種プリミティブ
ここでは MascotCapsule V4(V3互換) で描画できるプリミティブについて説明します。
1.1. 点
3次元座標を指定して点を描画します。描画される点はスクリーンの設定によらず、1ピクセルで表現されます。
点を描画する際には、以下のパラメータが必要です。
- 点を描画する3次元座標 ( モデル座標系 )
- 点の色
- 点の属性とデータタイプ
1.2. ライン
3次元座標で示される 2点間を結ぶラインを描画します。描画されるラインの幅はスクリーンの設定によらず、1ピクセルで表現されます。
ラインを描画する際には、以下のパラメータが必要です。
- ラインの両端の3次元座標 ( モデル座標系 )
- ラインの色
- ラインの属性とデータタイプ
1.3. 三角ポリゴン
3次元座標で示される 3点で構成される三角ポリゴンを描画します。三角ポリゴンにはテクスチャを貼り付けるテクスチャポリゴンと、色を指定し、単色で描画されるカラーポリゴンがあります。
三角ポリゴンを描画する際には、以下のパラメータが必要です。
- 三角ポリゴンを構成する 3点の3次元座標 ( モデル座標系 )
- 三角ポリゴンの法線
- 三角ポリゴンに貼り付けるテクスチャ座標 ( テクスチャポリゴンの場合 )
- 三角ポリゴンの色 ( カラーポリゴンの場合 )
- 三角ポリゴンの属性とデータタイプ
1.4. 四角ポリゴン
3次元座標で示される 4点で構成される四角ポリゴンを描画します。三角ポリゴン同様、四角ポリゴンもテクスチャポリゴンとカラーポリゴンがあります。
四角ポリゴンを描画する際には、以下のパラメータが必要です。
- 四角ポリゴンを構成する 4点の3次元座標 ( モデル座標系 )
- 四角ポリゴンの法線
- 四角ポリゴンに貼り付けるテクスチャ座標( テクスチャポリゴンの場合 )
- 四角ポリゴンの色( カラーポリゴンの場合 )
- 四角ポリゴンの属性とデータタイプ
1.5. ポイントスプライト
3次元座標で示される 1点を中心とした、視点に対し常に正面を向く四角ポリゴンを描画します。
ポイントスプライトを描画する際には、以下のパラメータが必要です。
- ポイントスプライトの表示位置を示す1つの3次元座標 ( モデル座標系 )
- ポイントスプライトに貼り付けるテクスチャ座標
- ポイントスプライトのサイズとアングル
- ポイントスプライトの表示フラグ
- ポイントスプライトの属性とデータタイプ
なお、MascotCapsule V4(V3互換) におけるポイントスプライトは、表示の際、以下のフラグを指定して表示方法を決定します。
| フラグ | 説明 |
|---|---|
| M3DPSF_LOCAL_SIZE | モデル座標系におけるサイズを指定します |
| M3DPSF_PIXEL_SIZE | スクリーン座標系におけるサイズを指定します |
| M3DPSF_PERSPECTIVE | 透視投影においてパースを有効にします |
| M3DPSF_NO_PERS | 透視投影においてパースを無効にします |
これらのフラグを論理和で表示方式として指定します。
ただし、M3DPSF_LOCAL_SIZE と M3DPSF_PIXEL_SIZE 、および M3DPSF_PERSPECTIVE と M3DPSF_NO_PERS はそれぞれ排他的な関係にあります。
2. プリミティブ描画
IMICRO3D_Render_drawPrimitive () を使用することにより、複数のプリミティブを一括して描画登録することが可能です。描画登録後、IMICRO3D_Render_flush () を呼び出すことにより、実際の描画が行われます。なおこのとき、一度に登録できるのは同じ属性を持つ、同じプリミティブのみです。異なるプリミティブ、あるいは同じプリミティブでも異なる属性を持つ場合には別々に描画登録を行う必要があります。
(例) 同じプリミティブで異なる属性を持つ場合
法線をプリミティブ単位で持つ三角ポリゴンと頂点単位で持つ三角ポリゴン等
IMICRO3D_Render_drawPrimitive () は引数として以下のものを指定する必要があります。
- 描画位置の座標
- プリミティブの種類と属性、データタイプ
- プリミティブの数
- プリミティブを描画する際に使用する頂点配列
- プリミティブを描画する際に使用する法線配列
- プリミティブを描画する際に使用するテクスチャ位置情報配列
- プリミティブを描画する際に使用する色情報配列
また、テクスチャを用いる場合には Texture オブジェクトを指定する必要があります。
以下に各引数の説明を行います。
2.1. プリミティブの種類、属性、データタイプ、数の指定
IMICRO3D_Render_drawPrimitive () の第三引数でこれらの情報を指定します。
プリミティブの種類 | プリミティブの属性 | プリミティブのデータタイプ | ( プリミティブの数 << 16 )
というように各項目の論理和を指定します。
属性、およびデータタイプは必要なものを連記することができます。
プリミティブの種類は以下の宣言から指定します。
| プリミティブ | 宣言 |
|---|---|
| 点 | M3DP_POINTS |
| ライン | M3DP_LINES |
| 三角ポリゴン | M3DP_TRIANGLES |
| 四角ポリゴン | M3DP_QUADS |
| ポイントスプライト | M3DP_POINT_SPRITES |
プリミティブの指定は 1回の描画登録につき、必ず 1種類だけです。
属性に関しては以下の宣言の中から指定します。
| 宣言 | 説明 |
|---|---|
| M3DP_LIGHTING | プリミティブは光源処理の対象となります 点、ライン、ポイントスプライトでは無効です |
| M3DP_SPHERE_MAP | プリミティブはスフィアマップ処理の対象となります 点、ライン、ポイントスプライトでは無効です |
| M3DP_COLORKEY | プリミティブはカラーキーによる透過処理の対象となります 点、ラインでは無効です |
| M3DP_BLEND_NORM | ブレンド処理を行いません |
| M3DP_BLEND_HALF | 半透明処理を行います |
| M3DP_BLEND_ADD | 加算処理を行います |
| M3DP_BLEND_SUB | 減算処理を行います |
属性の設定は必要なものを論理和で追加してください。
ただし、プリミティブによっては受け付けない属性もあります。
また、光源、スフィアマップ、カラーキー、ブレンド処理等については、下記 BREW for KDDI - MascotCapsule
V4(V3互換)用サンプルも合わせてご覧ください。
データタイプに関しては以下の宣言から指定します。
| 宣言 | 説明 |
|---|---|
| M3DPD_NORAML_PER_FACE | プリミティブ単位で法線を持ちます 点、ライン、ポイントスプライトでは無効です |
| M3DPD_NORMAL_PER_VERTEX | 頂点単位で法線を持ちます 点、ライン、ポイントスプライトでは無効です |
| M3DPD_COLOR_PER_FACE | プリミティブ単位で色情報を持ちます ポイントスプライトでは無効です 点、ラインでは必ず指定してください |
| M3DPD_TEXCOORD | テクスチャ位置情報を持ちます 点、ラインでは無効です |
| M3DPD_TEXCOORD_AND_PS_PARAMS_PER_FACE | ポイントスプライトのテクスチャ位置情報を持ちます ポイントスプライトでのみ有効です ポイントスプライトではこれか M3DPD_TEXCOORD_AND_PS_PARAMS_PER_VERTEX を必ず指定してください |
| M3DPD_TEXCOORD_AND_PS_PARAMS_PER_VERTEX | ポイントスプライトのテクスチャ位置情報を持ちます ポイントスプライトでのみ有効です ポイントスプライトではこれか M3DPD_TEXCOORD_AND_PS_PARAMS_PER_FACEを必ず指定してください |
| M3DPD_NORMAL_NONE | 法線情報を持ちません |
| M3DPD_COLOR_NONE | 色情報を持ちません |
| M3DPD_TEXCOORD_NONE | テクスチャ位置情報を持ちません |
( * ) M3DPD_TEXCOORD_AND_PS_PARAMS_PER_FACE と M3DPD_TEXCOORD_AND_PS_PARAMS_PER_VERTEX
は処理としては同じ効果が得られます。両者の違いは、プログラム上の使用方法の相違になります。
データタイプの設定も属性等同様、必要なものを論理和で追記してください。プリミティブによっては受け付けないデータタイプ、または必須のデータタイプがあります。
2.2. 頂点配列
IMICRO3D_Render_drawPrimitive () の第四引数でプリミティブに必要な頂点を設定します。
指定には、 IntArray を使用します。
プリミティブの種類によって必要な頂点数は異なりますので、適切な数の頂点を設定してください。
IntArray coord;
/* 三角ポリゴンの頂点を配列で指定 ( 2つ分 ) */
hi_sint32 coord_array [] = {
-1000,500,0, 1000,500,0, 0,-1414+500,0 /* 2 */
/* 配列の情報をIntArray にまとめる */
coord.num = sizeof ( coord_array ) / sizeof ( coord_array [ 0 ] ) ;
coord.a rray = coord_array ;
| プリミティブ | 必要な頂点数 |
|---|---|
| 点 | プリミティブ数×1 |
| ライン | プリミティブ数×2 |
| 三角ポリゴン | プリミティブ数×3 |
| 四角ポリゴン | プリミティブ数×4 |
| ポイントスプライト | プリミティブ数×1 |
実際には各頂点は ( x, y, z ) の三要素から成り立ちますので、配列そのものの大きさは頂点数×3となります。頂点の三要素の格納順は x, y, z の順です。
2.3. 法線配列
IMICRO3D_Render_drawPrimitive () の第五引数でプリミティブに必要な法線を設定します。
指定には、IntArray を使用します。
プリミティブの種類、データタイプによって必要な法線数は異なりますので、適切な数の法線を設定してください。
IntArray normal;
/* 三角ポリゴンの法線を配列で指定 ( 2つ分 ) */
hi_sint32 normal_array [] = {
0,0,4096 /* 2 */
/* 配列の情報をIntArrayにまとめる */
normal.num = sizeof ( normal_array ) / sizeof ( normal_array [ 0 ] ) ;
normal.array = normal_array;
| プリミティブ | データタイプ | 必要な法線数 |
|---|---|---|
| 点 | - - - | 0 |
| ライン | - - - | 0 |
| 三角ポリゴン | M3DPD_NORMAL_NONE | 0 |
| M3DPD_NORMAL_PER_FACE | プリミティブ数×1 | |
| M3DPD_NORMAL_PER_VERTEX | プリミティブ数×3 | |
| 四角ポリゴン | M3DPD_NORMAL_NONE | 0 |
| M3DPD_NORMAL_PER_FACE | プリミティブ数×1 | |
| M3DPD_NORMAL_PER_VERTEX | プリミティブ数×4 | |
| ポイントスプライト | - - - | 0 |
また、法線は正規化されている必要があります。MascotCapsule での正規化は長さが 4096 の状態を言います。
2.4. テクスチャ位置情報配列
IMICRO3D_Render_drawPrimitive () の第六引数でプリミティブに必要なテクスチャ位置情報を設定します。指定には、IntArrayを使用します。
プリミティブの種類、データタイプによって必要なテクスチャ位置情報数は異なりますので、適切な数のテクスチャ位置情報を設定してください。
IntArray texcoord;
/* 四角ポリゴンのテクスチャ位置情報を配列で指定 */
hi_sint32 texcoord_array [] = {
/* 配列の情報を IntArray にまとめる */
texcoord.num = sizeof ( texcoord_array ) / sizeof ( texcoord_array [ 0 ] ) ;
texcoord.array = texcoord_array;
| プリミティブ | データタイプ | 必要なテクスチャ位置情報の数 |
|---|---|---|
| 点 | - - - | 0 |
| ライン | - - - | 0 |
| 三角ポリゴン | M3DPD_COLOR_PER_FACE | 0 |
| M3DPD_TEXCOORD | プリミティブ数×3 | |
| 四角ポリゴン | M3DPD_COLOR_PER_FACE | 0 |
| M3DPD_TEXCOORD | プリミティブ数×4 | |
| ポイントスプライト | M3DPD_TEXCOORD_AND_PS_PARAMS_PER_FACE | プリミティブ数×1 (*) |
| M3DPD_TEXCOORD_AND_PS_PARAMS_PER_VERTEX | 頂点数×1 (*) |
三角ポリゴン、および四角ポリゴンの頂点情報はテクスチャ上の2次元座標 ( x, y ) ですので、配列そのものの大きさはテクスチャ位置情報の数×2となります。また、三角ポリゴン、および四角ポリゴンの頂点情報で設定された座標と、テクスチャ位置情報で設定された座標は設定された順番に応じて対応付けがなされます。
( * ) ポイントスプライトの場合、ポイントスプライトの各パラメータもここに含まれます。
ポイントスプライトに必要なパラメータは、
- ポイントスプライトの幅
- ポイントスプライトの高さ
- ポイントスプライトのアングル ( 360度 = 4096 )
- ポイントスプライトの左上に相当するテクスチャ位置情報 ( x, y )
- ポイントスプライトの右下に相当するテクスチャ位置情報 ( x, y )
- ポイントスプライトの表示フラグ ( 1.5.ポイントスプライトの項目を参照 )
以上のものがあり、配列そのものの大きさはプリミティブ数×8となります。
hi_sint32 texcoord_array [] = {
4096, /* angle */
0,0, /* texture position ( On the left ) */
255,255, /* texture position ( Lower right ) */
M3DPSF_LOCAL_SIZE | M3DPSF_PERSPECTIVE /* display flag */
2.5. 色情報配列
IMICRO3D_Render_drawPrimitive () の第七引数でプリミティブに必要な色情報を設定します。
指定には、 IntArray を使用します。
プリミティブの種類、データタイプによって必要な色情報数は異なりますので、適切な数の色情報を設定してください。
IntArray color;
/* 三角ポリゴンの色情報を配列で指定 ( 2つ分 ) */
hi_sint32 color_array [] = {
255 << 16 | 0 << 8 | 0, /* 1 */
0 << 16 | 255 << 8 | 0 /* 2 */
};
/* 配列の情報を IntArray にまとめる */
color.num = sizeof ( color_array ) / sizeof ( color_array [ 0 ] ) ;
color.array = color_array;
| プリミティブ | データタイプ | 必要な色情報の数 |
|---|---|---|
| 点 | M3DPD_COLOR_PER_FACE | プリミティブ数×1 |
| ライン | M3DPD_COLOR_PER_FACE | プリミティブ数×1 |
| 三角ポリゴン | M3DPD_COLOR_NONE | 0 |
| M3DPD_COLOR_PER_FACE | プリミティブ数×1 | |
| M3DPD_TEXCOORD | 0 | |
| 四角ポリゴン | M3DPD_COLOR_NONE | 0 |
| M3DPD_COLOR_PER_FACE | プリミティブ数×1 | |
| M3DPD_TEXCOORD | 0 | |
| ポイントスプライト | - - - | 0 |
色情報は RGB で各要素が 8bit の 24bit 形式で指定します。これは、実際の環境のピクセル情報に左右されることがありません。
( R 要素 << 16 ) | ( G << 8 ) | ( B )
したがって、配列そのものの大きさは必要な色情報の数×1となります。
以上を設定後、IMICRO3D_Render_drawPrimitive () を用いてプリミティブの描画登録を行います。
以下にその例を示します。
/* 描画登録 */
IMICRO3D_Render_drawPrimitive ( pMe-> pIM3D,
M3DP_TRIANGLES |
M3D_BLEND_NORM | M3D_LIGHTING |
M3DPD_COLOR_PER_FACE | M3DPD_TEXCOORD_NONE |
type |
( 2 << 16 ),
&coord, &normal, NULL, &color
);
3. プリミティブ描画のサンプルコード
プリミティブの描画に関する部分のコードを以下に示します。ここでは三角ポリゴンの描画を例としています。
IntArray normal; /* 法線配列 */
IntArray color; /* 色情報配列 */
hi_sint32 type = M3DPD_NORMAL_PER_FACE; /* プリミティブのタイプ */
/* 頂点情報 */
hi_sint32 coord_array [] = {
-1000,500,0, 1000,500,0, 0, 1414+500,0, /* 1 */
-1000,500,0, 1000,500,0, 0,-1414+500,0 /* 2 */
};
/* 法線配列 */
hi_sint32 normal_array [] = {
0,0,4096, /* 1 */
0,0,4096 /* 2 */
};
/* 色情報配列 */
hi_sint32 color_array [] = {
( 255 << SHIFT_R ) | ( 0 << SHIFT_G ) | 0, /* 1 */
( 0 << SHIFT_R ) | ( 255 << SHIFT_G ) | 0 /* 2 */
};
coord.num = sizeof ( coord_array ) / sizeof ( coord_array [ 0 ] ) ;
coord.array = coord_array;
normal.num = sizeof ( normal_array ) / sizeof ( normal_array [ 0 ] ) ;
normal.array = normal_array;
color.num = sizeof ( color_array ) / sizeof ( color_array [ 0 ] ) ;
color.array = color_array;
if ( pMe -> mc_data.normal_flag ! = TRUE )
{
/* 描画登録 */
IMICRO3D_Render_drawPrimitive ( pMe -> pIM3D,
M3DP_TRIANGLES |
M3D_BLEND_NORM | M3D_LIGHTING |
M3DPD_COLOR_PER_FACE | M3DPD_TEXCOORD_NONE |
type |
( 2 << 16 ),
&coord,
&normal,
NULL,
&color ) ;
以上の流れで、1種類のプリミティブを複数個一括で描画することができます。
他の種類のプリミティブの描画を行う場合、再度上記の流れを行います。

