Japanese | English | Korean

Support

エンジンについて

MacotCapsuleエンジンの仕様やプログラミングなどの技術的な問題に関するFAQです。

Q: オブジェクトの一部が欠けて表示されます。
MascotCapsule : V3 / V4(V3互換) / V4
Platform : ALL
A: 

クリッピング面の設定が不適切な場合、モデルがクリッピングされてしまうことによって想定していた描画と異なる結果になることがあります。
ニアクリッピング面より視点に近い位置のモデルはクリッピングされてしまい、描画されません。また、ファークリッピング面より遠い位置のモデルも描画されません。つまり、モデルを描画するためにはそのモデルがニアクリッピング面とファークリッピング面の間にあることが必要になります。

[ニアクリッピングでオブジェクトが消える例]


上の例ではオブジェクトのひとつが完全に消えていますが、ニアクリッピング面とオブジェクトの位置関係によっては、オブジェクトの一部が表示されることもあります。しかし、その場合でも通常見えるべき面の多くがクリップされてしまうため、想定とは大きく異なってしまいます。

[中途半端にクリップされた例]


このような場合はニアクリッピング面を視点に近づけることでクリップされることを回避できます。

[ファークリッピングでオブジェクトが消える例]


それではニアクリッピング面を視点にきわめて近い位置に、ファークリッピング面を視点からきわめて遠い位置に設定すればよいかというと、今度は両クリッピング面間の奥行き方向の精度が問題になってくることがあります。

Q: 設定したライトが適用されません
MascotCapsule : V3 / V4(V3互換) / V4
Platform : ALL
A: 

ライトの設定が適切でない場合、想定していた描画と異なる結果になることがあります。
点光源やスポットライトは光源からの距離で明るさが変わるため、モデルが光源から離れているため暗くなってしまう、などの現象が起こります。また、光源が視点からみてモデルの向こう側にあると、かげになって暗い部分がこちら側になるので暗くなってしまいます。

[光源の位置関係でオブジェクトが暗くなる例]


上の例は光源がオブジェクトの向こう側にあったり、遠くにあってオブジェクトに届く光の強度が弱かったりする例です。この例では背景を白くしているためはっきりわかりますが、暗い背景だと表示されているかどうかがわからない場合もあります。

さらにスポットライトでは距離だけでなく方向や照射する角度も問題になってくるため、注意が必要です。
いくら距離が近くてもライトがオブジェクトの方向を向いていなかったり、照射角を狭く設定したためにオブジェクトが光の当たる範囲の外にあったりすると暗くなってしまいます。

[スポットライトの方向や照射角でオブジェクトが暗くなる例]


この他に表示されないという現象とは少し違いますが、環境光の設定も問題になることがあります。たとえば環境光が強すぎると立体的にみえるシェーディングがうまくいかないことがあります。

[環境光の設定でシェーディングがうまくいかない例]

Q: テクスチャがきちんとマッピングされません。なぜでしょう?
MascotCapsule : V4
Platform : DoJa4.0
A: 

テクスチャをマッピングしたオブジェクトが想定していたように表示されていない場合、まず考えられることはマップデータが違っている、あるいはテクスチャ座標が間違っているといった単純なミスです。しかし、いずれも正しいのにやはり表示がおかしいときには以下の項目を参照してください。

DoJa4.0ではテクスチャに縦横のサイズが違う画像も使用可能ですが、特定の条件でテクスチャが正しくマッピングされないことがあります。問題が起こるのは、以下の条件をすべて満たした場合で、ひとつでも該当しない条件のある場合には問題ありません。

・ MBAC形式のモデルデータへのマッピング
・ 縦横のサイズがともに2のべき乗
・ 縦と横のサイズが違う

たとえば、128x256や64x32といったサイズのテクスチャでは問題が起こる可能性があります。129x256といった2のべき乗でないサイズのテクスチャや、128x128 のように縦横のサイズがおなじテクスチャでは、この問題は起こりません。

[テクスチャサイズの制限で正しくマッピングされなかった例]

Q: 端末エミュレータと実機で表示が違っていますが、よいのでしょうか
MascotCapsule : V4
Platform : ALL
A: 

ほとんどの端末エミュレータでの描画はMascotCapsuleエンジンのソフトウェアレンダラを使用しています。これに対し実機の場合、ハードウェアによる3D描画アクセラレーション機能をもつ端末ではその端末のOpenGL|ESドライバを呼び出し、レンダリングをおこなっています。(アクセラレーション機能をもたない端末では端末エミュレータ同様ソフトウェアレンダラを使用しています。)

