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

サンプル実行画面
1. 各種プリミティブ
ここでは MascotCapsule 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 V3 におけるポイントスプライトは、表示の際、以下のフラグを指定して表示方法を決定します。
| フラグ | 説明 |
|---|---|
| POINT_SPRITE_LOCAL_SIZE | モデル座標系におけるサイズを指定します |
| POINT_SPRITE_PIXEL_SIZE | スクリーン座標系におけるサイズを指定します |
| POINT_SPRITE_PERSPECTIVE | 透視投影においてパースを有効にします |
| POINT_SPRITE_NO_PERS | 透視投影においてパースを無効にします |
これらのフラグを論理和で表示方式として指定します。
ただし、POINT_SPRITE_LOCAL_SIZE と POINT_SPRITE_PIXEL_SIZE、および POINT_SPRITE_PERSPECTIVE
と POINT_SPRITE_NO_PERS はそれぞれ排他的な関係にあります。
2. プリミティブ描画
Graphics3D.renderPrimitives() メソッドを使用することにより、複数のプリミティブを一括して描画登録することが可能です。描画登録後、Graphics3D.flush() メソッドを呼び出すことにより、実際の描画が行われます。なおこのとき、一度に登録できるのは同じ属性を持つ、同じプリミティブのみです。異なるプリミティブ、あるいは同じプリミティブでも異なる属性を持つ場合には別々に描画登録を行う必要があります。
(例) 同じプリミティブで異なる属性を持つ場合
法線をプリミティブ単位で持つ三角ポリゴンと頂点単位で持つ三角ポリゴン等
Graphics3D.renderPrimitives() は引数として以下のものを指定する必要があります。
- 描画位置の座標
- プリミティブの種類と属性、データタイプ
- プリミティブの数
- プリミティブを描画する際に使用する頂点配列
- プリミティブを描画する際に使用する法線配列
- プリミティブを描画する際に使用するテクスチャ位置情報配列
- プリミティブを描画する際に使用する色情報配列
このとき、頂点配列・法線配列・テクスチャ位置情報配列・色情報配列のいずれかの配列に、使用しないものが存在する場合も何らかの配列を指定するようにしてください。
また、テクスチャを用いる場合には Texture オブジェクトを指定する必要があります。
以下に各引数の説明を行います。
2.1. プリミティブの種類、属性、データタイプ
これらの引数の指定方法は以下の通りです。
プリミティブの種類 | プリミティブの属性 | プリミティブのデータタイプ
というように各項目の論理和を指定します。
/* 三角ポリゴン */
triangles = Graphics3D.PRIMITVE_TRIANGLES |
Graphics3D.PDATA_COLOR_PER_FACE | Graphics3D.PATTR_LIGHTING;
属性、およびデータタイプは必要なものを連記することができます。
プリミティブの種類は以下の宣言から指定します。
| プリミティブ | 宣言 |
|---|---|
| 点 | PRIMITVE_POINTS |
| ライン | PRIMITVE_LINES |
| 三角ポリゴン | PRIMITVE_TRIANGLES |
| 四角ポリゴン | PRIMITVE_QUADS |
| ポイントスプライト | PRIMITVE_POINT_SPRITES |
プリミティブの指定は一回の描画登録につき、必ず一種類だけです。
属性に関しては以下の宣言の中から指定します。
| 宣言 | 説明 |
|---|---|
| PATTR_LIGHTING | プリミティブは光源処理の対象となります 点、ライン、ポイントスプライトでは無効です |
| PATTR_SPHERE_MAP | プリミティブはスフィアマップ処理の対象となります 点、ライン、ポイントスプライトでは無効です |
| PATTR_COLORKEY | プリミティブはカラーキーによる透過処理の対象となります 点、ラインでは無効です |
| PATTR_BLEND_NORM | ブレンド処理を行いません |
| PATTR_BLEND_HALF | 半透明処理を行います |
| PATTR_BLEND_ADD | 加算処理を行います |
| PATTR_BLEND_SUB | 減算処理を行います |
属性の設定は必要なものを論理和で追加してください。ただし、プリミティブによっては受け付けない属性もあります。
また、光源、スフィアマップ、カラーキー、ブレンド処理等については、下記 MIDP + MascotCapsule V3 API
サンプルも合わせてご覧ください。
データタイプに関しては以下の宣言から指定します。
| 宣言 | 説明 |
|---|---|
| PDATA_NORAML_PER_FACE | プリミティブ単位で法線を持ちます 点、ライン、ポイントスプライトでは無効です |
| PDATA_NORMAL_PER_VERTEX | 頂点単位で法線を持ちます 点、ライン、ポイントスプライトでは無効です |
| PDATA_COLOR_PER_COMMAND | コマンド共通の色情報を持ちます ポイントスプライトでは無効です 点、ラインではこれか PDATA_COLOR_PER_FACE を必ず指定してください |
| PDATA_COLOR_PER_FACE | プリミティブ単位で色情報を持ちます ポイントスプライトでは無効です 点、ラインではこれか PDATA_COLOR_PER_COMMAND を必ず指定してください |
| PDATA_TEXURE_COORD | テクスチャ位置情報を持ちます 点、ラインでは無効です |
| PDATA_POINT_SPRITE_PARAMS_PER_CMD | ポイントスプライトに共通のテクスチャ位置情報を持ちます ポイントスプライトでのみ有効です ポイントスプライトではこれか PDATA_POINT_SPRITE_PARAMS_PER_FACE あるいは PDATA_POINT_SPRITE_PARAMS_PER_VERTEX を必ず指定してください |
| PDATA_POINT_SPRITE_PARAMS_PER_FACE | プリミティブ毎にポイントスプライトのテクスチャ位置情報を持ちます (*) ポイントスプライトでのみ有効です ポイントスプライトではこれか PDATA_POINT_SPRITE_PARAMS_PER_CMD あるいは PDATA_POINT_SPRITE_PARAMS_PER_VERTEX を必ず指定してください |
| PDATA_POINT_SPRITE_PARAMS_PER_VERTEX | 頂点ごとにポイントスプライトのテクスチャ位置情報を持ちます (*) ポイントスプライトでのみ有効です ポイントスプライトではこれか PDATA_POINT_SPRITE_PARAMS_PER_CMD あるいは PDATA_POINT_SPRITE_PARAMS_PER_FACE を必ず指定してください |
| PDATA_NORMAL_NONE | 法線情報を持ちません |
| PDATA_COLOR_NONE | 色情報を持ちません |
| PDATA_TEXURE_COORD_NONE | テクスチャ位置情報を持ちません |
(*) PDATA_POINT_SPRITE_PARAMS_PER_FACE と
PDATA_POINT_SPRITE_PARAMS_PER_VERTEX は処理としては同じ効果が得られます。両者の違いは、プログラム上の使用方法の相違になります。
データタイプの設定も属性等同様、必要なものを論理和で追記してください。プリミティブによっては受け付けないデータタイプ、または必須のデータタイプがあります。
ポイントスプライトで PDATA_POINT_SPRITE_PARAMS_PER_CMD を指定した場合、テクスチャ位置情報( = ポイントスプライトのパラメータ)を使いまわすことができます。
同様に、PDATA_COLOR_PER_COMMAND が指定されたときは、色情報を使いまわすことが可能です。
2.2. 頂点配列
頂点配列の指定には int 型の配列を使用します。
プリミティブの種類によって必要な頂点数は異なりますので、適切な数の頂点を設定してください。
/* 頂点情報 */
/* 1つめ */
trVertex [ 0 ] = 0;
trVertex [ 1 ] = 256;
trVertex [ 2 ] = 0;
trVertex [ 3 ] = -128;
trVertex [ 4 ] = 0;
trVertex [ 5 ] = 0;
trVertex [ 6 ] = 128;
trVertex [ 7 ] = 0;
trVertex [ 8 ] = 0;
/* 2つめ */
trVertex [ 9 ] = 0;
trVertex [ 10 ] = -256;
trVertex [ 11 ] = 0;
trVertex [ 12 ] = -128;
trVertex [ 13 ] = 0;
trVertex [ 14 ] = 0;
trVertex [ 15 ] = 128;
trVertex [ 16 ] = 0;
trVertex [ 17 ] = 0;
| プリミティブ | 必要な頂点数 |
|---|---|
| 点 | プリミティブ数×1 |
| ライン | プリミティブ数×2 |
| 三角ポリゴン | プリミティブ数×3 |
| 四角ポリゴン | プリミティブ数×4 |
| ポイントスプライト | プリミティブ数×1 |
実際には各頂点は ( x, y, z ) の三要素から成り立ちますので、配列そのものの大きさは頂点数×3 となります。頂点の三要素の格納順は x, y, z の順です。
2.3. 法線配列
法線配列の指定には int 型の配列を使用します。プリミティブの種類、および、データタイプによって必要な法線数は異なりますので、適切な数の法線を設定してください。
/* 法線情報 */
/* 1つめ */
trNormal [ 0 ] = 0;
trNormal [ 1 ] = 0;
trNormal [ 2 ] = 4096;
/* 2つめ */
trNormal [ 3 ] = 0;
trNormal [ 4 ] = 0;
trNormal [ 5 ] = 4096;
| プリミティブ | データタイプ | 必要な法線数 |
|---|---|---|
| 点 | - - - | 0 |
| ライン | - - - | 0 |
| 三角ポリゴン | PDATA_NORMAL_NONE | 0 |
| PDATA_NORMAL_PER_FACE | プリミティブ数×1 | |
| PDATA_NORMAL_PER_VERTEX | プリミティブ数×3 | |
| 四角ポリゴン | PDATA_NORMAL_NONE | 0 |
| PDATA_NORMAL_PER_FACE | プリミティブ数×1 | |
| PDATA_NORMAL_PER_VERTEX | プリミティブ数×4 | |
| ポイントスプライト | - - - | 0 |
実際には各法線は ( x, y, z ) の三要素から成り立ちますので、配列そのものの大きさは法線数×3 となります。法線の三要素の格納順は
x, y, z の順です。
また、法線は正規化されている必要があります。MascotCapsule での正規化は長さが 4096 の状態を言います。
2.4. テクスチャ位置情報配列
テクスチャ位置情報配列の指定には int 型の配列を使用します。プリミティブの種類、および、データタイプによって必要なテクスチャ位置情報の数は異なりますので、適切な数のテクスチャ位置情報を設定してください。
/* テクスチャ位置情報 */
qdTexCoord [ 0 ] = 255;
qdTexCoord [ 1 ] = 255;
qdTexCoord [ 2 ] = 0;
qdTexCoord [ 3 ] = 255;
qdTexCoord [ 4 ] = 0;
qdTexCoord [ 5 ] = 0;
qdTexCoord [ 6 ] = 255;
qdTexCoord [ 7 ] = 0;
| プリミティブ | データタイプ | 必要なテクスチャ位置情報の数 |
|---|---|---|
| 点 | - - - | 0 |
| ライン | - - - | 0 |
| 三角ポリゴン | PDATA_COLOR_PER_FACE または PDATA_COLOR_PER_COMMAND | 0 |
| PDATA_TEXURE_COORD | プリミティブ数×3 | |
| 四角ポリゴン | PDATA_COLOR_PER_FACE または PDATA_COLOR_PER_COMMAND | 0 |
| PDATA_TEXURE_COORD | プリミティブ数×4 | |
| ポイントスプライト | PDATA_POINT_SPRITE_PARAMS_PER_CMD | 1 (*) |
| PDATA_POINT_SPRITE_PARAMS_PER_FACE | プリミティブ数×1 (*) | |
| PDATA_POINT_SPRITE_PARAMS_PER_VERTEX | 頂点数×1 (*) |
三角ポリゴン、および四角ポリゴンの頂点情報はテクスチャ上の2次元座標 ( x, y ) ですので、配列そのものの大きさはテクスチャ位置情報の数×2
となります。また、三角ポリゴン、および四角ポリゴンの頂点情報で設定された座標と、テクスチャ位置情報で設定された座標は設定された順番に応じて対応付けがなされます。
(*) ポイントスプライトの場合、ポイントスプライトの各パラメータもここに含まれます。
ポイントスプライトに必要なパラメータは、
- ポイントスプライトの幅
- ポイントスプライトの高さ
- ポイントスプライトのアングル( 360度 = 4096 )
- ポイントスプライトの左上に相当するテクスチャ位置情報 ( x, y )
- ポイントスプライトの右下に相当するテクスチャ位置情報 ( x, y )
- ポイントスプライトの表示フラグ
以上のものがあり、配列そのものの大きさはプリミティブ数×8 となります。
2.5. 色情報配列
色情報配列の指定には int 型の配列を使用します。プリミティブの種類、および、データタイプによって必要な法線数は異なりますので、適切な数の色情報を設定してください。
/* 色情報 */
/* 1つめ */
trColor[0] = ( ( 255 << 16 ) | ( 0 << 8 ) | ( 0 ) );
/* 2つめ */
trColor[1] = ( ( 0 << 16 ) | ( 255 << 8 ) | ( 0 ) );
| プリミティブ | データタイプ | 必要な色情報の数 |
|---|---|---|
| 点 | PDATA_COLOR_PER_COMMAND | 1 |
| PDATA_COLOR_PER_FACE | プリミティブ数×1 | |
| ライン | PDATA_COLOR_PER_COMMAND | 1 |
| PDATA_COLOR_PER_FACE | プリミティブ数×1 | |
| 三角ポリゴン | PDATA_COLOR_NONE | 0 |
| PDATA_COLOR_PER_COMMAND | 1 | |
| PDATA_COLOR_PER_FACE | プリミティブ数×1 | |
| 四角ポリゴン | PDATA_COLOR_NONE | 0 |
| PDATA_COLOR_PER_COMMAND | 2 | |
| PDATA_COLOR_PER_FACE | プリミティブ数×1 | |
| ポイントスプライト | - - - | 0 |
色情報は RGB で各要素が 8bit の 24bit 形式で指定します。これは、実際の環境のピクセル情報に左右されることがありません。
( R 要素 << 16 ) | ( G << 8 ) | ( B )
したがって、配列そのものの大きさは必要な色情報の数×1 となります。
3. プリミティブ描画のサンプルコード
ここではサンプルコード内のプリミティブ描画に関する部分について説明します。ここでは 「1. 各種プリミティブ」 「2. プリミティブ描画」で使用した、三角ポリゴンの描画を例にとって説明します。
private int triangles; // 三角ポリゴン情報
private int [] trVertex = new int [ 18 ] ; // 三角ポリゴン頂点配列
private int [] trNormal = new int [ 6 ] ; // 三角ポリゴン法線情報配列
private int [] trColor = new int [ 2 ] ; // 三角ポリゴン色情報配列
private int [] trTexCoord = new int [ 1 ] ; // 三角ポリゴンテクスチャ位置情報配列
/* 三角ポリゴン */
triangles = Graphics3D.PRIMITVE_TRIANGLES |
Graphics3D.PDATA_NORMAL_PER_FACE |
Graphics3D.PDATA_COLOR_PER_FACE | Graphics3D.PATTR_LIGHTING;
/* 頂点情報 */
/* 1つめ */
trVertex [ 0 ] = 0;
trVertex [ 1 ] = 256;
trVertex [ 2 ] = 0;
trVertex [ 3 ] = -128;
trVertex [ 4 ] = 0;
trVertex [ 5 ] = 0;
trVertex [ 6 ] = 128;
trVertex [ 7 ] = 0;
trVertex [ 8 ] = 0;
/* 2つめ */
trVertex [ 9 ] = 0;
trVertex [ 10 ] = -256;
trVertex [ 11 ] = 0;
trVertex [ 12 ] = -128;
trVertex [ 13 ] = 0;
trVertex [ 14 ] = 0;
trVertex [ 15 ] = 128;
trVertex [ 16 ] = 0;
trVertex [ 17 ] = 0;
/* 法線情報 */
/* 1つめ */
trNormal [ 0 ] = 0;
trNormal [ 1 ] = 0;
trNormal [ 2 ] = 4096;
/* 2つめ */
trNormal [ 3 ] = 0;
trNormal [ 4 ] = 0;
trNormal [ 5 ] = 4096;
/* 色情報 */
/* 1つめ */
trColor [ 0 ] = ( ( 255 << 16 ) | ( 0 << 8 ) | ( 0 ) );
/* 2つめ */
trColor [ 1 ] = ( ( 0 << 16 ) | ( 255 << 8 ) | ( 0 ) );
/* テクスチャ位置情報
* ここでは null と同義
*/
trTexCoord [ 0 ] = 0;
描画登録のため Graphics クラスへの登録を行い、描画します。
trans.multiply( xTrans, yTrans );
trans.multiply( vTrans, trans );
/* 座標変換関係設定 */
layout.setAffineTrans( trans );
/* レンダリング */
g3d.renderPrimitives( null, 0, 0, layout, effect,
他のプリミティブも同様に設定します。
ライン
private int lines; // ライン情報
private int [] lnVertex = new int [ 6 ] ; // ライン頂点配列
private int [] lnNormal = new int [ 1 ] ; // ライン法線情報配列
private int [] lnColor = new int [ 1 ] ; // ライン色情報配列
private int [] lnTexCoord = new int [ 1 ] ; // ラインテクスチャ位置情報配列
/* ライン */
lines = Graphics3D.PRIMITVE_LINES |
Graphics3D.PATTR_LIGHTING;
lnVertex [ 0 ] = 428;
lnVertex [ 1 ] = 256;
lnVertex [ 2 ] = 0;
lnVertex [ 3 ] = 428;
lnVertex [ 4 ] = -256;
lnVertex [ 5 ] = 0;
/* 法線情報
* ここでは null と同義
*/
lnNormal [ 0 ] = 0;
/* 色情報 */
lnColor [ 0 ] = ( ( 255 << 16 ) | ( 0 << 8 ) | ( 0 ) );
/* テクスチャ位置情報
* ここでは null と同義
*/
lnTexCoord [ 0 ] = 0;
g3d.renderPrimitives( null, 0, 0, layout, effect,
ポイントスプライト
/* ポイントスプライト */
private int pointSprites; // ポイントスプライト用情報
private int [] psVertex = new int [ 3 ]; // ポイントスプライト頂点配列
private int [] psNormal = new int [ 1 ]; // ポイントスプライト法線情報配列
private int [] psColor = new int [ 1 ]; // ポイントスプライト色情報配列
private int [] psTexCoord = new int [ 8 ]; // ポイントスプライトテクスチャ位置情報配列
try{
/* ポイントスプライト */
pointSprites = Graphics3D.PRIMITVE_POINT_SPRITES |
Graphics3D.PDATA_POINT_SPRITE_PARAMS_PER_FACE |
Graphics3D.PDATA_TEXURE_COORD | Graphics3D.PATTR_LIGHTING;
/* 頂点情報 */
psVertex [ 0 ] = -428;
psVertex [ 1 ] = 128;
psVertex [ 2 ] = 0;
/* 法線情報
* ここでは null と同義
*/
psNormal [ 0 ] = 0;
/* 色情報
* ここでは null と同義
*/
psColor [ 0 ] = 0;
/* テクスチャ位置情報 */
psTexCoord [ 0 ] = 256;
psTexCoord [ 1 ] = 256;
psTexCoord [ 2 ] = 0;
psTexCoord [ 3 ] = 0;
psTexCoord [ 4 ] = 0;
psTexCoord [ 5 ] = 255;
psTexCoord [ 6 ] = 255;
psTexCoord [ 7 ] = Graphics3D.POINT_SPRITE_LOCAL_SIZE | Graphics3D.POINT_SPRITE_PERSPECTIVE;
g3d.renderPrimitives( texture, 0, 0, layout, effect,
g3d.flush();
四角ポリゴン (*テクスチャデータはポイントスプライトと共有しています。)
private int quads; // 四角ポリゴン用情報
private int [] qdVertex = new int [ 12 ]; // 四角ポリゴン頂点配列
private int [] qdNormal = new int [ 3 ]; // 四角ポリゴン法線情報配列
private int [] qdColor = new int [ 1 ]; // 四角ポリゴン色情報配列
private int [] qdTexCoord = new int [ 8 ]; // 四角ポリゴンテクスチャ位置情報配列
/* 四角ポリゴン */
quads = Graphics3D.PRIMITVE_QUADS |
Graphics3D.PDATA_COLOR_NONE | Graphics3D.PDATA_NORMAL_PER_FACE |
Graphics3D.PDATA_TEXURE_COORD | Graphics3D.PATTR_LIGHTING;
/* 頂点情報 */
qdVertex [ 0 ] = -300;
qdVertex [ 1 ] = 0;
qdVertex [ 2 ] = 0;
qdVertex [ 3 ] = -556;
qdVertex [ 4 ] = 0;
qdVertex [ 5 ] = 0;
qdVertex [ 6 ] = -556;
qdVertex [ 7 ] = -256;
qdVertex [ 8 ] = 0;
qdVertex [ 9 ] = -300;
qdVertex [ 10 ] = -256;
qdVertex [ 11 ] = 0;
/* 法線情報 */
qdNormal [ 0 ] = 0;
qdNormal [ 1 ] = 0;
qdNormal [ 2 ] = 4096;
/* 色情報配列
* ここでは null と同義
*/
qdColor [ 0 ] = 0;
/* テクスチャ位置情報 */
qdTexCoord [ 0 ] = 255;
qdTexCoord [ 1 ] = 255;
qdTexCoord [ 2 ] = 0;
qdTexCoord [ 3 ] = 255;
qdTexCoord [ 4 ] = 0;
qdTexCoord [ 5 ] = 0;
qdTexCoord [ 6 ] = 255;
qdTexCoord [ 7 ] = 0;
g3d.renderPrimitives( texture, 0, 0, layout, effect,
g3d.flush();
![]() 法線有効時の表面(左)と 裏面(右) |
![]() 法線無効時の表面(左)と 裏面(右) |



