Graphics 概要

Sce.PlayStation.Core.Graphics はグラフィクス描画のための機能を提供します。機能モデルとしてOpenGL ES 2.0をベースとしています。

グラフィクスコンテキスト

GraphicsContextはグラフィクス描画全体を制御するクラスであり、OpenGLにおけるグラフィクスコンテキストを表します。このクラスのコンストラクタでグラフィクスデバイスとスクリーンの初期化をおこない、このクラスのメンバー関数でグラフィクス描画をおこないます。

GraphicsContextはグラフィクスデバイスとスクリーンをシステムの標準的な設定で初期化します。必要ならば引数でスクリーンサイズとピクセル形式を指定することができます。グラフィクスデバイスの能力や実際のスクリーンサイズとピクセル形式は初期化後に取得することができます。

グラフィクス描画をおこなうには、以下で説明するグラフィクスオブジェクトをあらかじめ作成しておき、GraphicsContextのメンバー関数を使用して、グラフィクスオブジェクトやレンダーステートを設定してプリミティブを描画します。

シェーダープログラム

ShaderProgramはシェーダー機能を制御するクラスであり、OpenGLにおけるプログラムオブジェクトを表します。頂点シェーダーとフラグメントシェーダーの組み合わせによって構成され、それらのシェーダープログラムが格納されたファイルから作成します。

ShaderProgramは複数のユニフォーム変数と複数のアトリビュート変数を保持します。ユニフォーム変数には値を設定することができ、アトリビュート変数には頂点データを連続的に転送することができます。これらの変数は番号によってアクセスされます。必要ならばアプリケーションに便利なように、これらの変数を特定の番号にバインドすることもできます。

シェーダーファイルの拡張子は.cgxで、Cg言語で記述されたソースコードから変換されたバイナリです。ソースコードの拡張子は.vcg .fcgまたは.vp.cg .fp.cgとしてください。ソースコードの拡張子が.vcg .fcgならば同じ名前の頂点シェーダーとフラグメントシェーダーが1つのファイルに格納されます。

頂点バッファ

VertexBufferは頂点データを格納するクラスであり、OpenGLにおける頂点バッファオブジェクトを表します。必要に応じて複数の頂点配列、一つのインデックス配列を格納することができ、サイズと形式を指定して作成します。

VertexBufferはGraphicsContextに複数設定することができます。頂点配列はそれぞれ順番にShaderProgramのアトリビュート変数に関連づけられます。

複数のインデックス配列が有効な場合は、最後のものが使用されます。

テクスチャ

Textureはピクセルデータを格納するクラスであり、OpenGLにおけるテクスチャオブジェクトを表します。Texture2D、TextureCubeなどの派生クラスがあり、画像ファイルから作成するかサイズと形式を指定して作成します。

TextureはGraphicsContextに複数設定することができます。テクスチャはそれぞれ順番にShaderProgramのサンプラーに関連づけられます。

利用可能な画像フォーマットはDDS, PNG, JPG, BMP, GIF(ただしアニメーションGIFは非対応)です。

フレームバッファ

FrameBufferはレンダリング結果の格納先を制御するクラスであり、OpenGLにおけるフレームバッファオブジェクトを表します。レンダリング結果の格納先をスクリーン以外の別のバッファに変更することでオフスクリーンレンダリングをおこなうことができます。

FrameBufferにはカラーの格納先とデプスの格納先を設定することができます。ColorBufferはカラーの格納先に、DepthBufferはデプスの格納先に設定することができます。Textureは生成時にRenderableオプションが指定されていれば、カラーの格納先に設定することができます。

カラーの格納先とデプスの格納先の組み合わせによってはレンダリングできない場合があります。現在の組み合わせがレンダリング可能かどうかはFrameBuffer.Statusプロパティで確認することができます。

カラーバッファとデプスバッファ

ColorBuffer、DepthBufferはレンダリング結果を格納するクラスであり、OpenGLにおけるレンダバッファオブジェクトを表します。ColorBufferにはカラー値を、DepthBufferにはデプス値とステンシル値を格納することができ、サイズと形式を指定して作成します。