ソフトウェアレンダラでの描画はハードウェアによるものと比べると速度的にかなり遅くなるため、精度を若干犠牲にして高速化するアルゴリズムを採用しています。そのため、端末エミュレータでの表示画像が実機でのものと異なることがあります。

Q: テクスチャのマッピング表示が端末やエミュレータによって違う
MascotCapsule : V4
Platform : ALL
A: 

ソフトウェアレンダラの描画高速化手法で違いが顕著に出るのはテクスチャをマッピングしたポリゴンの描画で、テクスチャ座標の補間計算やパースペクティブコレクション計算の精度が大きく関係してきます。

[レンダラの違いによるテクスチャ描画の差異の例]

Q: テクスチャの色が端末やエミュレータによって違う
MascotCapsule : ALL
Platform : ALL
A: 

環境によってピクセル深度の違いやライティング計算の違いなどがあります。
極端な例をあげると、昔のパソコンのようにRGBそれぞれ1bitづつの深度しかない場合、 (白や黒を含めた)8色しか表現できません。多階調を表現できる端末とはあきらかに表示が異なることになります。また、ピクセル深度がおなじ場合でも、ライティング計算のアルゴリズムや計算精度の違いで結果が違っていれば、多少違った色になることもあります。

Q: オブジェクトの表示される位置や前後関係が端末やエミュレータによって違う
MascotCapsule : V4
Platform : ALL
A: 

複数のオブジェクトがあってオブジェクト間の位置がきわめて近い場合や、ひとつのオブジェクトでも複数のポリゴンの頂点位置が近い場合に、精度の関係で奥行き方向(Z)の座標値がおなじ値になってしまい、正しい前後関係で表示されないことがあります。
端末エミュレータと実機とのZ深度の違いなどにより、両方でおなじように表示されるとは限らず、片方の前後関係が違ってくることもあります。

端末エミュレータと実機、あるいは実機の種類によっては3D描画のためのレンダラが違うことがあります。端末エミュレータで使用しているソフトウェアレンダラと実機のOpenGL|ESレンダラでは基本的な3Dの計算・描画の流れはおなじですが細かい部分でのアルゴリズムや計算の順序などが違い、それにともなって計算精度にも違いが出てきます。 (OpenGL|ESレンダラ同士でも、実装が違っていればおなじように違いが出てくる可能性があります)

このため、端末エミュレータと実機でおなじオブジェクトをおなじ位置に描画しても、実際に表示される位置が違ってくることがあります。多くの場合、計算上は1ピクセル以下の違いでしかなく、表示位置が違うこともありません。しかし、わずかな違いであっても四捨五入や切捨てなどの丸め処理で位置が違ってくるケースがありえます。
ですから3D描画において、端末に依存しないで表示位置をピクセル単位で決定することは難しく、アプリケーションの作成時にも、1ピクセル程度の位置の違いはあるものと考えておくほうがよいでしょう。
逆に表示位置が数ピクセル以上も違ってくることがあれば、(ハードウェア・ドライバをふくめ)一連の 3D計算の中でどこかに問題が発生している可能性があります。

Q: ポリゴンの色が端末やエミュレータによって違う
MascotCapsule : V4
Platform : DoJa4.0
A: 

DoJa4.0で半透明ポリゴンを含むMBAC形式のモデルを描画した場合、描画されたポリゴンの色が4.0以前のバージョンと異なることがあります。

MBAC形式データでは半透明のブレンド時に減算の指定が可能ですが、DoJa4.0に使用されているMascotCapsule V4エンジンが下位APIにOpenGL|ESを使用することができるようになったため、OpenGL|ESのブレンド演算の仕様にあわせるかたちで描画処理を変更しています。

その結果、減算ブレンドを指定したポリゴンを含むモデルの色が4.0以前のバージョンと異なることがあります。

[減算ブレンドを指定したポリゴンを含むモデルの描画の例]


上の画像を見比べてみると、左下の部分の色が違っています。左側のV3エンジンでの描画では減算ブレンドが有効なため、背景の白から赤の成分が減算され、水色になっています。これに対し、右側のV4エンジンの描画では減算処理がおこなわれず、赤い色がそのまま描画されています。

Q: 一部のポリゴンにずれが発生してしまいます
MascotCapsule : V4
Platform : ALL
A: 

