API固有のレンダリングの違いについて
Lumino は様々なレンダリングAPI間の違いをカバーし、GPUへの統一されたインターフェースを提供するように実装されています。 しかし場合によっては API 間の根本的な違いにより、簡単または効率的に調整することができないケースがあります。
このページでは、特にクロスプラットフォームなアプリケーションを作成するために必要な、プラットフォーム固有の作業手順や留意事項について説明します。
OpenGLフレームバッファテクスチャ座標
Lumino のハイレベルコンポーネントはテクスチャ座標の原点がテクスチャの左上隅であることを前提として実装されています。
OpenGL では、テクスチャ座標の原点はテクスチャの左下隅となっています。 通常のテクスチャをサンプリングする場合、GPU へ転送するテクスチャデータを上下反転することで、描画結果の違いを打ち消すことができます。 一方フレームバッファをサンプリングすると、左上隅を原点とした実装と競合し、上下反転した描画結果となってしまいます。
Lumino は以下の2つの方法でこの差を調整します。
- 通常テクスチャについては、GPU へ転送するテクスチャデータを上下反転することで、最終的な描画結果に差が出ないようにします。
- レンダーターゲットテクスチャについては、シェーダコンパイラがテクスチャサンプリング時にテクスチャ座標の Y値 を反転するコードを挿入します。
シェーダコードにおける行列の演算方法
Bad:
pos = proj * view * model * float4(inPosition, 1.0);
Good:
pos = mul(float4(inPosition, 1.0), model);
pos = mul(pos, view);
pos = mul(pos, proj);