ColorBuffer、DepthBufferはGraphicsContextに設定することはできません。これらはFrameBufferに設定して使用します。

機能制限について

現在のバージョンでは、以下の機能は使用できません。

  • 2のべき乗でないテクスチャのリピートモード
  • 2のべき乗でない圧縮テクスチャ
  • 深度テクスチャ
  • 3Dテクスチャ
  • half floatテクスチャへのレンダリング
  • luminance alphaテクスチャへのレンダリング

またデバイス性能は、以下の値に制限されます。

  • MaxTextureSize 2048
  • MaxCubeMapTextureSize 2048
  • MaxRenderbufferSize 2048
  • MaxVertexUniformVectors 128
  • MaxFragmentUniformVectors 64
  • MaxVertexAttribs 8
  • MaxVaryingVectors 8
  • MaxTextureImageUnits 8
  • MaxAliasedLineWidth 8
  • MaxAliasedPointSize 128

シェーダー記述について

シェーダー記述には、通常の Cg 言語に比べて以下のような制限があります。

  • GLSL や Cg の予約語と、同じ名前の変数や関数は使用できません。
  • 一部の予約語は case-insensitive であり注意が必要です (Texture, Matrix, Vector など)。
  • vertex shader の出力と fragment shader の入力には、セマンティクスの指定が必要です。
  • vertex shader の出力と fragment shader の入力は、名前とセマンティクスの両方が一致する必要があります。
  • fragment shader の出力には、COLOR セマンティクスの指定が必要です。
  • 一つのシェーダー内で、重複する TEXUNIT セマンティクスは使用できません。
  • 一部のセマンティクスでは、変数の型が制限されます (NORMAL, PSIZE, FOG など)
  • ループの反復回数の最大値は、定数である必要があります。
  • ループの反復回数を制御する場合は、break 文でループを中断してください。
  • attribute, varying, sampler 変数の配列は使用できません。
  • uniform float2/3/4 の xyzw への、uniform int による配列アクセスは使用できません。
  • uniform float4x4 の columns への、uniform int による配列アクセスは使用できません。
  • スカラー変数に対する swizzle は使用できません (f.xxxx など)。
  • PSIZE がない場合、varying 変数は 8 packed vectors まで使用可能です (POSITION を除く)。
  • PSIZE がある場合、varying 変数は 8 vectors まで使用可能です (POSITION, PSIZE を除く)。

vertex shader の入力に指定可能なセマンティクスは以下のとおりです

  • POSITION
  • NORMAL
  • TEXCOORD0-7
  • COLOR0-1
  • DIFFUSE
  • SPECULAR
  • TANGENT
  • BINORMAL
  • BLENDWEIGHT
  • BLENDINDICES
  • FOGCOORD
  • POINTSIZE

vertex shader の出力に指定可能なセマンティクスは以下のとおりです

  • POSITION ( HPOS )
  • TEXCOORD0-7 ( TEX0-7 )
  • COLOR0-1 ( COL0-1 )
  • FOGC ( FOG )
  • PSIZE ( PSIZ )

fragment shader の入力に指定可能なセマンティクスは以下のとおりです

  • TEXCOORD0-7 ( TEX0-7 )
  • COLOR0-1 ( COL0-1 )
  • FOGC ( FOG )
  • POINTCOORD
  • WPOS
  • FACE

fragment shader の出力に指定可能なセマンティクスは以下のとおりです

  • COLOR

リソースヒープとグラフィクスメモリ

グラフィクスオブジェクトは、アプリケーションが管理するリソースヒープに加えて、デバイスドライバが管理するグラフィクスメモリを消費します。VertexBuffer, ShaderProgram などのオブジェクトは、リソースヒープとグラフィクスメモリを必要とします。

一方 Texture2D, TextureCube, ColorBuffer, DepthBuffer などの PixelBuffer オブジェクトは、SDK 1.20 まではリソースヒープを必要としていましたが、SDK 2.00 からは不要となりました。現在のバージョンではグラフィクスメモリだけを必要とします。

グラフィクスメモリの容量はおよそ 96 MiB です。このサイズを変更することはできません。

./image/graphics_memory.png

図1 リソースヒープとグラフィクスメモリ