実行する環境の精度の問題でポリゴンがずれて見える場合があります。
この現象はつねにオブジェクト全体で起こるわけではなく、オブジェクトの一部にのみ発生することがあります。というよりも、ポリゴン単位で3D計算をしているので個々のポリゴンごとに発生するかどうかが決まる、と言ったほうがよいでしょう。

そのため、オブジェクト全体としては位置はずれていないものの、一部のポリゴンのみがずれるということがあります。このずれるポリゴンがオブジェクト全体からみて小さなものだったりすると、表示上はポリゴンというよりいくつかのピクセルの集まりにしか見えないため、オブジェクトの一部でピクセルがずれているという感じに見えることもあります。

Q: 意図しないオブジェクトが手前に表示されます。なぜでしょう?
MascotCapsule : V3 / V4(V3互換) / V4
Platform : ALL
A: 

MascotCapsule V4ではフレームバッファへの描画にZバッファ法を採用しています。これに対しMascotCapsule V4以前のバージョンではZソート法を採用していました。
Zバッファ法では1ピクセルごとに奥行き判定をおこない、もっとも視点に近いオブジェクトが表示されます。しかしZソート法ではポリゴン単位でZの値でソートして描画するため、ピクセル単位でみると必ずしも視点に一番近いオブジェクトが表示されるとは限りません。
このため、MascotCapsule V4で描画した画像とMascotCapsule V4以前のバージョンで描画した画像とが違っていることがあります。とくにポリゴン同士が交差しているような場合、Zソート法では正しく描画することができませんが、Zバッファ法ではピクセル単位で奥行き判定をおこなうため正しい描画が可能になります。

[ポリゴンが交差しているモデルをレンダリングした場合の差異の例]

Q: ニアクリップとファークリップはどう設定すべきですか?
MascotCapsule : V4
Platform : ALL
A: 

複数のオブジェクトがあってオブジェクト間の位置がきわめて近い場合や、ひとつのオブジェクトでも複数のポリゴンの頂点位置が近い場合に、精度の関係で奥行き方向(Z)の座標値がおなじ値になってしまい、正しい前後関係で表示されないことがあります。

この現象はデプスバッファ上でのZ値の特性から、視点から遠い位置で起こりやすくなります。これは、透視投影で視点に近い位置の物体は大きく表示され、視点から遠い位置の物体は小さく表示されることと関係しています。視点から遠く離れた物体は、X,Y方向だけでなく、Z方向にも縮小されて描画されるわけです。
さらに、この問題はニアクリッピング面とファークリッピング面の設定とも関係しています。デプスバッファに書き込まれるZ値はニアクリッピング面とファークリッピング面の奥行きがそれぞれZ値の最大・最小になる(両クリッピング面の間の空間がデプスバッファの取りうる値の全域になる)ように調整されるためです。

つまり、ふたつのオブジェクトが位置を変えないとしても、ニアクリッピング面とファークリッピング面の間隔が広くなればなるほどデプスバッファ上でのZ値は近づくことになり、デプスバッファの精度を越えて近づけばZ値がおなじ値になってしまい、どちらのオブジェクトが手前にあるのかを判断することができなくなってしまいます。
また、視点からニアクリッピング面までの距離とファークリッピング面までの距離の比が大きくなると、(さきほどのZ方向にも縮小されて描画されることによって)視点から遠いファークリッピング面付近でのZ値の精度が著しく悪くなるため、より問題が起こりやすくなります。

この問題を避けるため、ニアクリッピング面とファークリッピング面の両面はできるだけ近づけて設定することが望ましいとされています。ただ、むやみに近づけてもオブジェクトがクリップされてしまうことになりますので、注意が必要です。
一般的には、ニアクリッピング面は一番手前のオブジェクトよりわずかに視点寄りの位置に、ファークリッピング面は一番遠いオブジェクトよりわずかに視点から遠い位置に設定するのがよいでしょう。

Q: 半透明ポリゴンにZ値が適用されません
MascotCapsule : V4
Platform : ALL
A: 

描画するオブジェクトのなかに半透明なポリゴンが含まれているものがある場合、オブジェクトが正しい前後関係で描画されないことがあります。なぜなら、半透明なポリゴンにはZバッファ法の奥行き判定が適用されず、デプスバッファにもZ値を書き込まない仕様だからです。
そのため半透明ポリゴンを含むオブジェクトを描画するときは、描画順によっては正しくない描画結果になることがありますので注意が必要です。