コマンドキャッシュとは、3D グラフィックスの描画で呼び出した関数がコマンドリストに蓄積した 3D コマンドをそのまま再使用する機能です。3D コマンドそのものを再利用しますので、本来ならば 3D コマンドを生成するために必要な関数呼び出しで発生するコストを削減し、CPU 処理の軽減を期待することができます。
コマンドキャッシュを利用してできることには以下のものがあります。
- コマンドリストの保存
- コマンドリストの再使用
- コマンドリストのコピー
- コマンドリストのエクスポート、インポート
- 3D コマンドの追加
- 3D コマンドの編集
この章では、コマンドキャッシュの利用方法を紹介し、3D コマンドの編集に必要な情報を提供します。
8.1. コマンドリストの保存
コマンドキャッシュは、コマンドリストに格納されている 3D コマンドバッファの内容と、キューイングされているコマンドリクエストを対象とする機能です。しかし、コマンドキャッシュは保存の開始と終了の宣言によって、コマンドリストを再使用するための情報を取得するだけですので、コマンドキャッシュとしてのオブジェクトは存在しません。保存の対象となったコマンドリストに蓄積された情報をそのまま利用するため、アプリケーションでコピーを作成していない限り、対象のコマンドリストをクリアしたり破棄したりするとコマンドキャッシュは機能しなくなります。
コマンドリストの保存を開始するには、nngxStartCmdlistSave()
を呼び出します。
void nngxStartCmdlistSave(void);
この関数で保存を開始したあと、終了させていない状態で再度呼び出した場合は GL_ERROR_8034_DMP
のエラーを、オブジェクト名が 0 のコマンドリストをバインドしているときに呼び出した場合は GL_ERROR_8035_DMP
のエラーを生成します。
コマンドリストの保存を終了し、コマンドキャッシュの情報を取得するには nngxStopCmdlistSave()
を呼び出します。
void nngxStopCmdlistSave(GLuint* bufferoffset, GLsizei* buffersize, GLuint* requestid, GLsizei* requestsize);
コマンドキャッシュの情報として、bufferoffset
には 3D コマンドバッファの保存開始オフセットが、buffersize
には 3D コマンドバッファの保存バイトサイズが、requestid
にはコマンドリクエストの保存開始 ID が、requestsize
にはコマンドリクエストの保存数がそれぞれ返されます。コマンドリストの保存が開始されていない状態で呼び出した場合は GL_ERROR_8036_DMP
のエラーを生成します。
コマンドリストの保存の開始と終了により、コマンドリストの 3D コマンドバッファに、パディング用のダミーコマンドが生成される場合があります。
8.1.1. ステート
ステートとは、3D グラフィックスを機能ごとにまとめた設定のことです。gl 関数などが呼び出されると対応するステートが更新され、更新されたステートに関連して生成された 3D コマンドが 3D コマンドバッファに蓄積されます。そのため、ステートが更新されたかどうかは、描画に必要な 3D コマンドが保存され、コマンドキャッシュが正しく機能するかどうかに関係しています。
1 つのステートは 1 つ以上の gl 関数またはユニフォーム設定に対応しています。また、1 つの gl 関数が複数のステートを更新する可能性もあります。必要とする 3D コマンドが確実に保存されるようにするなど、アプリケーションでステートを指定するときは、ステートフラグの論理和で指定する必要があります。
ステートフラグ | 説明 |
---|---|
NN_GX_STATE_SHADERBINARY
|
シェーダバイナリのステートです。
更新された場合、シェーダアセンブラコードをロードするための 3D コマンドを生成します。 |
NN_GX_STATE_SHADERPROGRAM
|
シェーダプログラムのステートです。
更新された場合、頂点属性の構成の設定などに関する 3D コマンドを生成します。前回のバリデーション時と比較して異なる設定のレジスタに関してのみ 3D コマンドが生成されます。 |
NN_GX_STATE_SHADERMODE
|
シェーダモードのステートです。
更新された場合、ジオメトリシェーダの使用・不使用を切り替える 3D コマンドを生成します。 |
NN_GX_STATE_SHADERFLOAT
|
シェーダの浮動小数点数定義のステートです。
更新された場合、シェーダアセンブラで |
NN_GX_STATE_VSUNIFORM
|
頂点シェーダのユニフォーム設定のステートです。
更新された場合、シェーダアセンブラでユニフォームとして定義された浮動小数点数レジスタ、ブールレジスタ、整数レジスタに値を設定する 3D コマンドを生成します。 |
NN_GX_STATE_FSUNIFORM
|
予約フラグメントシェーダのユニフォーム設定のステートです。
更新された場合、予約フラグメントシェーダに関するレジスタに値を設定する 3D コマンドを生成します。 |
NN_GX_STATE_LUT
|
参照テーブルのステートです。
更新された場合、参照テーブルを設定する 3D コマンドを生成します。 |
NN_GX_STATE_TEXTURE
|
テクスチャ(プロシージャルテクスチャを除く)のステートです。
更新された場合、テクスチャユニットに関する 3D コマンド(プロシージャルテクスチャを除く)を生成します。 |
NN_GX_STATE_FRAMEBUFFER
|
フレームバッファのバッファ情報のステートです。
更新された場合、フレームバッファのフォーマットやバッファアドレスに関する 3D コマンドを生成します。 |
NN_GX_STATE_VERTEX
|
頂点属性データのステートです。
更新された場合、頂点属性データに関する 3D コマンドを生成します。 |
NN_GX_STATE_TRIOFFSET
|
ポリゴンオフセットのステートです。
更新された場合、ポリゴンオフセットに関する 3D コマンドを生成します。 |
NN_GX_STATE_FBACCESS
|
フレームバッファのアクセス方法のステートです。
更新された場合、フレームバッファの読み書きなどのアクセス方法に関する 3D コマンドを生成します。 |
NN_GX_STATE_SCISSOR
|
シザーテストのステートです。
更新された場合、シザーテストに関する 3D コマンドを生成します。 |
NN_GX_STATE_OTHERS
|
更新された場合に生成される 3D コマンドについては、表 8-3 を参照してください。 |
NN_GX_STATE_ALL
|
上記すべてを指定するためのフラグです。 |
8.1.2. コマンド生成
3D コマンドバッファに蓄積される 3D コマンドのほとんどは glDrawElements()
、glDrawArrays()
で生成されます。これらの関数は内部でステートをチェックし、更新されたステートに関する 3D コマンドを生成します。これをバリデートと呼びます。
nngxValidateState()
は、バリデートを任意のタイミングで行うことができます。また、nngxUpdateState()
で、指定したステートフラグのステートを更新状態にし、次のタイミングで指定したステートの 3D コマンドをすべて生成させることができます。
void nngxValidateState(GLbitfield statemask, GLboolean drawelements); void nngxUpdateState(GLbitfield statemask);
nngxValidateState()
が呼び出されると、更新状態になっているステートのうちの statemask
で指定されたものだけがバリデートされ、更新状態が解除されます。この関数では描画が行われませんので、実際に描画するときに glDrawElements()
を呼び出すのか、glDrawArrays()
を呼び出すのかを drawelements
で指定します。GL_TRUE
を渡した場合は glDrawElements()
、GL_FALSE
を渡した場合は glDrawArrays()
に対応した 3D コマンドを生成します。つまり、nngxUpdateState()
と nngxValidateState()
を組み合わせることで、任意のステートに関する 3D コマンドをすべて生成させることができます。
一方、glDrawElements()
などでは更新されているすべてのステートがバリデートされ、更新状態が解除されます。
ほかの関数と異なり、任意のタイミングで 3D コマンドを生成することのできる nngxValidateState()
は、ステート間で 3D コマンドの設定順の依存関係があることに注意しなければなりません。以下の条件に抵触する順番で生成された 3D コマンドが実行された場合の動作は不定となっています。
-
NN_GX_STATE_FBACCESS
およびNN_GX_STATE_TRIOFFSET
は、NN_GX_STATE_FSUNIFORM
より先、または同時に指定して呼び出さなければなりません。 -
NN_GX_STATE_SHADERMODE
は、NN_GX_STATE_SHADERBINARY
、NN_GX_STATE_SHADERPROGRAM
、NN_GX_STATE_SHADERFLOAT
、およびNN_GX_STATE_VSUNIFORM
より先、または同時に指定して呼び出さなければなりません。 -
NN_GX_STATE_FRAMEBUFFER
、およびNN_GX_STATE_OTHERS
は、NN_GX_STATE_FBACCESS
より先、または同時に指定して呼び出さなければなりません。 -
NN_GX_STATE_FRAMEBUFFER
は、NN_GX_STATE_SCISSOR
より先、または同時に指定して呼び出さなければなりません。
エラー | 原因 |
---|---|
GL_ERROR_8066_DMP
|
呼び出した結果、3D コマンドバッファがオーバーフローした |
GL_ERROR_806C_DMP
|
バリデートにより各種エラーが発生した |
GL_ERROR_80B2_DMP
|
3D コマンドバッファが設定されていない |
GL_ERROR_80B3_DMP
|
有効なプログラムオブジェクトが設定されていない(
|
バリデートによりエラーとなる原因には以下のものがあります。
- 有効になっているテクスチャに対してテクスチャメモリがアロケートされていない。
解決するには、glTexImage2D()
、glCompressedTexImage2D()
、glCopyTexImage2D()
のいずれかを呼び出して、テクスチャメモリをアロケートする必要があります。キューブマップテクスチャは、6 面すべてがアロケートされていなければなりません。 - 不正なフォーマットのテクスチャがバインドされています。
テクスチャユニット 1 または 2 に、GL_SHADOW_DMP
フォーマットのテクスチャをバインドしている、または、キューブマップテクスチャにGL_GAS_DMP
フォーマットのテクスチャをバインドしているなどが考えられます。 - キューブマップテクスチャの各面の設定が異なっています。
キューブマップテクスチャの 6 面は、幅、高さ、フォーマット、ミップマップ段数がすべて同じである必要があります。 - キューブマップテクスチャの 6 面すべてのアドレスの上位 7 ビットが共通の値になっていません。
6 面の各アドレスは上位 7 ビットが同じである必要があります。 - 参照テーブルオブジェクトが正しくバインドされていない、または参照テーブル番号が正しく指定されていません。
フラグメントライティング、プロシージャルテクスチャ、フォグ、ガスの各機能で参照テーブルを使用する設定になっている場合、該当する参照テーブル番号に有効な参照テーブルオブジェクトがバインドされている必要があります。また、参照テーブル番号を指定するユニフォームの設定も正しく行う必要があります。 - 参照テーブルの内部フォーマット値を格納するために必要な領域の確保に失敗しました。
バリデートの途中でエラーとなった場合、各ステートはバリデート済みとして扱われます。エラー後にコマンドを正しく生成するためには、nngxUpdateState()
を呼び出し、再度ステートを更新してください。
基本的に 3D コマンドは glDraw
系の関数で生成されますが、ステートフラグ NN_GX_STATE_FRAMEBUFFER
のステートは glReadPixels()
または glClear()
でも生成されます。そのほかにも、以下の関数を呼び出すことで 3D コマンドが生成されます。
関数 | 生成条件 |
---|---|
glBlendColor()
|
設定値を変更したとき。 |
glBlendEquation()
|
設定値を変更したとき。 |
glBlendEquationSeparate()
|
設定値を変更したとき。 |
glBlendFunc()
|
設定値を変更したとき。 |
glBlendFuncSeparate()
|
設定値を変更したとき。 |
glClearEarlyDepthDMP()
|
設定値を変更したとき。 |
glColorMask()
|
設定値を変更したとき。 |
glCullFace()
|
設定値を変更したとき。 |
glDepthFunc()
|
設定値を変更したとき。 |
glDepthMask()
|
設定値を変更したとき。 |
glDisable()
|
GL_COLOR_LOGIC_OP 、GL_BLEND 、GL_DEPTH_TEST 、GL_EARLY_DEPTH_TEST_DMP 、 GL_STENCIL_TEST 、GL_CULL_FACE の設定値を変更したとき。他の設定値に関しては変更しても生成されません。 |
glEarlyDepthFuncDMP()
|
設定値を変更したとき。 |
glEnable()
|
GL_COLOR_LOGIC_OP 、GL_BLEND 、GL_DEPTH_TEST 、GL_EARLY_DEPTH_TEST_DMP 、 GL_STENCIL_TEST 、GL_CULL_FACE の設定値を変更したとき。他の設定値に関しては変更しても生成されません。 |
glFrontFace()
|
設定値を変更したとき。 |
glLogicOp()
|
設定値を変更したとき。 |
glRenderBlockModeDMP()
|
設定値を変更したとき。 |
glStencilFunc()
|
設定値を変更したとき。 |
glStencilMask()
|
設定値を変更したとき。 |
glStencilOp()
|
設定値を変更したとき。 |
glViewport()
|
必ず生成する。 |
上表の関数のうち、一部機能(GL_COLOR_LOGIC_OP
、GL_BLEND
、GL_DEPTH_TEST
、GL_STENCIL_TEST
、GL_EARLY_DEPTH_TEST_DMP
)に対する glEnable()
と glDisable()
、glDepthFunc()
、glEarlyDepthFuncDMP()
、glColorMask()
、glDepthMask()
、glStencilMask()
は NN_GX_STATE_FBACCESS
のステートを更新するため、コマンドリストを保存する際に NN_GX_STATE_FBACCESS
のバリデートを行う必要があります。
nngxUpdateState()
で NN_GX_STATE_OTHERS
が指定された場合、バリデート時に上表の関数すべてに関する 3D コマンドが生成されるようになります。また、同時に NN_GX_STATE_FBACCESS
も更新状態となります。
8.1.3. 差分コマンドと完全コマンド
gl 関数は複数のステートを更新する可能性があります。通常、呼び出した関数が更新したステートに関する 3D コマンドだけが生成されます。これを差分コマンドと呼びます。一方、呼び出した関数が更新したかどうかに関わらず、関連するすべてのステートに関する 3D コマンドを生成することを完全コマンドと呼びます。ただし、完全コマンドはステートごとに一括してすべての 3D コマンドを生成させるため、3D コマンドの生成が冗長になる場合があります。
nngxSetCommandGenerationMode()
を呼び出すことで、いくつかのステートに対して完全コマンドを生成するように設定することができます。また、nngxUpdateState()
を呼び出すことでも、指定されたステートの完全コマンドを生成するように設定することができます。
void nngxSetCommandGenerationMode(GLenum mode);
mode
に NN_GX_CMDGEN_MODE_CONDITIONAL
を指定した場合は差分コマンドを生成するモードに設定します。デフォルトはこのモードです。NN_GX_CMDGEN_MODE_UNCONDITIONAL
を指定した場合は完全コマンドを生成するモードに設定します。それ以外の値を mode
に指定した場合は GL_ERROR_804D_DMP
のエラーを生成します。現在のモード設定を nngxGetCommandGenerationMode()
で取得することができます。
void nngxGetCommandGenerationMode(GLenum* mode);
mode
に現在のモード設定が返されます。
完全コマンドを生成するモードで影響を受けるステートには以下のものがあります。
- 予約フラグメントシェーダのユニフォームの設定に関するステート
- 頂点シェーダの整数型ユニフォームの設定に関するステート
- 参照テーブルデータの設定に関するステート
- 表 8-3 に記載されている関数に関するステート
更新されたステートの 3D コマンドに加えて、更新されたかどうかに関わらず、上記のステートに関しての完全コマンドが生成されます。ただし、参照テーブルに関連するステートすべてが更新されていても、3D コマンドは有効になっている参照テーブルの分だけが生成されます。参照テーブルが有効となる条件は以下のようになっています。
参照テーブル | 条件 |
---|---|
フラグメントライティングの反射の赤成分(RR) |
dmp_FragmentLighting.enabled に GL_TRUE が設定されている、かつ dmp_LightEnv.config の設定が RR を使用する設定になっている、かつ dmp_LightEnv.lutEnabledRefl に GL_TRUE が設定されている。 |
フラグメントライティングの反射の緑成分(RG) |
dmp_FragmentLighting.enabled に GL_TRUE が設定されている、かつ dmp_LightEnv.config の設定が RG を使用する設定になっている、かつ dmp_LightEnv.lutEnabledRefl に GL_TRUE が設定されている。 |
フラグメントライティングの反射の青成分(RB) |
dmp_FragmentLighting.enabled に GL_TRUE が設定されている、かつ dmp_LightEnv.config の設定が RB を使用する設定になっている、かつ dmp_LightEnv.lutEnabledRefl に GL_TRUE が設定されている。 |
フラグメントライティングのディストリビューションファクタ 0(D0) |
dmp_FragmentLighting.enabled に GL_TRUE が設定されている、かつ dmp_LightEnv.config の設定が D0 を使用する設定になっている、かつ dmp_LightEnv.lutEnabledD0 に GL_TRUE が設定されている。 |
フラグメントライティングのディストリビューションファクタ 1(D1) |
dmp_FragmentLighting.enabled に GL_TRUE が設定されている、かつ dmp_LightEnv.config の設定が D1 を使用する設定になっている、かつ dmp_LightEnv.lutEnabledD1 に GL_TRUE が設定されている。 |
フラグメントライティングのフレネルファクタ(FR) |
dmp_FragmentLighting.enabled に GL_TRUE が設定されている、かつ dmp_LightEnv.config の設定が FR を使用する設定になっている、かつ dmp_LightEnv.fresnelSelector に GL_LIGHT_ENV_NO_FRESNEL_DMP 以外の値が設定されている。 |
フラグメントライティングのスポットライト減衰(SP) |
dmp_FragmentLighting.enabled に GL_TRUE が設定されている、かつ dmp_LightEnv.config の設定が SP を使用する設定になっている、かつ dmp_FragmentLightSource[i].enabled に GL_TRUE が設定されている、かつ dmp_FragmentLightSource[i].spotEnabled に GL_TRUE が設定されている。 |
フラグメントライティングの距離減衰 |
dmp_FragmentLighting.enabled に GL_TRUE が設定されている、かつ dmp_FragmentLightSource[i].enabled に GL_TRUE が設定されている、かつ dmp_FragmentLightSource[i].distanceAttenuationEnabled に GL_TRUE が設定されている。 |
プロシージャルテクスチャのRGB マッピングの F 関数 |
dmp_Texture[3].samplerType に GL_TEXTURE_PROCEDURAL_DMP が設定されている。 |
プロシージャルテクスチャのアルファマッピングの F 関数 |
dmp_Texture[3].samplerType に GL_TEXTURE_PROCEDURAL_DMP が設定されている、かつ dmp_Texture[3].ptAlphaSeparate に GL_TRUE が設定されている。 |
プロシージャルテクスチャのノイズ変調関数 |
dmp_Texture[3].samplerType に GL_TEXTURE_PROCEDURAL_DMP が設定されている、かつ dmp_Texture[3].ptNoiseEnable に GL_TRUE が設定されている。 |
プロシージャルテクスチャのカラー参照テーブル |
dmp_Texture[3].samplerType に GL_TEXTURE_PROCEDURAL_DMP が設定されている。 |
フォグのフォグ係数 |
dmp_Fog.mode に GL_FALSE 以外の値が設定されている。 |
ガスのシェーディング参照テーブル |
dmp_Fog.mode に GL_GAS_DMP が設定されている。 |
8.1.4. コマンドキャッシュの制限事項および注意事項
コマンドキャッシュを使用する場合、以下の制限事項および注意事項があります。
- フラグメントライティングが有効(予約ユニフォーム
dmp_FragmentLighting.enabled
がGL_TRUE
)、かつ全光源が無効(予約ユニフォームdmp_FragmentLightSource[i].enabled
がすべてGL_FALSE
)の場合、nngxValidateState()
で予約フラグメントシェーダユニフォームのステートフラグ(NN_GX_STATE_FSUNIFORM
)を指定してバリデートしても、その後で描画関数を呼び出したときに再度ライティングに関連する 3D コマンドが生成されます。 - 予約ユニフォーム
dmp_Gas.accMax
に関連する 3D コマンドは、nngxValidateState()
で予約フラグメントシェーダユニフォームのステートフラグ(NN_GX_STATE_FSUNIFORM
)を指定してバリデートしても、その後で描画関数を呼び出したときに生成されます。 - 予約フラグメントユニフォーム
dmp_Gas.autoAcc
にGL_TRUE
が設定されている場合、予約ユニフォームdmp_FragOperation.mode
の値がGL_FRAGOP_MODE_GAS_ACC_DMP
に変更されたタイミングおよびGL_FRAGOP_MODE_GAS_ACC_DMP
から別の設定に変更されたタイミングでコマンドリストの保存開始、保存終了を行うと、保存されたコマンドリストのdmp_Gas.autoAcc
に関連するコマンドが正しく反映されない場合があります。 - 実行する 3D コマンドバッファのバイトサイズは 16 の倍数でなければなりません。
nngxAdd3DCommand()
で 0x00000000_00000000 をダミーとして追加することでサイズを調整してください。 -
glUseProgram()
の引数に 0 を指定して呼び出した状態で、プログラムやシェーダに関するステートをバリデートしても、コマンドは何も生成されません。
8.1.5. 更新されたステートの取得
nngxGetUpdateState()
で更新されているステートをステートフラグで取得することができます。
void nngxGetUpdatedState (GLbitfield* statemask);
8.1.6. ステート更新の無効化
8.2. コマンドリストの再使用
nngxUseSavedCmdlist()
または nngxUseSavedCmdlistNoCacheFlush()
にコマンドリストの保存によって取得したコマンドキャッシュの情報を渡すことで、3D コマンドおよびコマンドリクエストを再使用することができます。前者は追加する 3D コマンドのキャッシュフラッシュを行いますが、後者は行いません。
void nngxUseSavedCmdlist(GLuint cmdlist, GLuint bufferoffset, GLsizei buffersize, GLuint requestid, GLsizei requestsize, GLbitfield statemask, GLboolean copycmd); void nngxUseSavedCmdlistNoCacheFlush(GLuint cmdlist, GLuint bufferoffset, GLsizei buffersize, GLuint requestid, GLsizei requestsize, GLbitfield statemask);
cmdlist
には、保存で指定した 3D コマンドが蓄積されているコマンドリストを指定します。
bufferoffset
には 3D コマンドバッファの保存開始オフセット、buffersize
には 3D コマンドバッファの保存バイトサイズ、requestid
にはコマンドリクエストの保存開始 ID、requestsize
にはコマンドリクエストの保存数を指定しますが、これらは同じタイミングで保存されたコマンドキャッシュの情報でなければなりません。コマンドキャッシュの情報が指定されたコマンドリストのものであるかどうかや、すべてが同じコマンドキャッシュの情報であるかなどはチェックしません。正しくないコマンドキャッシュ情報を指定した場合の動作は不定です。
statemask
には完全コマンドを生成するステートをステートフラグの論理和で指定します。この関数が呼び出された前後ではステートの設定に矛盾が生じてしまいます。この矛盾を解消するためには、すべてのステートに対して完全コマンドを生成しなければならない場合がありますが、すべてのステートの完全コマンドを生成することは冗長となることがあるため、statemask
で指定されたステートに対してのみ完全コマンドを生成します。statemask
に NN_GX_STATE_OTHERS
を指定した場合、表 8-3 の関数すべてに関する完全コマンドが生成されます。
copycmd
には、コマンドキャッシュ機能で実行する 3D コマンドを保存したコマンドリストからコピーして実行するか、保存したコマンドリストの 3D コマンドそのものを実行するかを指定します。GL_TRUE
を指定した場合は 3D コマンドが現在バインドされているコマンドリストに追加でコピーされます。この方式は 3D コマンドのコピーが行われることによる CPU 負荷が高いため、サイズの小さな 3D コマンドバッファの再使用に適しています。GL_FALSE
を指定した場合はコピーされません。この方式は 3D コマンドのコピーが行われず CPU 負荷が軽減されるため、サイズの大きな 3D コマンドバッファの再使用に適しています。この指定により制御されるのは 3D コマンドバッファへの追加コピーだけで、コマンドリクエストは必ず追加されます。
保存したコマンドリストから 3D コマンドをコピーしない場合、3D コマンドが区切られていなければ関数内で再使用の直前に区切りのコマンドを追加し、3D コマンドの実行アドレスを保存したコマンドリストに切り替えます。そのため、保存したコマンドリスト側に区切りのコマンドがなければ元のコマンドリストに戻ることができなくなってしまいます。この方式で保存したコマンドリストから再使用する場合は、保存終了前に nngxSplitDrawCmdlist()
で区切りのコマンドを必ず追加してください。
保存したコマンドリストから 3D コマンドをコピーする場合、保存したコマンドリストのコマンドリクエストが 3D 実行コマンド以外かつ 3D コマンドが区切られていなければ関数内で再使用の直前に区切りのコマンドを追加します。
nngxUseSavedCmdlistNoCacheFlush()
の動作は、nngxUseSavedCmdlist()
の copycmd
に GL_FALSE
を指定したときと同じですが、cmdlist
で指定したコマンドリストの 3D コマンドバッファのキャッシュフラッシュを行いません。3D コマンドバッファの領域がフラッシュされていることをアプリケーションで保証しなければなりません。
エラー | 原因 |
---|---|
GL_ERROR_8037_DMP
GL_ERROR_8092_DMP
|
オブジェクト名が 0 のコマンドリストがバインドされているときに呼び出した |
GL_ERROR_8038_DMP
GL_ERROR_8093_DMP
|
cmdlist
に指定したコマンドリストが存在しない |
GL_ERROR_803A_DMP
GL_ERROR_8095_DMP
|
この関数の実行により、現在バインドされているコマンドリストの 3D コマンドバッファまたはコマンドリクエストの保持数をオーバーする |
8.2.1. コピーされるコマンドリクエストの情報
nngxUseSavedCmdlist()
の実行では、copycmd
の指定に関わらず、コマンドリクエストは必ず現在バインドされているコマンドリストに追加でコピーされます。コマンドリクエストは各コマンドで決められた情報を保持しており、保存されたときからステートが更新された場合でもそのままの情報がコピーされます。ただし、コピーされる最初の 3D 実行コマンドだけは情報が変更される可能性があります。
DMA 転送コマンド
DMA 転送をする転送元アドレス、転送先アドレス、転送サイズが保持されています。
3D 実行コマンド
3D コマンドバッファの実行開始アドレス、実行サイズが保持されています。保存を開始した 3D コマンドバッファのアドレスが実行開始アドレスと等しくない場合は、コマンドリクエストのコピー時に実行開始アドレスを保存開始アドレスに置き換え、実行サイズも併せて変更します。
メモリフィルコマンド
フィルされるカラーバッファの先頭アドレス、サイズ、クリアカラー、デプスステンシルバッファの先頭アドレス、サイズ、クリアデプス値、クリアステンシル値が保持されています。
ポスト転送コマンド
転送元のカラーバッファのアドレス、解像度、フォーマット、転送先のディスプレイバッファのアドレス、解像度、フォーマットが保持されています。
レンダーテクスチャ転送コマンド
転送元のカラーバッファのアドレス、解像度、転送先のテクスチャのアドレス、解像度が保持されています。
8.3. コマンドリストのコピー
nngxCopyCmdlist()
を呼び出すことで、コマンドリストを別のコマンドリストにコピーすることができます。コマンドリストの情報すべてをコピーするため、コピー先のコマンドリストに蓄積されている 3D コマンドもコマンドリクエストも上書きされることに注意してください。
void nngxCopyCmdlist(GLuint scmdlist, GLuint dcmdlist);
scmdlist
にコピー元のコマンドリスト、dcmdlist
にコピー先のコマンドリストを指定します。
この関数の動作は直接コマンドキャッシュに関係しませんが、コマンドキャッシュの情報がオフセットを基準に作成されることから、コマンドリストの保存直後に作成したコピーを再利用することができます。そのため、コピー後はコピー元のコマンドリストをクリアすることもできます。
エラー | 原因 |
---|---|
GL_ERROR_8047_DMP
|
現在バインドされているコマンドリストを dcmdlist に指定した |
GL_ERROR_8048_DMP
|
scmdlist
に指定したコマンドリストが存在しない |
GL_ERROR_8049_DMP
|
dcmdlist
に指定したコマンドリストが存在しない |
GL_ERROR_804A_DMP
|
scmdlist
と dcmdlist に同じコマンドリストを指定した |
GL_ERROR_804B_DMP
|
実行中のコマンドリストを dcmdlist に指定した |
GL_ERROR_804C_DMP
|
scmdlist
に指定されたコマンドリストに蓄積されている 3D コマンドまたはコマンドリクエストが、dcmdlist に指定されたコマンドリストで保持可能なサイズよりも大きかった |
8.3.1. コマンドリストの追加コピー
nngxCopyCmdlist()
ではコマンドリストの上書きコピーにのみ対応していましたが、nngxAddCmdlist()
は現在バインドされているコマンドリストに別のコマンドリストの情報すべてを追加でコピーすることができます。
void nngxAddCmdlist(GLuint cmdlist);
cmdlist
にコピー元のコマンドリストを指定します。
コピー元のコマンドリストに蓄積されたすべてのコマンドは、現在バインドされているコマンドリストに追加で蓄積されます。現在バインドされているコマンドリストに、すでにコマンドが蓄積されている場合は蓄積済みコマンドのあとに、コマンドが追加されます。
バインドされているコマンドリストの 3D コマンドバッファが区切られた直後ではなく、かつ追加する側のコマンドリクエストの先頭のコマンドが 3D 実行コマンドではない場合は、ライブラリ内で nngxSplitDrawCmdlist()
を呼び出し、コマンドバッファを区切ってから追加を行います。
バインドされているコマンドリストの 3D コマンドバッファが区切られた直後ではなく、かつ追加するコマンドリクエストの先頭のコマンドが 3D 実行コマンドである場合は、必要に応じてコピー先のコマンドバッファにダミーコマンドを追加することでアライメントしてからコマンドが追加されます。
ライブラリ内で nngxSplitDrawCmdlist()
を呼び出したときやダミーコマンドを追加したときは、そのサイズも含めて上限サイズのチェックが行われます。
エラー | 原因 |
---|---|
GL_ERROR_8054_DMP
|
cmdlist
に不正な値を指定した |
GL_ERROR_8055_DMP
|
現在バインドされているコマンドリストがない |
GL_ERROR_8056_DMP
|
cmdlist
に指定したコマンドリストと現在バインドされているコマンドリストが同じ |
GL_ERROR_8057_DMP
|
現在バインドされているコマンドリストが実行中 |
GL_ERROR_8058_DMP
|
現在バインドされているコマンドリストにコマンドバッファおよびコマンドリクエストを追加することで、バッファの上限サイズを超えてしまう |
8.4. コマンドリストのエクスポート
nngxExportCmdlist()
を呼び出すことで、コマンドキャッシュで取得したコマンドリストの内容をバイナリデータとしてメモリに保存(エクスポート)することができます。
GLsizei nngxExportCmdlist(GLuint cmdlist, GLuint bufferoffset, GLsizei buffersize, GLuint requestid, GLsizei requestsize, GLsizei datasize, GLvoid* data);
cmdlist
にはエクスポートするコマンドリストを指定します。
bufferoffset
と buffersize
には、エクスポートする 3D コマンドバッファの領域をバイトオフセットとバイトサイズで指定します。requestid
と requestsize
には、エクスポートするコマンドリクエストの開始 ID(0 から始まる蓄積順序)とエクスポートの対象とするコマンドリクエストの数を指定します。
data
と datasize
には、エクスポート先のメモリ領域の先頭アドレスとそのサイズを指定します。この関数は返り値でエクスポートされたデータのバイトサイズを返しますが、data
に 0(NULL)を指定した場合はエクスポートを行わず、エクスポートに必要なメモリのサイズを返します。エクスポートの手順としては、エクスポートに必要なメモリのサイズを取得してからメモリ領域を確保し、エクスポートすることを想定しています。
この関数の bufferoffset
、buffersize
、requestid
、requestsize
には、矛盾のない組み合わせの値が指定されなければなりません。安全なデータをエクスポートするには、nngxStopCmdlistSave()
で取得できる保存情報や、3D コマンドの蓄積中に同じタイミングで nngxGetCmdlistParameteri()
を呼び出して取得した値を使用することを推奨します。nngxGetCmdlistParameteri()
の pname
に NN_GX_CMDLIST_USED_BUFSIZE
を渡して蓄積済みの 3D コマンドバッファのサイズ、NN_GX_CMDLIST_USED_REQCOUNT
を渡して蓄積済みのコマンドリクエストの個数が取得できます。エクスポート対象となるコマンドリストの蓄積の開始時と終了時に、この二つの値を組みにして取得します。開始時に取得した値を bufferoffset
と requested
に、終了時の値から開始時の値を減算した値を buffersize
と requestsize
に指定してください。
エクスポートする 3D コマンドバッファ領域は、以下の条件を満たしていなければなりません。
-
bufferoffset
は、エクスポートするコマンドリクエストのうちの最初の 3D 実行コマンドが実行する領域内のどこかに指定されていなければなりません。 - エクスポートされるすべての 3D 実行コマンドが実行する区切りのコマンドはすべてエクスポートされていなければなりません。
- 最後の 3D 実行コマンドが実行する領域より後の領域までエクスポートすることができますが、その領域に区切りコマンドが含まれてはいけません。
- コマンドリクエストが 1 つもエクスポートされない場合は、逆に区切りのコマンドが含まれていてはいけません。
エラー | 原因 |
---|---|
GL_ERROR_803B_DMP
|
cmdlist
に不正な値(0 または存在しないコマンドリスト)を指定した |
GL_ERROR_803C_DMP
|
datasize
に指定されたサイズがエクスポートされるデータのサイズより小さい |
GL_ERROR_803D_DMP
|
requestid
と requestsize で指定された領域にコマンドが蓄積されていない |
GL_ERROR_803E_DMP
|
bufferoffset
または buffersize のアライメントが 8 バイトでない |
GL_ERROR_803F_DMP
|
指定されたコマンドリストに nngxUseSavedCmdlist() のコピーしない方式で追加された 3D 実行コマンドが含まれている |
GL_ERROR_8040_DMP
|
エクスポートされる 3D 実行コマンドが実行する 3D コマンドに対して、bufferoffset と buffersize による 3D コマンドバッファの指定が正しくない |
8.4.1. エクスポート情報の取得
エクスポートされたバイナリデータに含まれているコマンドリストの情報(エクスポート情報)は、nngxGetExportedCmdlistInfo()
で取得することができます。
void nngxGetExportedCmdlistInfo(GLvoid* data, GLsizei* buffersize, GLsizei* requestsize, GLuint* bufferoffset);
data
にはエクスポートしたバイナリデータの先頭アドレスを指定します。不正なデータが指定された場合は GL_ERROR_8046_DMP
のエラーを生成します。エクスポート情報として、buffersize
には 3D コマンドバッファのバイトサイズが、requestsize
にはコマンドリクエストの数が、bufferoffset
には 3D コマンドバッファの先頭への data
からのバイトオフセットがそれぞれ格納されます。
8.5. コマンドリストのインポート
nngxImportCmdlist()
を呼び出すことで、エクスポートしたバイナリデータからコマンドリストに、3D コマンドを追加コピー(インポート)することができます。
void nngxImportCmdlist(GLuint cmdlist, GLvoid* data, GLsizei datasize);
cmdlist
には、現在バインドされているコマンドリストも、バインドされていないコマンドリストのどちらも指定することができます。指定したコマンドリストに 3D コマンドがすでに蓄積されていた場合は、そのあとに追加する形でインポートが行われます。
インポートするデータの最初のコマンドリクエストが 3D 実行コマンドでない場合は、インポート先のコマンドリストをバインドして、nngxSplitDrawCmdlist()
でコマンドの区切りを追加しなければなりません。
data
と datasize
には、エクスポートデータへのポインタとエクスポートデータのバイトサイズを指定します。
インポートの結果、インポート先のコマンドリストの 3D コマンドバッファに、パディング用のダミーコマンドが生成される場合があります。
エラー | 原因 |
---|---|
GL_ERROR_8041_DMP
|
cmdlist
に不正な値(0 または存在しないコマンドリスト)を指定した |
GL_ERROR_8042_DMP
|
data
に不正なポインタを指定した |
GL_ERROR_8043_DMP
|
datasize
で指定したバイトサイズとエクスポートデータのサイズが異なる |
GL_ERROR_8044_DMP
|
インポートで追加される 3D コマンドまたはコマンドリクエストが、インポート先のコマンドリストで保持可能なサイズを超える |
GL_ERROR_8045_DMP
|
コマンドの区切りでない状態のコマンドリストに、最初のコマンドリクエストが 3D 実行コマンドでないデータをインポートした |
8.6. 3D コマンドの追加
nngxAdd3DCommand()
または nngxAdd3DCommandNoCacheFlush()
で、指定した領域のデータを現在バインドされているコマンドリストの 3D コマンドバッファに追加したり、指定した領域を実行する 3D 実行コマンドを追加したりすることができます。前者は追加する 3D コマンドのキャッシュフラッシュを行いますが、後者は行いません。
void nngxAdd3DCommand(const GLvoid* bufferaddr, GLsizei buffersize, GLboolean copycmd); void nngxAdd3DCommandNoCacheFlush(const GLvoid* bufferaddr, GLsizei buffersize);
この関数は copycmd
の指定によって動作が異なります。
copycmd
に GL_TRUE
が指定されている場合、bufferaddr
と buffersize
で指定された先頭アドレスとバイトサイズの領域に格納されている 3D コマンドを、現在バインドされているコマンドリストの 3D コマンドバッファに追加コピーします。指定された領域にコマンドの区切りが存在する場合の動作は保証されていません。buffersize
は 4 の倍数の正値でなければなりません。
copycmd
に GL_FALSE
が指定されている場合、bufferaddr
と buffersize
で指定された先頭アドレスとバイトサイズの領域に格納されている 3D コマンドを実行する 3D 実行コマンドをコマンドリクエストに追加します。現在バインドされているコマンドリストの 3D コマンドバッファがコマンドの区切りで区切られていない場合は、内部でコマンドの区切りを追加してからコマンドリクエストを追加します。指定された領域の最後の 3D コマンドがコマンドの区切りでない場合の動作は保証されていません。
は 16 の倍数のbufferaddr
値、buffersize
は 16 の倍数の正値でなければなりません。
nngxAdd3DCommandNoCacheFlush()
の動作は、nngxAdd3DCommand()
の copycmd
に GL_FALSE
を指定したときと同じですが、追加する 3D コマンドのキャッシュフラッシュを行いません。
エラー | 原因 |
---|---|
GL_ERROR_804E_DMP
GL_ERROR_808C_DMP
|
コマンドリストがバインドされていない状態で呼び出した |
GL_ERROR_804F_DMP
GL_ERROR_808D_DMP
|
buffersize
に不正な値を指定した |
GL_ERROR_8050_DMP
|
copycmd
が GL_TRUE のとき、現在バインドされているコマンドリストの 3D コマンドバッファのサイズが足りなくなる |
GL_ERROR_8051_DMP
|
copycmd
が GL_FALSE のとき、現在バインドされているコマンドリストの 3D コマンドバッファのサイズが足りなくなる |
GL_ERROR_8052_DMP
|
copycmd
が GL_FALSE のときに bufferaddr に指定した値が 16 の倍数ではなかった |
GL_ERROR_808E_DMP
|
bufferaddr
に指定した値が 16 の倍数ではなかった |
GL_ERROR_808F_DMP
|
現在バインドされているコマンドリストのコマンドリクエストのサイズが足りなくなる |
8.6.1. 3D コマンドの直接生成について
nngxAdd3DCommand()
を使用することで、アプリケーションで直接生成した 3D コマンドを、gl 関数を呼び出さずに実行させることができるようになります。しかし、直接生成した 3D コマンド(直接生成コマンド)と通常の gl 関数を呼び出して生成した 3D コマンド(通常生成コマンド)を混在させて実行する際には、直接生成コマンドがライブラリのステートを更新しないことに注意しなければなりません。
直接生成コマンドで GPU の設定を変更したあと、同じ設定を変更するような gl 関数を呼び出した場合のステートとの比較で更新なしと判断され、生成されるべき 3D コマンドが生成されずに意図しない描画結果となる可能性があります。また、ステートを更新状態にしたまま直接生成コマンドを実行し、そのあとでバリデートが行われると、意図しない 3D コマンドが生成されて、直接生成コマンドが反映されない可能性もあります。
8.6.1.1. 通常生成コマンドから直接生成コマンドへの移行
通常生成コマンドの実行から直接生成コマンドの実行へと安全に移行するには、更新状態のステートが存在しない状態にすることが肝心です。
ステートの更新状態が解除されるのは glDraw
系関数や nngxValidateState()
を呼び出してバリデートしたときです(「8.1.2. コマンド生成」参照)。これまでに gl 関数で行われた設定が GPU に反映されていることを前提にして直接生成コマンドを実行する場合はもちろん、直接生成コマンドを意図したとおりに実行させるためにも、バリデートを行っておくことを推奨します。nngxValidateState()
の引数に NN_GX_STATE_ALL
を渡し、すべてのステートをバリデートするのが簡単ですが、生成される 3D コマンドが冗長になることを避けるには nngxGetUpdatedState()
で取得したステートフラグで、更新状態にあるステートだけをバリデートする方法もあります。
8.6.1.2. 直接生成コマンドから通常生成コマンドへの移行
直接生成コマンドの実行から通常生成コマンドの実行へと安全に移行するには、GPU の設定とライブラリのステートが一致するように、直接生成コマンドで更新するはずのステートを更新状態にすることが肝心です。
一番確実な方法は nngxUpdateState()
の引数に NN_GX_STATE_ALL
を渡し、すべてのステートを更新状態にしてからバリデートすることです。ただし、この方法では不要な 3D コマンドまで生成されてしまいます。
直接生成コマンドで更新したステートとそれに依存するステートを完全に把握しているならば、更新状態にするステートを限定してバリデートし、3D コマンドの生成を必要最小限に抑えることができます。
ここで、nngxSetCommandGenerationMode()
の引数に NN_GX_CMDGEN_MODE_UNCONDITIONAL
を渡して呼び出し、一部のステートの完全コマンドが生成されるようにすれば、冗長なコマンドの生成を抑えることができます。ただし、nngxUpdateState()
で更新状態にしなくてもよくなるのは、「8.1.3. 差分コマンドと完全コマンド」で説明した特定のステートだけです。
8.7. 3D コマンドの編集
コマンドキャッシュによってコマンドリストの再使用を行うことができるようになりましたが、保存したコマンドリストそのままを再使用するだけでは、カメラ位置の変更など、シーン中の変化に対応することができません。この節では、3D コマンドバッファの仕様と GPU のレジスタに書き込まれる情報を説明し、頂点シェーダや予約フラグメントシェーダの設定値などに関する 3D コマンドを編集することでシーン中の変化に対応する方法を紹介します。
8.7.1. 3D コマンドバッファへのアクセスについて
コマンドキャッシュの情報に保存されているのは 3D コマンドバッファの保存開始オフセットです。そのため、3D コマンドを編集する際に 3D コマンドバッファへアクセスするときは、nngxGetCmdlistParameteri()
の pname
に NN_GX_CMDLIST_TOP_BUFADDR
を渡して呼び出し、3D コマンドバッファの先頭アドレスを取得する必要があります。
3D コマンドやレジスタに書き込む値のエンディアンがリトルエンディアンであるため、以降で示すビットレイアウトや数値の表記と、メモリ上でのバイトオーダーとの対応に注意してください。
8.7.2. 3D コマンドバッファの仕様
3D コマンドバッファは、GPU のレジスタに書き込まれる 3D コマンド(PICA レジスタ書き込みコマンド)の集合です。3D コマンドは、連続する 64 ビット単位のコマンドの集合で、32 ビットのヘッダと 32 ビットのデータで構成されています。ヘッダの内容によってデータの個数が変動しますが、3D コマンドのアライメントは 64 ビットです。そのため、データの個数によっては最後の 64 ビットの上位 32 ビットのデータが無視されます。
3D コマンドの各ビットには、以下の情報が格納されています。
ビット | 名前 | 説明 |
---|---|---|
[ 31 : 0 ] | DATA | レジスタに書き込まれる 32 ビットデータ。 |
[ 47 : 32 ] | ADDR | データを書き込む PICA レジスタのアドレス。 |
[ 51 : 48 ] | BE | バイトイネーブル。32 ビットのデータを 4 つのバイトデータとみなし、対応するビットが 1 であればそのバイトのデータを書き込みます。 |
[ 59 : 52 ] | SIZE | データの個数。実際のデータの個数 - 1 の値が格納されており、0 ならばシングルアクセス、1 以上ならばバーストアクセスです。 |
[ 63 : 63 ] | SEQ | バーストアクセス時のアクセスモード。0 ならば単一レジスタ書き込み、1 ならば連続レジスタ書き込みを行います。 |
BE が 0 の場合はレジスタにデータが書き込まれませんが、3D コマンドは GPU に読み込まれるため、ダミーコマンドとしてアライメントやタイミング調整などに使用されます。ただし、ダミーコマンドとして、ADDR に指定できるレジスタには範囲がありますので注意してください。
SIZE で指定されたデータの個数によって、シングルアクセスとバーストアクセスの 2 種類のアクセス方法に分かれ、さらにバーストアクセス時には SEQ の指定によって、単一レジスタ書き込みと連続レジスタ書き込みの 2 種類のアクセスモードに分かれます。
8.7.3. シングルアクセス
SIZE に 0 が指定され、データの個数が 1 である場合はシングルアクセスでレジスタにデータを書き込みます。シングルアクセスでは、1 つのレジスタに 1 つのデータを一度だけ書き込みます。
ADDR で指定されたアドレスのレジスタに DATA の内容を書き込みます。その際、BE で 1 となっているビットに対応するバイトだけが書き込まれますので、BE が 0 のときはレジスタにデータが書き込まれません。SEQ の指定は無視されます。
例)
3D コマンドが 0x000F0110_12345678 であるとき、SIZE = 0、BE = 0xF、ADDR = 0x0110、DATA = 0x12345678 と解釈されます。SIZE が 0 なのでシングルアクセスとなり、アドレスが 0x0110 のレジスタにデータ 0x12345678 を書き込みます。
8.7.4. バーストアクセス
SIZE に 1 以上が指定され、データの個数が 2 以上である場合はバーストアクセスでレジスタにデータを書き込みます。バーストアクセスでは、1 つまたは複数のレジスタに SIZE + 1 個(最大 256 個)のデータを書き込みます。
DATA に格納されているのは 1 つ目の 32 ビットデータです。2 つ目以降の書き込みデータは後続の 64 ビットデータに 2 つずつ格納され、下位 32 ビットが先のデータ、上位 32 ビットが後のデータとなっています。3D コマンドのアライメントは 64 ビットのため、書き込むデータの個数が偶数の場合は最後の 64 ビットデータの上位 32 ビットのデータが無視されます。
BE の指定は書き込まれるデータすべてに共通します。つまり BE が 0 ならば、レジスタにデータは 1 つも書き込まれません。
8.7.4.1. 単一レジスタ書き込み
SEQ に 0 が指定されている場合、アクセスモードが単一レジスタ書き込みとなり、複数のデータを 1 つのレジスタに連続して書き込みます。
ADDR で指定されたアドレスのレジスタにだけ、データが連続して書き込まれます。
例)
3D コマンドが、
0x004F0080_11111111
0x33333333_22222222
0x55555555_44444444
であるとき、SIZE = 4、BE = 0xF、ADDR = 0x0080、DATA = 0x11111111、SEQ = 0 と解釈されます。SIZE が 4、SEQ が 0 なので単一レジスタ書き込みのバーストアクセスとなり、アドレスが 0x0080 のレジスタに 5 個のデータ(0x11111111、0x22222222、0x33333333、0x44444444、0x55555555)を連続して書き込みます。次に実行される 3D コマンドは 0x55555555_44444444 の次の 64 ビットデータです。
8.7.4.2. 連続レジスタ書き込み
SEQ に 1 が指定されている場合、アクセスモードが連続レジスタ書き込みとなり、連続する複数のレジスタにデータを 1 つずつ、一度だけ書き込みます。
ADDR で指定されたアドレスから連続するレジスタ(アドレスは 1 ずつインクリメントされる)に、データが 1 つずつ書き込まれます。
例)
3D コマンドが、
0x805F0280_11111111
0x33333333_22222222
0x55555555_44444444
0x77777777_66666666
であるとき、SIZE = 5、BE = 0xF、ADDR = 0x0280、DATA = 0x11111111、SEQ = 1 と解釈されます。SIZE が 5、SEQ が 1 なので連続レジスタ書き込みのバーストアクセスとなり、アドレスが 0x0280 のレジスタから連続する 6 つのレジスタに、データを書き込みます。アドレスが 0x0280 のレジスタには 0x11111111、アドレスが 0x0281 のレジスタには 0x22222222 が書き込まれ、以降、アドレス 0x0282 には 0x33333333、アドレス 0x0283 には 0x44444444、アドレス 0x0284 には 0x55555555、アドレス 0x0285 には 0x66666666 と続きます。0x77777777 はデータ個数の関係で無視されます。次に実行される 3D コマンドは 0x77777777_66666666 の次の 64 ビットデータです。
8.7.5. 3D コマンドの実行コスト
PICA レジスタへ値を書き込む 3D コマンドは、一部のレジスタへ書き込みを除いて、シングルアクセスやバーストアクセスに関係なく、1 つのレジスタに 1 回書き込みをするコマンドを 1 個処理するには 1 サイクルかかります。
ラスタライゼーションモジュールでは、3D コマンドが入力されるとコマンドを 1 個処理するごとに 1 サイクルのビジーが出力されます。そのため、ラスタライゼーションモジュール以降のモジュール(ラスタライゼーションモジュール、テクスチャユニット、フラグメントライティング、テクスチャコンバイナ、パーフラグメントオペレーションモジュール)への 3D コマンドは 1 個あたり 2 サイクルで処理されることになります。
テクスチャキャッシュのクリアコマンド(レジスタ 0x0080 のビット [ 16 : 16 ])、ポスト頂点キャッシュのクリアコマンド(レジスタ 0x0231)は 1 サイクルで処理されます。ただし、処理自体は 1 サイクルで行われるものの、この 3D コマンドはテクスチャユニットへのコマンドですので、2 サイクルに 1 コマンドしか入力できません。
フレームバッファのキャッシュフラッシュコマンド(レジスタ 0x0111 のビット [ 0 : 0 ])は約 100 サイクル、アーリーデプスバッファのクリアコマンド(レジスタ 0x0063 のビット [ 0 : 0 ])は約 1000 サイクルで処理されます。
また、トライアングルセットアップ、ラスタライゼーションモジュール、テクスチャユニット、フラグメントライティング、テクスチャコンバイナ、パーフラグメントオペレーションモジュールの各モジュールは、フラグメントデータがモジュール内に残っている状態(フラグメントを処理している状態)で 3D コマンドが入力されるとモジュールごとにパイプラインフラッシュを行います。そのため、描画コマンドの直後の 3D コマンドは、各モジュールのパイプラインフラッシュのコストがかかります。
各モジュールに割り当てられているレジスタの範囲は以下のとおりです。
モジュール | レジスタの範囲 |
---|---|
トライアングルセットアップ | 0x0040 から 0x005F |
ラスタライゼーションモジュール | 0x0060 から 0x006F |
テクスチャユニット | 0x0080 から 0x00BF |
フラグメントライティング | 0x0140 から 0x01DF |
テクスチャコンバイナ | 0x00C0 から 0x00FF |
パーフラグメントオペレーションモジュール | 0x0100 から 0x013F |
実際にはレジスタの存在しないアドレスも含まれています。
8.8. PICA レジスタ情報
この節では、いくつかの PICA レジスタに関して、そのアドレスと設定方法、値のフォーマットを説明します。これらの情報を元に、該当するレジスタに対する書き込み箇所を 3D コマンドバッファから検索して内容を書き換えることで、その機能に対する設定値を変更することができます。
レジスタにメモリアドレスを設定する場合は、nn::gx::GetPhysicalAddr()
で仮想アドレスを物理アドレスに変換する必要があります。
レジスタのビットレイアウトは以下の様式で記載しています。
8.8.1. 頂点シェーダ設定レジスタ(0x02B0 ~ 0x02DF ほか)
頂点シェーダの開始アドレスや頂点属性、浮動小数点定数レジスタへの設定など、頂点シェーダに関連する設定に使用するレジスタについて説明します。
8.8.1.1. 浮動小数点定数レジスタ(0x02C0, 0x02C1 ~ 0x02C8)
頂点シェーダには 96 個の浮動小数点定数レジスタ(シェーダアセンブラでは "c0" から "c95" で表記)があり、それぞれが xyzw の 4 つのコンポーネントで構成されています。設定方法にはシェーダアセンブラの def
命令による定数定義と、ユニフォームによる定義の 2 通りあります。前者の場合は GPU の内部形式である 24 ビット浮動小数点数(下位から仮数部 16 ビット、指数部 7 ビット、符号部 1 ビット)で設定し、後者の場合は 32 ビット浮動小数点数(IEEE754 形式の単精度表現)で設定しますが、GPU 内で自動的に 24 ビットに変換されます。
インデックス指定(0x02C0)
どの浮動小数点定数レジスタに対して、どのデータ入力モードでデータを書き込むのかを、レジスタ 0x02C0 で指定します。
INDEX には浮動小数点定数レジスタのインデックスを指定します。0x00 ならば "c0"、0x0A ならば "c10"、0x5F ならば "c95" が指定されます。同時に、MODE に 1 を書き込んだ場合はデータ入力モードが 32 ビット浮動小数点数の入力モードとなり、0 を書き込んだ場合は 24 ビット浮動小数点数の入力モードとなります。
浮動小数点定数レジスタの 4 つのコンポーネント(x, y, z, w)に書き込むデータは、レジスタ 0x02C1 ~ 0x02C8 のいずれかに書き込みます。0x02C1 ~ 0x02C8 のいずれのレジスタに値を書き込んでも処理結果は同じです。極端に言えば、すべてのデータを同じレジスタに書き込んでも、0x02C8 から逆順にデータを書き込んでも同じ結果となります。
浮動小数点定数レジスタに値を設定するには、0x02C0 にインデックスなどを書き込んだあと、0x02C1 ~ 0x02C8 にデータを書き込んでください。
32 ビット浮動小数点数入力モード
32 ビット浮動小数点数入力モードでは、4 つの 32 ビットデータをレジスタ 0x02C1 ~ 0x02C8 のいずれかに書き込むことで 1 つの浮動小数点定数レジスタに値を設定することになります。書き込む順番は、コンポーネントの w、z、y、x の順です。
32 ビットデータを 4 回書き込むとインデックスが自動的に 1 インクリメントされ、指定したインデックスの次のインデックスの浮動小数点定数レジスタに値を設定するようになります。つまり、一度レジスタ 0x02C0 でインデックス 0x0A を指定したあと、0x02C1 ~ 0x02C8 のいずれかに書き込まれたデータの最初の 4 つは "c10" に書き込まれ、その次の 4 つは "c11" に書き込まれます。
例)
レジスタ 0x02C0 にデータ 0x80000023 を書き込むと、MODE = 1、INDEX = 35 と解釈され、"c35" の浮動小数点定数レジスタへ 32 ビット浮動小数点数入力モードで書き込む準備が整います。このあと、レジスタ 0x02C1 に 0x40800000、0x02C2 に 0x40400000、0x02C3 に 0x40000000、0x02C4 に 0x3F800000 の組み合わせで 2 回(計 8 回)書き込んだ場合、"c35.xyzw" と "c36.xyzw" には { 1.0f, 2.0f, 3.0f, 4.0f } が設定されます。
上記の設定を 3D コマンドでは、
0x000F02C0_80000023
0x803F02C1_40800000 0x40000000_40400000 0x00000000_3F800000
0x803F02C1_40800000 0x40000000_40400000 0x00000000_3F800000
などのように表すことができます。
24 ビット浮動小数点数入力モード
24 ビット浮動小数点数入力モードでは、4 つの 24 ビット浮動小数点数を 3 つの 32 ビットデータにパックしたものをレジスタ 0x02C1 ~ 0x02C8 のいずれかに書き込むことで 1 つの浮動小数点定数レジスタに値を設定することになります。32 ビットデータへのパックの順番は、コンポーネントの w、z、y、x の順です。4 つの 24 ビットデータを、どのようにして 3 つの 32 ビットデータにパックするのかは下図を参照してください。32 ビットの浮動小数点数から 24 ビットの浮動小数点数への変換方法については「8.9.1. 24 ビット浮動小数点数への変換」を参照してください。
32 ビットデータを 3 回書き込むとインデックスが自動的に 1 インクリメントされ、指定したインデックスの次のインデックスの浮動小数点定数レジスタに値を設定するようになります。つまり、一度レジスタ 0x02C0 でインデックス 0x0A を指定したあと、0x02C1 ~ 0x02C8 のいずれかに書き込まれたデータの最初の 3 つは "c10" に書き込まれ、その次の 3 つは "c11" に書き込まれます。
例)
レジスタ 0x02C0 にデータ 0x00000023 を書き込むと、MODE = 0、INDEX = 35 と解釈され、"c35" の浮動小数点定数レジスタへ 24 ビット浮動小数点数入力モードで書き込む準備が整います。このあと、レジスタ 0x02C1 に 0x41000040、0x02C2 に 0x80004000、0x02C3 に 0x003F0000 の組み合わせで 2 回(計 6 回)書き込んだ場合、"c35.xyzw" と "c36.xyzw" には { 1.0f, 2.0f, 3.0f, 4.0f } が設定されます。
上記の設定を 3D コマンドでは、
0x000F02C0_00000023
0x802F02C1_41000040 0x003F0000_80004000
0x802F02C1_41000040 0x003F0000_80004000
などのように表すことができます。
8.8.1.2. ブールレジスタ(0x02B0)
頂点シェーダには 16 個のブールレジスタ(シェーダアセンブラでは "b0" から "b15" で表記)があります。設定方法にはシェーダアセンブラの defb
命令による定数定義と、ユニフォームによる定義の 2 通りあります。
レジスタ 0x02B0 のビット [ 15 : 0 ] の各ビットが、頂点シェーダのブールレジスタの 1 つ 1 つに対応しています。ビット [0] が "b0"、ビット [1] が "b1"、・・・、ビット [15] が "b15" に対応し、1 が書き込まれると TRUE、0 が書き込まれると FALSE を意味します。
ジオメトリシェーダを使用する場合、ブールレジスタの 15 番(b15)がジオメトリシェーダに予約されていることに注意してください。
8.8.1.3. 整数レジスタ(0x02B1 ~ 0x02B4)
頂点シェーダには 4 個の整数レジスタ(シェーダアセンブラでは "i0" から "i3" で表記)があり、それぞれが xyz の 3 つのコンポーネントで構成されています。設定方法にはシェーダアセンブラの defi
命令による定数定義と、ユニフォームによる定義の 2 通りあります。
レジスタ 0x02B1 が "i0"、0x02B2 が "i1"、0x02B3 が "i2"、0x02B4 が "i3" にそれぞれ対応しています。整数レジスタには x、y、z の 3 コンポーネントを下位から 8 ビットずつ格納します。y および z への負数の設定は 2 の補数表現で行います。
8.8.1.4. プログラムコード設定レジスタ(0x02BF, 0x02CB ~ 0x02D3, 0x02D5 ~ 0x02DD)
頂点シェーダで実行するプログラムコードのロードに使用するレジスタには、プログラムをロードするアドレスの指定するレジスタと、プログラムデータを書き込むための複数のレジスタが存在します。
レジスタ 0x02CB には、頂点シェーダのプログラムコードをロードするアドレスを ADDR に設定します。レジスタ 0x02CC ~ 0x02D3 には、ロードするプログラムコードのデータを書き込みます。
プログラムコードのロードアドレスをレジスタ 0x02CB に設定してから、0x02CC ~ 0x02D3 のいずれかのレジスタにデータを書き込みます。頂点シェーダプログラムの 1 命令は 32 ビットですので、1 データの書き込みが 1 命令に対応し、1 つ書き込むごとにロードアドレスが 1 インクリメントされます。いずれのレジスタに書き込んでも処理結果は変わりません。
プログラムコードを更新したあとは、プログラムの更新完了を GPU に通知するためにレジスタ 0x02BF の任意のビットに 1 を書き込む必要があります。
上記のプログラムコードに加え、Swizzle パターンデータをロードする必要があります。Swizzle パターンを設定するレジスタを以下に示します。
レジスタ 0x02D5 には、Swizzle パターンをロードするアドレスを ADDR に設定します。レジスタ 0x02D6 ~ 0x02DD には、ロードする Swizzle パターンのデータを書き込みます。
Swizzle パターンのロードアドレスをレジスタ 0x02D5 に設定してから、0x02D6 ~ 0x02DD のいずれかのレジスタにデータを書き込みます。データを 1 つ書き込むごとにロードアドレスが 1 インクリメントされます。いずれのレジスタに書き込んでも処理結果は変わりません。
8.8.1.5. 開始アドレス設定レジスタ(0x02BA)
シェーダアセンブラで定義した main ラベルのアドレスが頂点シェーダの開始アドレスです。
レジスタ 0x02BA のビット [ 15 : 0 ] に頂点シェーダの開始アドレスを設定します。
8.8.1.6. 頂点属性入力数設定レジスタ(0x0242, 0x02B9)
頂点シェーダに入力される頂点属性数が設定されるレジスタは複数あり、それぞれに同じ値が設定されます。
count には(入力する頂点属性数 - 1)を設定します。入力する頂点属性数は、頂点バッファを使用する場合(ロードアレイを使用して頂点データをロードする場合)は 12 個まで、頂点バッファを使用しない場合(コマンドバッファ経由で頂点データをロードする場合)は 16 個までです。
8.8.1.7. 入力レジスタのマッピング設定レジスタ(0x02BB, 0x02BC)
頂点シェーダに入力される頂点属性データと入力レジスタとのマッピングが設定されるレジスタを以下に示します。
attrib_0 ~ attrib_15 には、頂点シェーダに入力される頂点属性データが、どの入力レジスタに格納されるのかを入力レジスタのインデックス番号("v0" が 0x0、"v1" が 0x1、"v15" が 0xF)で設定します。頂点シェーダに入力される頂点属性の順番は glBindAttribLocation()
で指定した index
とは対応せず、「頂点属性アレイ設定レジスタ(0x0200 ~ 0x0227)」で説明されている内部頂点属性の番号と対応しています。
8.8.1.8. 固定頂点属性値設定レジスタ(0x0232 ~ 0x0235)
glVertexAttrib4f()
などで設定される固定頂点属性値は、24 ビット浮動小数点数に変換されて GPU へ転送されます。固定頂点属性値は、以下のレジスタへの設定で GPU に転送されます。
まず、レジスタ 0x0232 のビット [ 3 : 0 ] に固定頂点属性値の内部頂点属性の番号を書き込みます。次に、固定頂点属性値を 24 ビット浮動小数点数に変換した 3 つの 32 ビットデータを、レジスタ 0x0233、0x0234、0x0235 の順に書き込みます。24 ビット浮動小数点数に変換した 3 つの 32 ビットデータは、「24 ビット浮動小数点数入力モード」にあるデータと同じ方法で作成します。
「頂点属性アレイ設定レジスタ(0x0200 ~ 0x0227)」で頂点アレイの有効・無効を変更した場合、設定されていた固定頂点属性値は無効となりますので、固定頂点属性値を再度設定する必要があります。また、1 つも頂点アレイを使用せず、すべての頂点属性を固定頂点属性として使用することは GPU の仕様上できません。固定頂点属性を使用する場合は必ず、1 つ以上の頂点アレイを使用してください。
8.8.1.9. 頂点属性アレイ設定レジスタ(0x0200 ~ 0x0227)
頂点バッファ使用時の頂点属性アレイを設定するレジスタには複数のレジスタがあります。これらのレジスタに対する設定コマンドはステートフラグ NN_GX_STATE_VERTEX
のバリデーションで生成されます。
これらのレジスタで行われる設定には、ベースアドレス、内部頂点属性の型、固定頂点属性のマスク、頂点属性の総数、各ロードアレイのバイトオフセット、ロードアレイの要素の情報、ロードアレイの要素数、ロードアレイのバイト数、インデックスアレイのオフセットがあります。
ベースアドレス
レジスタ 0x0200 の ARRAY_BASE_ADDR には、ベースアドレスとして物理アドレスを 16 で割った値を設定します。全頂点アレイのアドレスと、頂点インデックスアレイのアドレスは、ベースアドレス + オフセットの形式で設定されます。頂点アレイとインデックスアレイのアドレス範囲があらかじめ確定している場合は、頂点アレイの組み合わせごとに設定しなおす必要はありません。
内部頂点属性の型
内部頂点属性とは、頂点アレイをロードするために GPU が内部で決定する頂点属性番号のことです。glEnableVertexAttribArray()
の index
で指定された頂点属性番号(以降、GL 頂点属性番号と呼びます)とは異なりますが、内部頂点属性と GL 頂点属性番号との間では 1 対 1 の関係が成り立っています。
glEnableVertexAttribArray()
によって有効とされている頂点アレイが、内部頂点属性 0 から昇順に隙間なく割り当てられますが、GL 頂点属性番号 0 が内部頂点属性 0 であるとは限りません。例えば、GL 頂点属性番号 0 と 3 の頂点アレイが有効になっている場合、それらは内部頂点属性 0 と 1 に割り当てられることも、1 と 0 に割り当てられることもあります。内部頂点属性の割り当て方法はドライバの実装に依存していますので、将来変更される場合があります。
現実装では、頂点アレイのアドレスで昇順にソートし、先頭の GL 頂点属性から順に内部頂点属性 0 から割り当てています。
頂点属性データは、内部頂点属性の順に頂点シェーダへ入力されます。
レジスタ 0x0201 から 0x0202 の ARRAY_TYPEn(n = 0 ~ 11)には、(n + 1)番目の内部頂点属性の型を設定します。内部頂点属性の型としてレジスタに設定する値は glVertexAttribPointer()
で指定された size
と type
の組み合わせで決定されます。組み合わせとレジスタに設定する値の対応は以下のようになっています。
size | type | 設定値 |
---|---|---|
1 |
GL_BYTE
|
0x0 |
1 |
GL_UNSIGNED_BYTE
|
0x1 |
1 |
GL_SHORT
|
0x2 |
1 |
GL_FLOAT
|
0x3 |
2 |
GL_BYTE
|
0x4 |
2 |
GL_UNSIGNED_BYTE
|
0x5 |
2 |
GL_SHORT
|
0x6 |
2 |
GL_FLOAT
|
0x7 |
3 |
GL_BYTE
|
0x8 |
3 |
GL_UNSIGNED_BYTE
|
0x9 |
3 |
GL_SHORT
|
0xA |
3 |
GL_FLOAT
|
0xB |
4 |
GL_BYTE
|
0xC |
4 |
GL_UNSIGNED_BYTE
|
0xD |
4 |
GL_SHORT
|
0xE |
4 |
GL_FLOAT
|
0xF |
固定頂点属性マスク
頂点シェーダのシェーダアセンブラで、#pragma bind_symbol
で定義されている数の頂点属性が有効となりますが、そのうち頂点アレイが無効に設定されているもの(glDisableVertexAttribArray()
が呼び出されている頂点属性や glEnableVettexAttribArray()
が呼び出されていない頂点属性)に対しては固定頂点属性が使用されます。
固定頂点属性も頂点アレイと同様に内部頂点属性に割り当てられます。固定頂点属性は、頂点アレイが割り当てられた番号に続いて、昇順に隙間なく割り当てられます。
割り当てられた内部頂点属性のマスクを、レジスタ 0x0202 の CONST_ATTRIB_MASK に設定します。下位のビットから順に内部頂点属性 0 から内部頂点属性 11 に対応しており、固定頂点属性に割り当てられているものに対応するビットには 1 がセットされます。
このレジスタ設定で頂点アレイの有効・無効を変更した場合、設定されていた固定頂点属性値は無効となりますので、固定頂点属性値を再度設定する必要があります。また、1 つも頂点アレイを使用せず、すべての頂点属性を固定頂点属性として使用することは GPU の仕様上できません。固定頂点属性を使用する場合は必ず、1 つ以上の頂点アレイを使用してください。
頂点属性数
レジスタ 0x0202 の ARRAY_NUM には、頂点アレイを使用する頂点属性と固定頂点属性の総数 - 1 を設定します。
ロードアレイ
GPU は頂点属性データをロードするために、頂点属性アレイをデータアレイ単位で管理しています。このデータアレイを特にロードアレイと呼び、GPU は 12 個のロードアレイからデータをロードします。
12 個のロードアレイはそれぞれ 12 個までの要素によって構成されています。ロードアレイの要素とは、そのロードアレイを構成する頂点アレイのデータ、または 4 バイト単位のパディングのことです。基本的に、複数の頂点属性を含んだ構造体の配列として頂点データを定義した場合(これをインターリーブドアレイと呼びます)、その 1 つのインターリーブドアレイが 1 つのロードアレイに対応しています。逆に、1 つの頂点属性の配列として頂点データを定義した場合(これを独立アレイと呼びます)、その 1 つの頂点属性が 1 つのロードアレイに対応しています。
ロードアレイは先頭のロードアレイ(ロードアレイ 0)から昇順に詰めて使用しなければなりません。例えば、ロードアレイ 1 とロードアレイ 4 のように 0 から始まっていない、または連続ではない組み合わせでは使用できません。
頂点属性アレイの実際のアドレスは、glBufferData()
で確保されたアドレスに glVertexAttribPointer()
の ptr
で指定されたオフセットを加えた値です。レジスタに設定する場合、この実際のアドレスが(ベースアドレス× 16 +ロードアレイのバイトオフセット)となるように設定します。
レジスタ(0x0203 + n × 3)の ARRAYn_OFFSET(n = 0 ~ 11)には、(n + 1)番目のロードアレイのバイトオフセットが設定されます。使用するロードアレイの個数が少ないほど GPU のパフォーマンスが向上するため、ドライバによって、少ない個数のロードアレイでデータがロードできるような設定がなされています。
レジスタ(0x0204 + n × 3)から(0x0205 + n × 3)の ARRAYn_ELEMi(n = 0 ~ 11、i = 0 ~ 11)には、(n + 1)番目のロードアレイを構成する(i + 1)番目の要素を先頭から順に設定します。要素には使用する内部頂点属性またはパディングを設定し、レジスタに設定する値と要素の対応は以下のようになっています。
設定値 | 要素 |
---|---|
0x0 | 内部頂点属性 0 |
0x1 | 内部頂点属性 1 |
0x2 | 内部頂点属性 2 |
0x3 | 内部頂点属性 3 |
0x4 | 内部頂点属性 4 |
0x5 | 内部頂点属性 5 |
0x6 | 内部頂点属性 6 |
0x7 | 内部頂点属性 7 |
0x8 | 内部頂点属性 8 |
0x9 | 内部頂点属性 9 |
0xA | 内部頂点属性 10 |
0xB | 内部頂点属性 11 |
0xC | 4 バイトのパディング |
0xD | 8 バイトのパディング |
0xE | 12 バイトのパディング |
0xF | 16 バイトのパディング |
例えば、レジスタ 0x0204 の ARRAY0_ELEM0 に 0x0 を設定した場合、1 番目のロードアレイの第 1 番目の要素は内部頂点属性 0 となり、ロードアレイのデータ構造の先頭には レジスタ 0x0201 の ARRAY_TYPE0 に設定された内部頂点属性 0 の型のデータが配置されることになります。
レジスタ(0x0205 + n × 3)の ARRAYn_STRIDE には、(n + 1)番目のロードアレイの 1 頂点あたりのバイト数を設定します。複数の型の要素を含むロードアレイには自動でパディングが含まれる場合があり、ARRAYn_STRIDE にはそのパディングを含めたバイト数を設定しなければなりません。設定値とロードアレイの要素の合計サイズが一致しない場合の動作は不定です。レジスタ(0x0205 + n × 3)の ARRAYn_ATTRIB_NUM(n = 0 ~ 11)には、(n + 1)番目のロードアレイの属性数を設定します。複数の頂点属性アレイをインターリーブドアレイとして配置している場合など、1 つのロードアレイに対して複数の頂点属性アレイが含まれる場合があります。(n + 1)番目のロードアレイの属性数に設定されている値は、そのロードアレイに含まれる頂点属性アレイの個数とは一致しません。0 を設定した場合、そのロードアレイは使用されません。
レジスタ 0x0227 の INDEX_ARRAY_OFFSET には、インデックスアレイのバイトオフセットを設定します。レジスタ 0x0227 の INDEX_ARRAY_TYPE には頂点インデックスの型を設定します。glDrawElements()
の引数 type
が GL_UNSIGNED_SHORT
の場合は 1 を、GL_UNSIGNED_BYTE
の場合は 0 を設定します。glDrawArrays()
の場合は常に 1 を設定します。
例 1)インターリーブドアレイの例
struct vertex_t { float position[3]; float color[4]; float texcoord[2]; } vertex[NUM_VERTEX];
上に示した構造体により頂点データを構成した場合、頂点アレイの設定は以下のようになります。
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(struct vertex_t), 0); glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, sizeof(struct vertex_t), 12); glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(struct vertex_t), 28);
この場合、GL 頂点属性 0、1、2 の 3 つが 1 つのロードアレイの要素となります。また、使用されるすべての頂点属性が上記の 3 つと固定頂点属性 1 つであるとした場合、上記の頂点属性 0、1、2 は内部頂点属性 0、1、2 に対応し、固定頂点属性は内部頂点属性 3 に対応します。よって、関連するレジスタ設定は以下のようになります。
0x0201 : 0x000007FB // 内部頂点属性の型は 0:FLOAT_VEC3, 1:FLOAT_VEC4, 2:FLOAT_VEC2
0x0202 : 0x30080000 // 頂点属性数は合計 4、内部頂点属性 3 が固定頂点属性
0x0203 : 0x00000000 // ロードアレイは 1 つのみ使用のため、ベースアドレスに実アドレスを設定
0x0204 : 0x00000210 // ロードアレイ 0 の要素は頂点内部属性 0、1、2
0x0205 : 0x30240000 // ロードアレイ 0 の 1 頂点辺りバイト数は float × 9 で 36 バイト、要素数は 3
0x0206~0x0226 : 0x00000000 // 他のロードアレイは使用しない
例 2)独立アレイの例
#define NUM_VERTEX (3) struct attribute0_t { float position[3]; } attirbute0[NUM_VERTEX]; struct attribute1_t { float color[4]; } attribute1[NUM_VERTEX]; struct attribute2_t { float tex[2]; } attribute2[NUM_VERTEX];
上に示した構造体により頂点データを構成した場合、頂点アレイの設定は以下のようになります。頂点バッファは 1 つのオブジェクトで共有し、順番にデータを配置していると仮定しています。
glBindBuffer(GL_ARRAY_BUFFER, 1); glBufferData(GL_ARRAY_BUFFER, sizeof(attribute0)+sizeof(attribute1)+sizeof(attribute2),0,GL_STATIC_DRAW); glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(attribute0), attribute0); glBufferSubData(GL_ARRAY_BUFFER, sizeof(attribute0), sizeof(attribute1), attribute1); glBufferSubData(GL_ARRAY_BUFFER, sizeof(attribute0)+sizeof(attribute1), sizeof(attribute2), attribute2); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, (GLvoid*)(sizeof(attribute0))); glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, (GLvoid*)(sizeof(attribute0)+sizeof(attribute1)));
この場合、GL 頂点属性 0、1、2 はそれぞれ別のロードアレイの要素となり、それぞれ内部頂点属性 0、1、2 に対応します。よって、関連するレジスタ設定は以下のようになります。
0x0201 : 0x000007FB // 内部頂点属性の型は 0:FLOAT_VEC3, 1:FLOAT_VEC4, 2:FLOAT_VEC2
0x0202 : 0x20000000 // 頂点属性数は合計 3、固定頂点属性はなし
0x0203 : 0x00000000 // ロードアレイ 0 は先頭に配置される
0x0204 : 0x00000000 // ロードアレイ 0 の要素は内部頂点属性 0 の 1 つ
0x0205 : 0x100C0000 // ロードアレイ 0 の 1 頂点辺りバイト数は float × 3 で 12 バイト、要素数は 1
0x0206 : 0x00000024 // ロードアレイ 1 のオフセットは sizeof(attribute0)
0x0207 : 0x00000001 // ロードアレイ 1 の要素は内部頂点属性 1 の 1 つ
0x0208 : 0x10100000 // ロードアレイ 1 の 1 頂点辺りバイト数は float × 4 で 16 バイト、要素数は 1
0x0209 : 0x00000054 // ロードアレイ 2 のオフセットは sizeof(attribute0)+sizeof(attribute1)
0x020A : 0x00000002 // ロードアレイ 2 の要素は内部頂点属性 2 の 1 つ
0x020B : 0x10080000 // ロードアレイ 2 の 1 頂点辺りバイト数は float × 2 で 8 バイト、要素数は 1
0x020C~0x0226 : 0x00000000 // 他のロードアレイは使用しない
ロードアレイのパディング要素と自動パディングについて
レジスタ(0x0204 + n × 3)から(0x0205 + n × 3)の ARRAYn_ELEMi(n = 0 ~ 11、i = 0 ~ 11)に、0xC ~ 0xF を設定した場合の要素はパディングと設定されています。これは、ロードアレイが頂点属性として使用しない領域を含む場合に使用します。
例えば、以下のような構造体の頂点データを作成したとします。
struct vertex_t { float position[3]; float color[4]; float texcoord[2]; } vertex[NUM_VERTEX];
上に示した構造体の texcoord
を頂点属性として使用しない場合を考えます。1 頂点分のサイズは float × 9 ですが、最後の float × 2 は使用しません。この頂点データに対応するロードアレイは、1 番目の要素、2 番目の要素には内部頂点属性を指定しますが、3 番目の要素としては 0xD(8 バイトのパディング)を指定することになります。
1 番目の要素にパディングは指定できません。指定した場合の動作は不定です。ロードアレイのバイトオフセットを調整して、1 番目の要素にパディングが来ないように設定してください。
また、1 つのロードアレイが、複数の異なるデータ型(GL_FLOAT
、GL_SHORT
、GL_BYTE
、GL_UNSIGNED_BYTE
)の頂点属性を要素としている場合、ロードアレイの要素には指定されていなくても 4 バイト未満のパディングが自動で挿入される場合があります。ロードアレイを構成する各要素は、4 バイトの型(要素とする内部頂点属性の型が GL_FLOAT
である、またはパディングである)、2 バイトの型(要素とする内部頂点属性の型が GL_SHORT
である)、1 バイトの型(要素とする内部頂点属性の型が GL_BYTE
、GL_UNSIGNED_BYTE
である)のいずれかです。ロードアレイの各要素は、その要素自身の型のサイズでアライメントされるように自動でパディングが挿入されます。また、そのロードアレイが含む要素のうち、最も大きい型のサイズでアライメントされるように各頂点データの最後に自動でパディングが挿入されます。
例えば、以下のような構造体の頂点データを作成したとします。
struct vertex_t { GLfloat position[3]; GLubyte color[3]; GLfloat texcoord[2]; GLubyte param; } vertex[NUM_VERTEX];
ロードアレイは position
、color
、texcoord
、param
の 4 つの頂点属性を要素とするとして考えます。上記の color
は 3 バイトですが、直後にある GLfloat
型のデータ texcoord
は 4 バイトにアライメントされて配置されます。つまり、color
の直後に 1 バイトのパディングが自動で挿入されることになります。
また、ロードアレイ内で最大サイズの要素は GLfloat
型ですので、4 バイトでアライメントされるように各頂点データの最後に自動でパディングが挿入されます。つまり、param
の直後に 3 バイトのパディングが自動で挿入されることになります。
ロードアレイの設定とパフォーマンス
頂点データのロードのパフォーマンスは、使用するロードアレイの個数やサイズ、含まれている要素の型などに依存します。
GPU はロードアレイ単位でメモリにアクセスしますが、キャッシュが存在しないため、複数のロードアレイが同じアドレスからロードするコストと異なるアドレスからロードするコストは同等です。
頂点シェーダの複数の入力レジスタに同じ頂点アレイをロードする場合、複数のロードアレイで同じアドレスからロードするよりも、データサイズが大きくなるものの、その頂点アレイを複製して作られたインターリーブドアレイからロードする方が実行時のパフォーマンスが高くなる可能性があります。
同じサイズの頂点データをロードする場合でも、1 つのロードアレイでロードした方が、複数のロードアレイでロードするよりもパフォーマンスが高くなります。このパフォーマンスの違いは、頂点インデックスが最適化されていて連続するような状況では小さくなり、ほかのモジュールによるデバイスメモリへのアクセス状況からも影響を受けます。例えば、デバイスメモリへのアクセスの競合を考えずに、同じ 6 個の GLfloat
型の頂点データを 3 個ずつ 2 つのロードアレイでロードすると、1 つのロードアレイでロードする場合の処理時間の 1.3~2 倍程度かかります。ただし、頂点アレイが VRAM に配置されている場合ではパフォーマンスに違いがなくなります。
ロードアレイの制限
glDrawElements()
で描画する(レジスタ 0x022F への書き込みで描画を開始する)場合、使用できるロードアレイは最大 11 個です。頂点属性を 12 個使用し、glDrawElements()
で描画する場合は、少なくとも 1 個の頂点属性を固定頂点属性にする、または少なくとも 2 個の頂点属性をインターリーブドアレイとし、使用するロードアレイが 11 個以下になるようにしてください。ロードアレイを 12 個使用して glDrawElements()
による描画を開始した場合、GPU がハングアップすることがあります。このほかにもロードアレイの設定が適切ではない場合は、GPU がハングアップすることがあります。
ロードアレイの不正な設定が原因でハングアップした場合、nngxGetCmdlistParameteri()
で NN_GX_CMDLIST_HW_STATE
により取得される値は、ビット 8 にのみ 1 がセットされた状態になります。
8.8.1.10. 出力レジスタ使用数設定レジスタ(0x004F, 0x024A, 0x0251, 0x025E)
頂点シェーダから出力される頂点属性数を設定するレジスタは複数あり、一部を除いて同じ値を設定します。
count1(レジスタ 0x004F)には使用する出力レジスタの個数そのままを、count2(レジスタ 0x024A, 0x0251, 0x025E すべて)には(使用する出力レジスタの個数 - 1)をそれぞれ設定します。count1 のみ、値とビット幅が異なる点に注意してください。
出力レジスタの個数とは頂点シェーダアセンブラに #pragma output_map
で定義された個数ですが、使用している出力レジスタの数ですので、複数の頂点属性を 1 つの出力レジスタにパックしている場合は 1 とカウントします。
8.8.1.11. 出力レジスタのマスク設定レジスタ(0x02BD)
頂点シェーダで書き込む出力レジスタのマスクを設定するレジスタには、16 個ある出力レジスタの、どのレジスタに書き込みが行われるかをビットで指定します。
レジスタ 0x02BD のビット [ 15 : 0 ] の各ビットが、出力レジスタの 1 つ 1 つに対応しています。ビット [0] が "o0"、ビット [1] が "o1"、・・・、ビット [15] が "o15" に対応し、#pragma output_map
で定義されている出力レジスタに対応するビットには 1 を書き込みます。定義されていない出力レジスタに対応するビットには 0 を書き込みます。
8.8.1.12. 出力レジスタの属性設定レジスタ(0x0050 ~ 0x0056, 0x0064)
頂点シェーダから頂点属性を出力するのに使用可能な出力レジスタの数は 7 です。出力レジスタの各コンポーネントで出力する属性を設定するレジスタは複数あり、使用する出力レジスタの若い番号から順に設定します。
ビットレイアウト中の名前は以下のように出力属性の設定に対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。
名前 | ビット数 | 説明 |
---|---|---|
attrib_x attrib_y attrib_z attrib_w |
5 |
上から、出力レジスタの x、y、z、w コンポーネントに設定する頂点属性です。 0x00 : 頂点座標の x 成分 |
texcoord | 1 |
頂点シェーダから出力される頂点属性にテクスチャ座標が含まれているかどうかを設定します。 0x0 : テクスチャ座標を出力しない |
例)頂点シェーダで以下のように定義した場合を例に、レジスタに設定する値を説明します。
#pragma output_map(position, o0) #pragma output_map(color, o1) #pragma output_map(texture0, o2.xy) #pragma output_map(texture0w, o2.z) #pragma output_map(texture1, o3.xy)
レジスタは以下のように設定します。
0x0050 : 0x03020100
0x0051 : 0x0B0A0908
0x0052 : 0x1F100D0C // w コンポーネントは無効
0x0053 : 0x1F1F0F0E // zw コンポーネントは無効
0x0054 : 0x1F1F1F1F // 第 5 属性は無効
0x0055 : 0x1F1F1F1F // 第 6 属性は無効
0x0056 : 0x1F1F1F1F // 第 7 属性は無効
0x0064 : 0x00000001 // テクスチャ座標を出力する
8.8.1.13. 出力属性のクロック制御レジスタ(0x006F)
頂点シェーダから出力する頂点属性の種類によって、クロック制御レジスタへの設定値を変更しなければならない場合があります。
ビットレイアウト中の名前は以下のように出力属性のクロック制御設定に対応しています。下表では、それぞれのビットと設定値の対応についても説明しています。
名前 | ビット数 | 説明 |
---|---|---|
vectorZ | 1 | 頂点座標の出力で z 成分を出力する場合は 1、出力しない場合は 0 を設定します。 |
vertexColor | 1 | 頂点カラーを出力する場合は 1、出力しない場合は 0 を設定します。 |
texture0 | 1 | テクスチャ座標 0 を出力する場合は 1、出力しない場合は 0 を設定します。 |
texture1 | 1 | テクスチャ座標 1 を出力する場合は 1、出力しない場合は 0 を設定します。 |
texture2 | 1 | テクスチャ座標 2 を出力する場合は 1、出力しない場合は 0 を設定します。 |
texture0w | 1 | テクスチャ座標 0 の w 成分を出力する場合は 1、出力しない場合は 0 を設定します。 |
viewVector | 1 | ビューベクタ、クォータニオンを出力する場合は 1、出力しない場合は 0 を設定します。 |
ビットに対応する頂点属性の関連モジュールへの電源供給を制御します。使用しない頂点属性に対応するビットに 0 を設定することで、消費電力を軽減することができます。
8.8.2. テクスチャアドレス設定レジスタ(0x0085 ~ 0x008A, 0x0095, 0x009D)
テクスチャデータのアドレスを設定するレジスタには、テクスチャユニット 0 の 2 次元テクスチャやキューブマップテクスチャ、テクスチャユニット 1 と 2 の 2 次元テクスチャについて設定する複数のレジスタがあります。
この項では各種ターゲットにバインドされたテクスチャデータのアドレスについての情報だけを説明します。これらの情報からテクスチャデータの配置を変えることができます。解像度、フィルタモード、ミップマップレベル数などを変更するには「8.8.6. テクスチャ設定レジスタ(0x0080, 0x0083, 0x008B, 0x00A8 ~ 0x00B7 ほか)」を参照してください。
テクスチャデータのアドレス(テクスチャアドレス)はすべて 8 バイトアドレス(物理アドレスを 8 で割った値)で設定します。キューブマップ用の 6 面すべてのテクスチャアドレス(28 ビット)の上位 6 ビットはレジスタ 0x0085 のビット [ 27 : 22 ] を共有します。
テクスチャアドレスのアライメントは 128 バイトである必要があります。正しいアライメントでなければ、GPU がハングアップしたり、描画結果が壊れたりするなどの現象が発生する可能性があります。
8.8.3. レンダーバッファ設定レジスタ(0x006E, 0x0116, 0x0117, 0x011C ~ 0x011E)
レンダーバッファに関連するレジスタ設定には、カラーバッファとデプスバッファの 2 つのバッファについて設定する複数のレジスタがあります。これらのレジスタに対する設定コマンドはステートフラグ NN_GX_STATE_FRAMEBUFFER
のバリデーションで生成されます。
ビットレイアウト中の名前は以下のようにレンダーバッファの設定に対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。
名前 | ビット数 | 説明 |
---|---|---|
COLORBUFFER_FORMAT | 3 |
カラーバッファのフォーマットを設定します。 0x0 : |
COLORBUFFER_PIXEL | 2 |
カラーバッファのフォーマットのピクセルサイズを設定します。 0x0 : 16 ビット |
COLORBUFFER_WIDTH | 11 | カラーバッファの幅のピクセル数を設定します。 |
COLORBUFFER_HEIGHT | 10 | カラーバッファの高さのピクセル数 - 1 を設定します。 |
COLORBUFFER_ADDR | 28 | カラーバッファのアドレスを 8 バイトアドレス(物理アドレスを 8 で割った値)で設定します。 |
DEPTHBUFFER_FORMAT | 2 |
デプスバッファのフォーマットを設定します。 0x0 : |
DEPTHBUFFER_WIDTH | 11 | デプスバッファの幅のピクセル数を設定します。 |
DEPTHBUFFER_HEIGHT | 10 | デプスバッファの高さのピクセル数 - 1 を設定します。 |
DEPTHBUFFER_ADDR | 28 | デプスバッファのアドレスを 8 バイトアドレス(物理アドレスを 8 で割った値)で設定します。 |
レジスタ 0x011E(COLORBUFFER_WIDTH、COLORBUFFER_HEIGHT)に対する設定コマンドは、必ずバイトイネーブルに 0xF を指定してください。
8.8.4. テクスチャコンバイナ設定レジスタ(0x00C0 ~ 0x00C4 ほか)
"dmp_TexEnv[i].
" で始まる、テクスチャコンバイナ設定の予約ユニフォームに値を設定するレジスタは、コンバイナ番号ごとに異なるアドレス(comb_top)を先頭とする複数のレジスタに分かれています。
コンバイナ番号 | 先頭アドレス(comb_top) |
---|---|
0 | 0x00C0 |
1 | 0x00C8 |
2 | 0x00D0 |
3 | 0x00D8 |
4 | 0x00F0 |
5 | 0x00F8 |
ビットレイアウト中の名前は以下のように予約ユニフォームに対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。
名前 | ビット数 | 説明 |
---|---|---|
srcRgb0 srcRgb1 srcRgb2 |
4 |
上から、 0x0 : |
srcAlpha0 srcAlpha1 srcAlpha2 |
4 |
上から、 設定の内容は srcRgb0 ~ srcRgb2 と同じです。 |
operandRgb0 operandRgb1 operandRgb2 |
4 |
上から、 0x0 : |
operandAlpha0 operandAlpha1 operandAlpha2 |
3 |
上から、 0x0 : |
combineRgb | 4 |
0x0 : |
combineAlpha | 4 |
combineRgb の値から |
constRgba0 constRgba1 constRgba2 constRgba3 |
8 |
上から、 0.0 ~ 1.0 の値を 0 ~ 255 にマップしたときの符号なし 8 ビット整数を設定します。 値の変換方法については「8.9.16. 浮動小数点数(0 ~ 1)から符号なし 8 ビット整数への変換」を参照してください。 |
scaleRgb scaleAlpha |
2 |
0x0 : 1.0 |
dmp_TexEnv[i].srcRgb
および dmp_TexEnv[i].srcAlpha
の設定には以下の制限があります。
-
i
が 0 の場合、dmp_TexEnv[i].srcRgb
およびdmp_TexEnv[i].srcAlpha
の各 3 要素に対して、GL_PREVIOUS
とGL_PREVIOUS_BUFFER_DMP
を設定してはいけません。 -
i
が 0 以外の場合、dmp_TexEnv[i].srcRgb
およびdmp_TexEnv[i].srcAlpha
のそれぞれに、各 3 要素のうちの少なくとも 1 つはGL_CONSTANT
、GL_PREVIOUS
、GL_PREVIOUS_BUFFER_DMP
のいずれが設定されなければなりません。
8.8.4.1. コンバイナバッファ設定レジスタ(0x00E0, 0x00FD)
"dmp_TexEnv[i].
" で始まる予約ユニフォームでは、コンバイナバッファに対する設定も行われます。コンバイナバッファの予約ユニフォームに値を設定するレジスタは以下のとおりです。レジスタ 0x00E0 の他のビットはガス設定などで使用されていることに注意してください。
ビットレイアウト中の名前は以下のように予約ユニフォームに対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。
名前 | ビット数 | 説明 |
---|---|---|
bufferColor0 bufferColor1 bufferColor2 bufferColor3 |
4 |
上から、 0.0 ~ 1.0 の値を 0 ~ 255 にマップしたときの符号なし 8 ビット整数を設定します。 値の変換方法については「8.9.16. 浮動小数点数(0 ~ 1)から符号なし 8 ビット整数への変換」を参照してください。 |
bufferInput0 bufferInput1 |
1 * 4 |
上から、 0x0 : |
8.8.5. フラグメントライティング設定レジスタ(0x008F ほか)
フラグメントライティングの予約ユニフォーム(名前に dmp_FragmentLighting
、dmp_FragmentMaterial
、dmp_FragmentLightSource[i]
、dmp_LightEnv
を含む予約ユニフォーム)に関連するレジスタについて説明します。
8.8.5.1. ライティングの有効化・無効化制御レジスタ(0x008F, 0x01C2, 0x01C6, 0x01D9)
ライティングの有効化・無効化を制御する予約ユニフォームに対応するレジスタは以下のとおりです。
ビットレイアウト中の名前は以下のように予約ユニフォームに対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。
名前 | ビット数 | 説明 |
---|---|---|
enabled0 | 1 |
0x0 : |
enabled1 | 1 |
0x0 : ※ 設定する値に注意してください。 |
src_num | 3 |
(有効な光源数 - 1)を設定します。すべての光源が無効である場合には 0 を設定します。 有効な光源数とは、 |
id1 ~ id8 | 3 |
有効な光源の ID を、id1 から設定します。 光源 0、光源 1、光源 3、光源 5 が有効である場合、このレジスタには 0x00005310 を設定(光源の指定順に制限はなく、0x00003150 のような設定も可能です)します。すべての光源が有効である場合は 0x76543210 を設定します。すべての光源が無効である場合は 0x00000000 を設定します。 同じ光源を複数回指定した場合は、その光源のライティング結果が複数回適用されます。光源 0 を複数回指定した場合は、ライティング結果に加えて、プライマリーカラーのグローバルアンビエントも複数回適用されます。 |
8.8.5.2. グローバルアンビエント設定レジスタ(0x01C0)
グローバルアンビエントの設定は、レジスタ 0x01C0 のそれぞれのビットに RGB の各成分の値を設定することで行いますが、設定する値は以下の計算結果を 0.0 ~ 1.0 の範囲にクランプし、その値を 0 ~ 255 にマップしたときの符号なし 8 ビット整数となっています。値の変換方法については「8.9.16. 浮動小数点数(0 ~ 1)から符号なし 8 ビット整数への変換」を参照してください。光源番号 0 の光源が有効になっていない場合は、このレジスタの設定は無効となり、プライマリカラーのグローバルアンビエントの項には 0 が適用されます。
dmp_FragmentMaterial.emission + dmp_FragmentMaterial.ambient × dmp_FragmentLighing.ambient
例)
マテリアルの放射光と環境光がそれぞれ(0.8, 0.8, 0.8, 0.6)と(0.2, 0.2, 0.2, 0.4)、グローバルの環境光が(1.0, 1.0, 1.0, 1.0)であるとき、各成分に設定する値は以下の計算結果を変換したものなので、143(0x8F)となります。
(0.8 × 0.6) + (0.2 × 0.4) × (1.0 × 1.0) = 0.56
設定するレジスタのビットレイアウトは以下のようになっています。各成分に対して 10 ビット幅(図では実際に値を設定する 8 ビット幅で示しています)が用意されていますが、計算結果は下位 8 ビットに格納し、上位 2 ビットには 0 を格納してください。上位 2 ビットに 0 以外の値を設定したときの動作は不定です。
ライティングが有効(dmp_FragmentLighting.enabled
に GL_TRUE
が設定されている)、かつすべての光源が無効(dmp_FragmentLightSource[i].enabled
に GL_FALSE
が設定されている)の場合、プライマリカラーにはグローバルアンビエントのみが適用されます。
有効な光源数についての設定を行うレジスタ 0x01C2 のビット [ 2 : 0 ] には(光源数 - 1)を設定するため、ライティングを有効にすると必ず 1 つの光源が有効になってしまいます。そのため、ドライバはこのような場合に、光源 0 の各項原色を黒(0.0, 0.0, 0.0, 0.0)に設定するコマンド(レジスタ 0x0140~0x0143 に 0 を設定)を生成します。また、光源 0 が有効となるように、1 個目の有効な光源を光源 0 に設定するコマンド(レジスタ 0x01D9 のビット [ 2 : 0 ] に 0x0 を設定)と、dmp_LightEnv.config
に GL_LIGHT_ENV_LAYER_CONFIG0_DMP
を設定するコマンド(レジスタ 0x01C3 のビット [ 7 : 4 ]に 0x0 を設定)を生成します。
8.8.5.3. 光源設定レジスタ(0x0140 ~ 0x01BF, 0x01C4)
光源ごとの設定はすべて光源番号を元に設定を行います。設定を行うレジスタは(light_top = 0x0140 + 光源番号×0x10)を先頭とする複数のレジスタです。例えば、光源 0 と光源 3 に対する光源色の設定では、dmp_FragmentLightSource[0].specular0
と dmp_FragmentLightSource[3].specular0
の設定はそれぞれ、レジスタ 0x0140 と 0x0170 に対して行います。
光源色設定レジスタ(0x0140 ~ 0x0143 ほか)
光源色の設定は、先頭レジスタ(light_top)から順番に、鏡面光 0(LightSpecular0)、鏡面光 1(LightSpecular1)、拡散光(LightDiffuse)、環境光(LightAmbient)の RGB 各成分の値を、各レジスタのビットに設定することで行いますが、設定する値は以下の計算結果を 0.0 ~ 1.0 の範囲にクランプし、その値を 0 ~ 255 にマップしたときの符号なし 8 ビット整数となっています。値の変換方法については「8.9.16. 浮動小数点数(0 ~ 1)から符号なし 8 ビット整数への変換」を参照してください。
LightSpecular0 = dmp_FragmentMaterial.specular0 × dmp_FragmentLightSource[i].specular0
dmp_LightEnv.lutEnabledRefl が GL_FALSE
のとき
LightSpecular1 = dmp_FragmentMaterial.specular1 × dmp_FragmentLightSource[i].specular1
dmp_LightEnv.lutEnabledRefl が GL_TRUE
のとき
LightSpecular1 = dmp_FragmentLightSource[i].specular1
LightDiffuse = dmp_FragmentMaterial.diffuse × dmp_FragmentLightSource[i].diffuse
LightAmbient = dmp_FragmentMaterial.ambient × dmp_FragmentLightSource[i].ambient
設定するレジスタのビットレイアウトは以下のようになっています。
光源位置設定レジスタ(0x0144, 0x0145, 0x0149 ほか)
予約ユニフォーム dmp_FragmentLightSource[i].position
で設定する光源位置の座標値のうち、xyz 成分については値を 16 ビット浮動小数点数に変換してレジスタに設定します。値の変換方法については「8.9.2. 16 ビット浮動小数点数への変換」を参照してください。w 成分については、光源が点光源か平行光源かをレジスタ(light_top + 9)のビット [ 0 : 0 ] に設定します。w 成分の値が 0.0 であれば 1 を、それ以外ならば 0 を設定することに注意してください。また、このレジスタのほかのビットには別の設定が行われることにも注意してください。
設定するレジスタのビットレイアウトは以下のようになっています。
スポットライト方向設定レジスタ(0x0146, 0x0147 ほか)
予約ユニフォーム dmp_FragmentLightSource[i].spotDirection
で設定するスポットライト方向の座標値(xyz 成分)を、符号を反転させてから 小数部 11 ビットの符号つき 13 ビット固定小数点数(負の値は 2 の補数表現)に変換してレジスタに設定します。値の変換方法については「8.9.9. 小数部 11 ビットの符号つき 13 ビット固定小数点数への変換」を参照してください。
設定するレジスタのビットレイアウトは以下のようになっています。
距離減衰設定レジスタ(0x014A, 0x014B ほか)
距離減衰の予約ユニフォーム dmp_FragmentLightSource[i].distanceAttenuationBias
と dmp_FragmentLightSource[i].distanceAttenuationScale
で設定する距離減衰のバイアスとスケールを、20 ビット浮動小数点数に変換してレジスタに設定します。値の変換方法については「8.9.4. 20 ビット浮動小数点数への変換」を参照してください。
設定するレジスタのビットレイアウトは以下のようになっています。
そのほかの設定レジスタ(0x01C4, 0x0149 ほか)
光源ごとで設定する、そのほかの設定に対応するレジスタは以下のとおりです。
名前・レジスタ | ビット数 | 説明 |
---|---|---|
|
1 |
※ 設定する値に注意してください。 |
|
1 |
※ 設定する値に注意してください。 |
|
1 |
※ 設定する値に注意してください。 |
|
1 |
|
|
1 |
|
|
1 |
|
8.8.5.4. 参照テーブル設定レジスタ(0x01C5, 0x01C8 ~ 0x01CF)
予約ユニフォーム dmp_FragmentMaterial.sampler{ RR, RG, RB, D0, D1, FR }
と dmp_FragmentLightSource[i].sampler{ SP, DA }
で指定されるフラグメントライティングの参照テーブルは、256 個のデータと同数の差分値によって設定されます。
設定に使用するレジスタのビットレイアウトは以下のようになっています。
レジスタ 0x01C5 には、対象とする参照テーブルを Ref_Table に、設定開始インデックスを Ref_Index に設定します。インデックスは 0 が最初のデータ、255 が最後のデータです。Ref_Table に設定する値と参照テーブルの対応は以下のようになっています。
Ref_Table | 対象の参照テーブル |
---|---|
0x0 | ディストリビューションファクタ 0(D0) |
0x1 | ディストリビューションファクタ 1(D1) |
0x3 | フレネルファクタ(FR) |
0x4 | 反射の青成分(RB) |
0x5 | 反射の緑成分(RG) |
0x6 | 反射の赤成分(RR) |
0x8 + i | スポットライト(SP)※ i は光源番号 |
0x10 + i | ライトの距離減衰(DA)※ i は光源番号 |
レジスタ 0x01C8 ~ 0x01CF には、glTexImage1D()
でロードする参照テーブルの i 番目のデータと i + 256 番目に設定した差分値を組み合わせた値を書き込みます。Ref_Value にはデータを小数部 12 ビットの符号なし 12 ビット固定小数点数に変換した値を、Ref_Difference には差分値を小数部 11 ビットの符号つき 12 ビット固定小数点数(小数部は絶対値のため、負の値は 2 の補数表現ではありません)に変換した値を、それぞれ設定してください。値の変換方法については「8.9.13. 小数部 12 ビットの符号なし 12 ビット固定小数点数への変換」と「8.9.6. 小数部 11 ビットの符号つき 12 ビット固定小数点数への変換」を参照してください。
対象とする参照テーブルとインデックスをレジスタ 0x01C5 に設定してから、0x01C8 ~ 0x01CF のいずれかのレジスタに変換した値の組み合わせを書き込みます。いずれのレジスタに書き込んでも処理結果は変わらず、1 つデータを書き込むごとにインデックスが 1 インクリメントされます。
8.8.5.5. 参照テーブルの引数範囲設定レジスタ(0x01D0)
参照テーブルの引数の範囲設定に対応するレジスタは以下のとおりです。
名前・レジスタ | ビット数 | 説明 |
---|---|---|
absLutInputD0
0x01D0 のビット [ 1 : 1 ] |
1 |
dmp_LightEnv.absLutInputD0 に設定する値です。0x0 : GL_TRUE 0x1 : GL_FALSE ※ 設定する値に注意してください。 |
absLutInputD1 0x01D0 のビット [ 5 : 5 ] |
1 |
dmp_LightEnv.absLutInputD1 に設定する値です。0x0 : GL_TRUE 0x1 : GL_FALSE ※ 設定する値に注意してください。 |
absLutInputSP 0x01D0 のビット [ 9 : 9 ] |
1 |
dmp_LightEnv.absLutInputSP に設定する値です。0x0 : GL_TRUE 0x1 : GL_FALSE ※ 設定する値に注意してください。 |
absLutInputFR 0x01D0 のビット [ 13 : 13 ] |
1 |
dmp_LightEnv.absLutInputFR に設定する値です。0x0 : GL_TRUE 0x1 : GL_FALSE ※ 設定する値に注意してください。 |
absLutInputRB 0x01D0 のビット [ 17 : 17 ] |
1 |
dmp_LightEnv.absLutInputRB に設定する値です。0x0 : GL_TRUE 0x1 : GL_FALSE ※ 設定する値に注意してください。 |
absLutInputRG 0x01D0 のビット [ 21 : 21 ] |
1 |
dmp_LightEnv.absLutInputRG に設定する値です。0x0 : GL_TRUE 0x1 : GL_FALSE ※ 設定する値に注意してください。 |
absLutInputRR 0x01D0 のビット [ 25 : 25 ] |
1 |
dmp_LightEnv.absLutInputRR に設定する値です。0x0 : GL_TRUE 0x1 : GL_FALSE ※ 設定する値に注意してください。 |
8.8.5.6. 参照テーブルの入力値設定レジスタ(0x01D1)
参照テーブルの入力値設定に対応するレジスタは以下のとおりです。
名前・レジスタ | ビット数 | 説明 |
---|---|---|
lutInputD0
0x01D1 のビット [ 2 : 0 ] |
3 |
dmp_LightEnv.lutInputD0 に設定する値です。0x0 : GL_LIGHT_ENV_NH_DMP 0x1 : GL_LIGHT_ENV_VH_DMP 0x2 : GL_LIGHT_ENV_NV_DMP 0x3 : GL_LIGHT_ENV_LN_DMP 0x4 : GL_LIGHT_ENV_SP_DMP 0x5 : GL_LIGHT_ENV_CP_DMP |
lutInputD1
0x01D1 のビット [ 6 : 4 ] |
3 |
dmp_LightEnv.lutInputD1 に設定する値です。説明は lutInputD0 と同じです。 |
lutInputSP
0x01D1 のビット [ 10 : 8 ] |
3 |
dmp_LightEnv.lutInputSP に設定する値です。説明は lutInputD0 と同じです。 |
lutInputFR
0x01D1 のビット [ 14 : 12 ] |
3 |
dmp_LightEnv.lutInputFR に設定する値です。0x0 : GL_LIGHT_ENV_NH_DMP 0x1 : GL_LIGHT_ENV_VH_DMP 0x2 : GL_LIGHT_ENV_NV_DMP 0x3 : GL_LIGHT_ENV_LN_DMP |
lutInputRB
0x01D1 のビット [ 18 : 16 ] |
3 |
dmp_LightEnv.lutInputRB に設定する値です。説明は lutInputFR と同じです。 |
lutInputRG
0x01D1 のビット [ 22 : 20 ] |
3 |
dmp_LightEnv.lutInputRG に設定する値です。説明は lutInputFR と同じです。 |
lutInputRR
0x01D1 のビット [ 26 : 24 ] |
3 |
dmp_LightEnv.lutInputRR に設定する値です。説明は lutInputFR と同じです。 |
8.8.5.7. 参照テーブルの出力値に対するスケール値設定レジスタ(0x01D2)
参照テーブルの出力値に対するスケール値設定に対応するレジスタは以下のとおりです。
名前・レジスタ | ビット数 | 説明 |
---|---|---|
lutScaleD0
0x01D2 のビット [ 2 : 0 ] |
3 |
dmp_LightEnv.lutScaleD0 に設定する値です。0x0 : 1.0 0x1 : 2.0 0x2 : 4.0 0x3 : 8.0 0x6 : 0.25 0x7 : 0.5 |
lutScaleD1
0x01D2 のビット [ 6 : 4 ] |
3 |
dmp_LightEnv.lutScaleD1 に設定する値です。説明は lutScaleD0 と同じです。 |
lutScaleSP
0x01D2 のビット [ 10 : 8 ] |
3 |
dmp_LightEnv.lutScaleSP に設定する値です。説明は lutScaleD0 と同じです。 |
lutScaleFR
0x01D2 のビット [ 14 : 12 ] |
3 |
dmp_LightEnv.lutScaleFR に設定する値です。説明は lutScaleD0 と同じです。 |
lutScaleRB
0x01D2 のビット [ 18 : 16 ] |
3 |
dmp_LightEnv.lutScaleRB に設定する値です。説明は lutScaleD0 と同じです。 |
lutScaleRG
0x01D2 のビット [ 22 : 20 ] |
3 |
dmp_LightEnv.lutScaleRG に設定する値です。説明は lutScaleD0 と同じです。 |
lutScaleRR
0x01D2 のビット [ 26 : 24 ] |
3 |
dmp_LightEnv.lutScaleRR に設定する値です。説明は lutScaleD0 と同じです。 |
8.8.5.8. シャドウ減衰設定レジスタ(0x01C3)
シャドウ減衰設定に対応するレジスタは以下のとおりです。このレジスタのほかのビットには別の設定が行われることに注意してください。
ビットレイアウト中の名前は以下のように予約ユニフォームに対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。
名前 | ビット数 | 説明 |
---|---|---|
shadowSelector | 2 |
0x0 : |
shadowPrimary | 1 |
0x0 : |
shadowSecondary | 1 |
0x0 : |
invertShadow | 1 |
0x0 : |
shadowAlpha | 1 |
0x0 : |
shadowAttn | 1 |
|
8.8.5.9. そのほかの設定レジスタ(0x01C3, 0x01C4)
フラグメントライティングで設定する、そのほかの設定に対応するレジスタは以下のとおりです。このレジスタのほかのビットには別の設定が行われることに注意してください。
ビットレイアウト中の名前は以下のように予約ユニフォームに対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。
名前 | ビット数 | 説明 |
---|---|---|
config | 4 |
0x0 : |
fresnelSelector | 2 |
0x0 : |
enabledFresnelSelector | 1 |
0x0 : |
bumpSelector | 2 |
0x0 : |
bumpMode | 2 |
0x0 : |
bumpRenorm | 1 |
0x0 : |
clampHighlights | 1 |
0x0 : |
lutEnabledD0 | 1 |
0x0 : ※ 設定する値に注意してください。 |
lutEnabledD1 | 1 |
0x0 : ※ 設定する値に注意してください。 |
lutEnabledRefl | 3 |
0x0 : ※ 設定する値に注意してください。 |
※ config(レジスタ 0x01C3 のビット [ 7 : 4 ])の設定値により、ピクセル処理のサイクル数が変化します。ライティングが無効の場合でもその設定は影響しますので、ライティングがオフの場合は config の設定をサイクル数 1 の設定に変更するようにしてください。ドライバはライティングが無効の場合に、レジスタ 0x01C3 のビット [ 7 : 4 ] に 0x0 を設定します。また、設定値が(8:GL_LIGHT_ENV_LAYER_CONFIG7_DMP
)の場合は距離減衰が使用できなくなります。距離減衰の設定が有効のままだと不正な値が距離減衰項に適用されてしまいますので、レジスタ 0x01C4 のビット [ 31 : 24 ] に 0xFF を設定して、距離減衰を無効にしてください。
8.8.6. テクスチャ設定レジスタ(0x0080, 0x0083, 0x008B, 0x00A8 ~ 0x00B7 ほか)
テクスチャ設定の予約ユニフォーム(名前に dmp_Texture[i]
を含む予約ユニフォーム)に関連するレジスタについて説明します。これらのレジスタに対する設定コマンドはステートフラグ NN_GX_STATE_TEXTURE
のバリデーションで生成されます。また、「8.8.2. テクスチャアドレス設定レジスタ(0x0085 ~ 0x008A, 0x0095, 0x009D)」も併せて参照してください。
8.8.6.1. シャドウテクスチャ設定レジスタ(0x008B)
シャドウテクスチャ設定に対応するレジスタは以下のとおりです。
ビットレイアウト中の名前は以下のように予約ユニフォームに対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。
名前 | ビット数 | 説明 |
---|---|---|
perspectiveShadow | 1 |
0x0 : ※ 設定する値に注意してください。 |
shadowZBias | 23 |
24 ビット固定小数点数に変換した値の上位 23 ビットを使用します。値の変換方法については「8.9.14. 小数部 24 ビットの符号なし 24 ビット固定小数点数への変換」を参照してください。 |
8.8.6.2. テクスチャサンプラータイプ設定レジスタ(0x0080, 0x0083)
テクスチャのサンプラータイプ設定に対応するレジスタは以下のとおりです。これらのレジスタのほかのビットには別の設定が行われることに注意してください。
ビットレイアウト中の名前は以下のように予約ユニフォームに対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。
名前 | ビット数 | 説明 |
---|---|---|
samplerType0 | 1 + 3 |
0x0 : |
samplerType1 | 1 |
0x0 : |
samplerType2 | 1 |
0x0 : |
samplerType3 | 1 |
0x0 : |
dmp_Texture[0].samplerType
、dmp_Texture[1].samplerType
、dmp_Texture[2].samplerType
の設定はステートフラグ NN_GX_STATE_FSUNIFORM
ではなく、glDrawElements()
または glDrawArrays()
の呼び出し時に生成されることに注意してください。
レジスタ 0x0080 のビット [ 16 : 16 ] に 1 を書き込むことで、テクスチャのすべてのキャッシュ(1 次、2 次の両方)がクリアされます。その際、レジスタ 0x0080 のビット [ 23 : 17 ] には、すべて 0 を書き込んでください。テクスチャキャッシュのクリアはテクスチャユニットの設定が変更されたときに必要になります。テクスチャユニットごとに搭載されているテクスチャの 1 次キャッシュをクリアする場合は、あらかじめテクスチャユニットが有効になっていなければなりません。テクスチャユニットを有効にするには、テクスチャユニットのサンプラータイプを GL_FALSE
以外に設定してください。
テクスチャキャッシュのクリアコマンドより前に、テクスチャユニットを有効にするコマンドが別に必要です。テクスチャキャッシュのクリアがテクスチャユニットの有効・無効の設定と同じレジスタにあるため、テクスチャユニットを無効から有効にするビット書き込みとテクスチャキャッシュをクリアするビット書き込みを 1 つのコマンドで行うと、テクスチャキャッシュのクリアが正しく行われません。ただし、有効から無効にするビット書き込みとテクスチャキャッシュをクリアするビット書き込みを 1 つのコマンドで行った場合はテクスチャキャッシュのクリアが正常に行われます。
レジスタ 0x0080 のほかのビットを設定するコマンドで、テクスチャキャッシュをクリアする必要がないときは、バイトイネーブルに 0xB を設定してビット [ 23 : 16 ] にはアクセスしないでください。
テクスチャキャッシュのクリアが必要となるのは、テクスチャアドレスを設定するレジスタ(0x0085、0x0086、0x0087、0x0088、0x0089、0x008A、0x0095、0x009D)が変更された場合と、テクスチャデータがリロードされた場合です。また、テクスチャのアドレスやデータの内容に変更がなくても、フォーマットだけが変更された場合にもキャッシュのクリアが必要となります。
8.8.6.3. テクスチャ座標の選択設定レジスタ(0x0080)
テクスチャユニットに入力されるテクスチャ座標の選択設定に対応するレジスタは以下のとおりです。このレジスタのほかのビットには別の設定が行われることに注意してください。
ビットレイアウト中の名前は以下のように予約ユニフォームに対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。
名前 | ビット数 | 説明 |
---|---|---|
texcoord2 | 1 |
0x0 : |
texcoord3 | 2 |
0x0 : |
8.8.6.4. プロシージャルテクスチャ設定レジスタ(0x00A8 ~ 0x00AD)
プロシージャルテクスチャ設定の予約ユニフォームに値を設定するレジスタのビットレイアウトは以下のようになっています。
ビットレイアウト中の名前は以下のように予約ユニフォームに対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。
名前 | ビット数 | 説明 |
---|---|---|
ptRgbMap ptAlphaMap |
4 |
上から、 0x0 : |
ptAlphaSeparate | 1 |
0x0 : |
ptClampU ptClampV |
3 |
上から、 0x0 : |
ptShiftU ptShiftV |
2 |
上から、 0x0 : |
ptMinFilter | 3 |
0x0 : |
ptTexOffset ptTexWidth |
8 | 上から、dmp_Texture[3].ptTexOffset 、dmp_Texture[3].ptTexWidth に設定する値です。ユニフォームで設定した値そのままです。 |
ptTexBias_high ptTexBias_low |
8 |
dmp_Texture[3].ptTexBias に設定する値ですが、16 ビットの浮動小数点数に変換したものを、上位と下位 8 ビットずつに分割して設定します。値の変換方法については「8.9.2. 16 ビット浮動小数点数への変換」を参照してください。 |
ptNoiseEnable | 1 |
0x0 : |
ptNoiseU (F-parameter) ptNoiseU (P-parameter) ptNoiseU (A-parameter) |
16 |
上から、 第 1 と第 2 要素はユニフォームの値を 16 ビット浮動小数点数に変換した値です。値の変換方法については「8.9.2. 16 ビット浮動小数点数への変換」を参照してください。 第 3 要素はユニフォームの値を小数部 12 ビットの符号つき 16 ビット固定小数点数(負の値は 2 の補数表現)に変換した値です。値の変換方法については「8.9.10. 小数部 12 ビットの符号つき 16 ビット固定小数点数への変換」を参照してください。 |
ptNoiseV (F-parameter) ptNoiseV (P-parameter) ptNoiseV (A-parameter) |
16 |
上から、 第 1 と第 2 要素はユニフォームの値を 16 ビット浮動小数点数に変換した値です。値の変換方法については「8.9.2. 16 ビット浮動小数点数への変換」を参照してください。 第 3 要素はユニフォームの値を小数部 12 ビットの符号つき 16 ビット固定小数点数(負の値は 2 の補数表現)に変換した値です。値の変換方法については「8.9.10. 小数部 12 ビットの符号つき 16 ビット固定小数点数への変換」を参照してください。 |
8.8.6.5. プロシージャルテクスチャの参照テーブル設定レジスタ(0x00AF, 0x00B0 ~ 0x00B7)
予約ユニフォーム dmp_Texture[3].ptSampler{ RgbMap, AlphaMap, NoiseMap, R, G, B, A }
で指定されるプロシージャルテクスチャの参照テーブルは、RgbMap
、AlphaMap
、NoiseMap
が 128 個のデータと同数の差分値によって設定され、R、G、B、A が 256 個のデータと同数の差分値によって設定されます。
設定に使用するレジスタはデータの個数にかかわらず同じで、そのビットレイアウトは以下のようになっています。
レジスタ 0x00AF には、対象とする参照テーブルを Proc_Table に、設定開始インデックスを Proc_Index に設定します。0 が最初のデータです。Proc_Table に設定する値と参照テーブルの対応は以下のようになっています。設定する値(3 ビット)に対して 4 ビット幅が用意されていますが、ビット [ 11 : 11 ] に 0 を設定しなければ正しい参照テーブルが設定されません。
Proc_Table | 対象の参照テーブル |
---|---|
0x0 | ノイズ変調テーブル(NoiseMap ) |
0x2 | RGB マッピングの F 関数(RgbMap ) |
0x3 | アルファマッピングの F 関数(AlphaMap ) |
0x4 | カラー参照テーブルのカラー値(R, G, B, A) |
0x5 | カラー参照テーブルの差分値(R, G, B, A) |
それぞれの参照テーブルへ値を設定するレジスタは同じですが、カラー参照テーブルとそのほかの参照テーブルでビットレイアウトが異なります。
対象とする参照テーブルとインデックスをレジスタ 0x00AF に設定してから、0x00B0 ~ 0x00B7 のいずれかのレジスタにデータを書き込みます。いずれのレジスタに書き込んでも処理結果は変わらず、1 つデータを書き込むごとにインデックスが 1 インクリメントされるのは、どの参照テーブルでも同じです。また、レジスタ 0x0080 のビット [ 10 : 10 ](samplerType3)に 0x1(プロシージャルテクスチャ)を設定していなければ、レジスタ 0x00B0 ~ 0x00B7 への書き込みは無視されます。
ノイズ変調テーブル、RGB マッピングの F 関数、アルファマッピングの F 関数
レジスタ 0x00B0 ~ 0x00B7 には、glTexImage1D()
でロードする参照テーブルの i 番目のデータと i + 128 番目に設定した差分値を組み合わせた値を書き込みます。Proc_Value にはデータを小数部 12 ビットの符号なし 12 ビット固定小数点数に変換した値を、Proc_Difference には差分値を小数部 11 ビットの符号つき 12 ビット固定小数点数(負の値は 2 の補数表現)に変換した値を、それぞれ設定してください。値の変換方法については「8.9.13. 小数部 12 ビットの符号なし 12 ビット固定小数点数への変換」と「8.9.7. 小数部 11 ビットの符号つき 12 ビット固定小数点数への変換 2」を参照してください。データの個数は 128 個ですので、Proc_Index には 0 ~ 127 を指定することができます。
カラー参照テーブル
カラー値と差分値でレジスタに書き込む値のフォーマットが異なります。
カラー値は、glTexImage1D()
でロードする RGBA それぞれの参照テーブルの i 番目のデータをパックした値を書き込みます。書き込む値は、成分ごとに 0.0 ~ 1.0 の範囲を 0 ~ 255 にマップしたときの符号なし 8 ビット整数に変換(変換方法については「8.9.16. 浮動小数点数(0 ~ 1)から符号なし 8 ビット整数への変換」を参照)し、R 成分を Proc_R、G 成分を Proc_G、B 成分を Proc_B、A 成分を Proc_A にそれぞれ設定したものです。
差分値は、glTexImage1D()
でロードする RGBA それぞれの参照テーブルの i + 256 番目のデータをパックした値を書き込みます。書き込む値は、成分ごとに小数部 7 ビットの符号つき 8 ビット固定小数点数(負の値は 2 の補数表現)に変換(変換方法については「8.9.5. 小数部 7 ビットの符号つき 8 ビット固定小数点数への変換」を参照)し、R 成分を Proc_R、G 成分を Proc_G、B 成分を Proc_B、A 成分を Proc_A にそれぞれ設定したものです。データの個数は 256 個ですので、Proc_Index には 0 ~ 255 を指定することができます。
8.8.6.6. テクスチャ解像度設定レジスタ(0x0082, 0x0092, 0x009A)
テクスチャユニット 0 ~ 2 それぞれにロードされているテクスチャの解像度を設定するレジスタは以下のとおりです。
TEXTUREnWIDTH と TEXTUREn_HEIGHT には、それぞれテクスチャユニット n(n = 0 ~ 2)にロードされているテクスチャの幅と高さが設定されます。テクスチャユニット 0 の設定がレジスタ 0x0082 に対して、テクスチャユニット 1 の設定がレジスタ 0x0092 に対して、テクスチャユニット 2 の設定がレジスタ 0x009A に対してそれぞれ行われます。
8.8.6.7. テクスチャフォーマット設定レジスタ(0x0083, 0x008E, 0x0093, 0x0096, 0x009B, 0x009E)
テクスチャユニット 0 ~ 2 それぞれにロードされているテクスチャのフォーマットを設定するレジスタは以下のとおりです。
ビットレイアウト中の名前は以下のようにテクスチャのフォーマット設定に対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。テクスチャユニット 0 の設定がレジスタ 0x0083 と 0x008E に対して、テクスチャユニット 1 の設定がレジスタ 0x0093 と 0x0096 に対して、テクスチャユニット 2 の設定がレジスタ 0x009B と 0x009E に対してそれぞれ行われます。下表にない名前はほかの設定で使用するビットです。
名前 | ビット数 | 説明 |
---|---|---|
TEXTUREn_FORMAT_ETC1 | 2 |
テクスチャユニット n(n = 0 ~ 2)にロードされているテクスチャのフォーマットが 0x00 : |
TEXTURE0_SHADOW_FLAG | 1 |
テクスチャユニット 0 にロードされているテクスチャのフォーマットが 0x0 : |
TEXTUREn_FORMAT | 4 |
テクスチャユニット n(n = 0 ~ 2)に対する 0x0 : ※ ネイティブフォーマットは、上記の対応する非ネイティブフォーマットと同じ設定値を使用します。 ※ |
8.8.6.8. テクスチャパラメータ設定レジスタ(0x0081, 0x0083, 0x0084 ほか)
ラッピングモードやフィルタなど、テクスチャユニット 0 ~ 2 のテクスチャパラメータを設定するレジスタは以下のとおりです。
ビットレイアウト中の名前は以下のようにそれぞれの設定に対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。テクスチャユニット 0 の設定はレジスタ 0x0081、0x0083、0x0084 に対して、テクスチャユニット 1 の設定はレジスタ 0x0091、0x0093、0x0094 に対して、テクスチャユニット 2 の設定はレジスタ 0x0099、0x009B、0x009C に対してそれぞれ行います。下表にない名前はほかの設定で使用するビットです。
名前 | ビット数 | 説明 |
---|---|---|
TEXTUREn_BORDER_RED TEXTUREn_BORDER_GREEN TEXTUREn_BORDER_BLUE TEXTUREn_BORDER_ALPHA |
8 |
テクスチャユニット n(n = 0 ~ 2)のテクスチャボーダーカラー( 成分ごとに 0.0 ~ 1.0 の範囲を 0 ~ 255 にマップしたときの符号なし 8 ビット整数に変換した値を設定します。値の変換方法については「8.9.17. 浮動小数点数(0 ~ 1)から符号なし 8 ビット整数への変換 2」を参照してください。 |
TEXTUREn_MAG_FILTER | 1 |
テクスチャユニット n(n = 0 ~ 2)のテクスチャ拡大時のフィルタ設定( 0x0 : |
TEXTUREn_MIN_FILTER1 TEXTUREn_MIN_FILTER2 |
1 |
テクスチャユニット n(n = 0 ~ 2)のテクスチャ縮小時のフィルタ設定( 2 つのビットの組み合わせ(FILTER1, FILTER2)は以下のとおりです。同じ組み合わせに複数のフィルタ設定がある場合は、最小・最大 LOD レベルの設定により決定されます。 (0x0, 0x0) : |
TEXTUREn_WRAP_S TEXTUREn_WRAP_T |
3 |
テクスチャユニット n(n = 0 ~ 2)のラッピングモード設定( 0x0 : |
TEXTUREn_MIN_LOD | 4 |
テクスチャユニット n(n = 0 ~ 2)の最小 LOD レベルの設定( 縮小時のフィルタ設定が |
TEXTUREn_MAX_LOD | 4 |
テクスチャユニット n(n = 0 ~ 2)の最大 LOD レベルの設定です。 縮小時のフィルタ設定が |
TEXTUREn_LOD_BIAS | 13 |
テクスチャユニット n(n = 0 ~ 2)の LOD バイアス値( 設定値を小数部が 8 ビットの符号つき 13 ビット固定小数点数(負の値は 2 の補数表現)に変換した値が設定されます。値の変換方法については「8.9.8. 小数部 8 ビットの符号つき 13 ビット固定小数点数への変換」を参照してください。 |
8.8.6.9. シャドウテクスチャ、ガステクスチャを使用する場合の設定
シャドウテクスチャ(GL_SHADOW_DMP
または GL_SHADOW_NATIVE_DMP
)を使用する場合は、GL_TEXTURE_WRAP_S
と GL_TEXTURE_WRAP_T
には 2D テクスチャならば GL_CLAMP_TO_BORDER
を、キューブマップテクスチャならば GL_CLAMP_TO_EDGE
を設定します。2D テクスチャ、キューブマップテクスチャに関係なく、GL_TEXTURE_MAG_FILTER
と GL_TEXTURE_MIN_FILTER
には GL_LINEAR
を、レジスタ 0x0083 のビット [ 20 : 20 ](TEXTURE0_SHADOW_FLAG
)には 1 を設定します。このビットはシャドウテクスチャ以外のフォーマットであるときには 0 を設定します。なお、シャドウテクスチャにはミップマップを適用することができません。
ガステクスチャ(GL_GAS_DMP
または GL_GAS_NATIVE_DMP
)を使用する場合は、GL_TEXTURE_WRAP_S
と GL_TEXTURE_WRAP_T
には GL_CLAMP_TO_EDGE
を、GL_TEXTURE_MAG_FILTER
と GL_TEXTURE_MIN_ FILTER
には GL_NEAREST
を設定します。なお、ガステクスチャにはミップマップを適用することができません。
8.8.7. ガス設定レジスタ(0x00E0, 0x00E4, 0x00E5, 0x0120 ~ 0x0126)
ガス設定の予約ユニフォーム(名前に dmp_Gas
を含む予約ユニフォーム)に関連するレジスタについて説明します。
8.8.7.1. ガス制御設定レジスタ(0x00E0, 0x00E4, 0x00E5, 0x0120 ~ 0x0122, 0x0125, 0x0126)
ガスの制御設定に対応するレジスタは以下のとおりです。レジスタ 0x00E0 の他のビットはフォグ設定などで使用されていることに注意してください。
ビットレイアウト中の名前は以下のように予約ユニフォームに対応しています。下表では、それぞれのビットと設定値の対応についても説明しています。
名前 | ビット数 | 説明 |
---|---|---|
lightXY (lightMin) lightXY (lightMax) lightXY (lightAtt) |
8 |
上から、 どの要素も、ユニフォームの値(0.0 ~ 1.0)を 0 ~ 255 にマップしたときの符号なし 8 ビット整数に変換した値です。値の変換方法については「8.9.16. 浮動小数点数(0 ~ 1)から符号なし 8 ビット整数への変換」を参照してください。 |
lightZ (scattMin) lightZ (scattMax) lightZ (scattAtt) lightZ (LZ) |
8 |
上から、 どの要素も、ユニフォームの値(0.0 ~ 1.0)を 0 ~ 255 にマップしたときの符号なし 8 ビット整数に変換した値です。値の変換方法については「8.9.16. 浮動小数点数(0 ~ 1)から符号なし 8 ビット整数への変換」を参照してください。 |
deltaZ | 24 |
ユニフォームの値を小数部 8 ビットの符号なし 24 ビット固定小数点数に変換したものです。値の変換方法については「8.9.15. 小数部 8 ビットの符号なし 24 ビット固定小数点数への変換」を参照してください。 |
accMax | 16 |
ユニフォームの値を 16 ビット浮動小数点数に変換したものです。値の変換方法については「8.9.2. 16 ビット浮動小数点数への変換」を参照してください。 |
autoAcc(Initialize) | 16 |
密度情報描画の前に 0 でクリアし、密度情報の描画が終わったときに 詳細については表外の説明を参照してください。 |
attenuation | 16 |
ユニフォームの値を 16 ビット浮動小数点数に変換したものです。値の変換方法については「8.9.2. 16 ビット浮動小数点数への変換」を参照してください。 |
colorLutInput | 1 |
0x0 : |
shadingDensitySrc | 1 |
0x0 : |
密度情報の最大値の逆数を自動的に計算する場合
dmp_Gas.autoAcc
に GL_TRUE
を設定した際の機能は、ガスの密度情報描画パスで描画を行い、自動的に計算された密度情報 D1 の最大値の逆数を accMax に設定することで実現されます。
D1 の最大値は密度情報描画パスの開始前に 0 でクリアしておきます。クリアは autoAcc(Initialize) に 0(0 以外の値でクリアするときは、最大値を 16 ビット小数点数に変換して書き込んでください。値の変換方法については「8.9.2. 16 ビット浮動小数点数への変換」を参照してください)を書き込むことで行われます。密度情報描画パスが完了したあとは、算出された D1 の最大値を accMax に反映するために、nngxSetGasAutoAccumulationUpdate()
を呼び出してください。
void nngxSetGasAutoAccumulationUpdate (GLint id);
この関数は、バインド中のコマンドリストオブジェクトの id
番目に蓄積されたコマンドリクエストが終了したときの割り込みハンドラで、ガスの密度情報描画パスで計算された D1 の最大値を、dmp_Gas.accMax
の予約ユニフォームによる設定(accMax)に反映(逆数を設定)します。
id
で指定されたコマンドリクエストは 3D 実行コマンドでなければなりません。密度情報描画パスのコマンドを含むコマンドリクエストに対して呼び出しておくと、accMax は正しく更新されます。密度情報描画パスのコマンドとシェーディングパスのコマンドは nngxSplitDrawCmdlist()
で区切ってください。これらのコマンドを同じコマンドリクエストに含めてしまうと、シェーディングパスの前に accMax が更新されません。また、この関数で更新したあとは、シェーディングパスが完了するまで accMax に値を書き込まないでください。
オブジェクト名が 0 のコマンドリストをバインドしている場合は GL_ERROR_806D_DMP
のエラーを生成します。id
が 0 以下の場合や蓄積済みのコマンドリクエストの個数より大きい場合、id
に指定したコマンドリクエストが 3D 実行コマンドではない場合は GL_ERROR_806E_DMP
のエラーを生成します。
8.8.7.2. シェーディング参照テーブル設定レジスタ(0x0123, 0x0124)
予約ユニフォーム dmp_Gas.sampler{ TR, TG, TB }
で指定されるシェーディング参照テーブルは、8 個のデータと同数の差分値によって設定されます。
設定に使用するレジスタのビットレイアウトは以下のようになっています。
レジスタ 0x0123 には、設定開始インデックスを Shading_Index に設定します。0 が最初のデータです。データの個数は 16 個ですので、Shading_Index には 0 ~ 15 を指定することができます。
インデックスをレジスタ 0x0123 に設定してから、レジスタ 0x0124 に変換した値の組み合わせを書き込みます。1 つデータを書き込むごとにインデックスが 1 インクリメントされますが、前半の 8 つと後半の 8 つで、レジスタに書き込む値のフォーマットが異なることや、レジスタに設定するインデックスとシェーディング参照テーブルのインデックスが異なることに注意が必要です。また、レジスタ 0x00E0 のビット [ 2 : 0 ](mode)に 0x7 を設定(フォグユニットをガスモードに設定)していなければ、レジスタ 0x0124 への書き込みは無視されます。
前半(i < 8)には、glTexImage1D()
でロードするそれぞれの参照テーブルの i + 8 番目のデータをパックした値を書き込みます。書き込む値は、成分ごとに符号つき 8 ビット整数に変換(変換方法については「8.9.18. 浮動小数点数(-1 ~ 1)から符号つき 8 ビット整数への変換」を参照)し、R 成分を Shading_R、G 成分を Shading_G、B 成分を Shading_B にそれぞれ設定したものです。
後半(i >= 8)には、glTexImage1D()
でロードするそれぞれの参照テーブルの i - 8 番目のデータをパックした値を書き込みます。書き込む値は、成分ごとに 255 を乗算した結果を小数部 0 ビットの符号なし 8 ビット固定小数点数に変換(変換方法については「8.9.11. 小数部 0 ビットの符号なし 8 ビット固定小数点数への変換」を参照)し、R 成分を Shading_R、G 成分を Shading_G、B 成分を Shading_B にそれぞれ設定したものです。
シェーディング参照テーブルを設定するコマンドの前に、ダミーコマンドを挿入しなければならない場合があります。レジスタ 0x0100 から 0x013F までの設定コマンド、レジスタ 0x0000 から 0x0035 までの設定コマンド、その他本文書にて記載のないレジスタアドレスへのコマンドは、これらのコマンドの後に続けてガスのシェーディング参照テーブルを設定する場合、間に 45 個のダミーコマンドが必要です。上記の範囲にあるレジスタ以外のレジスタへの設定コマンドがダミーコマンドとして使用できます。また、シェーディング参照テーブルを設定するコマンドのあとには、レジスタ 0x0100 に対してバイトイネーブルを 0 に設定したダミーコマンドが 1 つ必要です。
8.8.8. フォグ設定レジスタ(0x00E0, 0x00E1, 0x00E6, 0x00E8 ~ 0x00EF)
フォグ設定の予約ユニフォーム(名前に dmp_Fog
を含む予約ユニフォーム)に関連するレジスタについて説明します。
8.8.8.1. フォグ制御設定レジスタ(0x00E0, 0x00E1)
フォグの制御設定に対応するレジスタは以下のとおりです。レジスタ 0x00E0 の他のビットはガス設定などで使用されていることに注意してください。
ビットレイアウト中の名前は以下のように予約ユニフォームに対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。
名前 | ビット数 | 説明 |
---|---|---|
mode | 3 |
0x0 : |
zFlip | 1 |
0x0 : |
color (Red) color (Green) color (Blue) |
8 |
上から、 どの要素も、ユニフォームの値(0.0 ~ 1.0)を 0 ~ 255 にマップしたときの符号なし 8 ビット整数に変換した値です。値の変換方法については「8.9.16. 浮動小数点数(0 ~ 1)から符号なし 8 ビット整数への変換」を参照してください。 |
8.8.8.2. フォグ参照テーブル設定レジスタ(0x00E6, 0x00E8 ~ 0x00EF)
予約ユニフォーム dmp_Fog.sampler
で指定されるフォグ係数の参照テーブルは、128 個のデータと同数の差分値によって設定されます。設定に使用するレジスタのビットレイアウトは以下のようになっています。
レジスタ 0x00E6 には、設定開始インデックスを Fog_Index に設定します。インデックスは 0 が最初のデータ、127 が最後のデータです。
レジスタ 0x00E8 ~ 0x00EF には、glTexImage1D()
でロードする参照テーブルの i 番目のデータと i + 128 番目に設定した差分値を組み合わせた値を書き込みます。Fog_Value にはデータを小数部 11 ビットの符号なし 11 ビット固定小数点数に変換した値を、Fog_Difference には差分値を小数部 11 ビットの符号つき 13 ビット固定小数点数(負の値は 2 の補数表現)に変換した値を、それぞれ設定してください。それぞれの値の変換方法については「8.9.12. 小数部 11 ビットの符号なし 11 ビット固定小数点数への変換」と「8.9.9. 小数部 11 ビットの符号つき 13 ビット固定小数点数への変換」を参照してください。
インデックスをレジスタ 0x00E6 に設定してから、0x00E8 ~ 0x00EF のいずれかのレジスタに変換した値の組み合わせを書き込みます。いずれのレジスタに書き込んでも処理結果は変わらず、1 つデータを書き込むごとにインデックスが 1 インクリメントされます。
8.8.9. フラグメントオペレーション設定レジスタ(0x0100 ほか)
フラグメントオペレーション設定の予約ユニフォーム(名前に dmp_FragOperation
を含む予約ユニフォーム)に関連するレジスタについて説明します。
8.8.9.1. フラグメントオペレーションモード設定レジスタ(0x0100)
フラグメントオペレーションのモード設定に対応するレジスタは以下のとおりです。このレジスタのほかのビットには論理演算とブレンディングの設定が行われることに注意してください。フラグメントオペレーションのモード設定を変更したときは、「8.8.9.6. フレームバッファアクセス制御設定レジスタ(0x0112 ~ 0x0115)」の設定も変更しなければなりません。
ビットレイアウト中の名前は以下のように予約ユニフォームに対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。
名前 | ビット数 | 説明 |
---|---|---|
FragmentOperation | 2 |
0x0 : |
8.8.9.2. シャドウ減衰ファクタ設定レジスタ(0x0130)
シャドウ減衰ファクタの設定に対応するレジスタは以下のとおりです。
レジスタ | ビット数 | 説明 |
---|---|---|
0x0130 の ビット [ 31 : 16 ] |
16 |
値の変換方法については「8.9.2. 16 ビット浮動小数点数への変換」を参照してください。 |
0x0130 の ビット [ 15 : 0 ] |
16 |
値の変換方法については「8.9.2. 16 ビット浮動小数点数への変換」を参照してください。 |
8.8.9.3. w バッファ設定レジスタ(0x004D, 0x004E, 0x006D)
w バッファの設定に対応するレジスタは以下のとおりです。
レジスタ | ビット数 | 説明 |
---|---|---|
0x006D の ビット [ 0 : 0 ] |
1 |
dmp_FragOperation.wScale の設定値が 0 の場合は 1 を、0 以外の場合は 0 を設定します。 |
0x004D の ビット [ 23 : 0 ] |
24 | クリップ座標の z 値へのスケール値を設定します。設定値には、dmp_FragOperation.wScale の設定値と glDepthRangef() の設定が影響します。設定方法については後述します。 |
0x004E の ビット [ 23 : 0 ] |
24 | クリップ座標の z 値へのバイアス値を設定します。設定値には、dmp_FragOperation.wScale の設定値と glDepthRangef() 、glPolygonOffset() の設定が影響します。設定方法については後述します。 |
レジスタ 0x004D のビット [ 23 : 0 ] には、dmp_FragOperation.wScale
の設定値が 0 以外の場合はdmp_FragOperation.wScale
の設定値の符号を反転した値を設定します。dmp_FragOperation.wScale
の設定値が 0 の場合は、glDepthRangef()
で指定した zNear
と zFar
を使用して(zNear
- zFar
)の計算結果を設定します。レジスタに設定する際には、24 ビット浮動小数点数に変換した値を使用してください。値の変換方法については「8.9.1. 24 ビット浮動小数点数への変換」を参照してください。
レジスタ 0x004E のビット [ 23 : 0 ] には、dmp_FragOperation.wScale
の設定値が 0 以外の場合は 0 を設定します。dmp_FragOperation.wScale
の設定値が 0 の場合は、glDepthRangef()
で指定した引数 zNear
を設定します。glEnable()
で GL_POLYGON_OFFSET_FILL
を有効にしていた場合は、glPolygonOffset()
で指定した units
を使用して計算したオフセット値を加算して設定します。オフセット値には、デプスバッファのフォーマットが 16 ビットの場合は units
÷ 65535 の計算結果を、デプスバッファのフォーマットが 24 ビットの場合は units
÷ 16777215 の計算結果を適用してください。レジスタに設定する際には、24 ビット浮動小数点数に変換した値を使用してください。値の変換方法については「8.9.1. 24 ビット浮動小数点数への変換」を参照してください。
8.8.9.4. クリッピング設定レジスタ(0x0047 ~ 0x004B)
クリッピングの設定に対応するレジスタは以下のとおりです。
ビットレイアウト中の名前は以下のように予約ユニフォームに対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。
名前 | ビット数 | 説明 |
---|---|---|
enableClippingPlane | 1 |
0x0 : |
clippingPlane1 |
24 |
値の変換方法については「8.9.1. 24 ビット浮動小数点数への変換」を参照してください。 |
8.8.9.5. アルファテスト設定レジスタ(0x0104)
アルファテストの設定に対応するレジスタは以下のとおりです。
ビットレイアウト中の名前は以下のように予約ユニフォームに対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。
名前 | ビット数 | 説明 |
---|---|---|
enableAlphaTest | 1 |
0x0 : |
alphaTestFunc | 3 |
0x0 : |
alphaRefValue | 8 |
値の変換方法については「8.9.16. 浮動小数点数(0 ~ 1)から符号なし 8 ビット整数への変換」を参照してください。 |
8.8.9.6. フレームバッファアクセス制御設定レジスタ(0x0112 ~ 0x0115)
フレームバッファアクセスの制御設定に対応するレジスタは以下のとおりです。これらのレジスタは、いくつかの関数の呼び出しや予約ユニフォームの設定値変更を行ったときに、併せて変更しなければならない場合があります。
レジスタ | ビット数 | 説明 |
---|---|---|
colorRead 0x0112 の |
4 |
カラーバッファのリードが必要な場合には 0x0F を設定し、不要な場合には 0 を設定します。
以下のいずれかの条件に合致する場合、カラーバッファのリードが必要となります。
|
colorWrite 0x0113 の |
4 |
カラーバッファのライトが必要な場合には 0x0F を設定し、不要な場合には 0 を設定します。
以下のいずれかの条件に合致する場合、カラーバッファのライトが必要となります。
|
depthRead 0x0114 の |
2 |
デプスバッファのリードが必要な場合にはビット [ 1 : 1 ] に 1 を設定し、ステンシルバッファのリードが必要な場合にはビット [ 0 : 0 ] に 1 を設定します。不要な場合には 0 を設定します。
以下のいずれかの条件に合致する場合、デプスバッファのリードが必要となります。
以下のいずれかの条件に合致する場合、ステンシルバッファのリードが必要となります。
|
depthWrite 0x0115 の |
2 |
デプスバッファのライトが必要な場合にはビット [ 1 : 1 ] に 1 を設定し、ステンシルバッファのライトが必要な場合にはビット [ 0 : 0 ] に 1 を設定します。不要な場合には 0 を設定します。
以下の条件を満たす場合、デプスバッファのライトが必要となります。
以下の条件を満たす場合、ステンシルバッファのライトが必要となります。
|
カラーバッファ、デプスバッファ、ステンシルバッファのリードおよびライトの有無の組み合わせの中には、ハードウェアでサポートされていない組み合わせがあります。サポートされていない組み合わせで設定された場合の動作は不定です。サポートされている組み合わせについては下記の表を参照してください。
colorRead | colorWrite | depthRead | depthWrite | ハードウェアのサポート |
---|---|---|---|---|
0 | 0 | 0 | 0 | × |
0 以外 | 0 | 0 | 0 | × |
0 | 0 以外 | 0 | 0 | ○ |
0 以外 | 0 以外 | 0 | 0 | ○ |
0 | 0 | 0 以外 | 0 | × |
0 以外 | 0 | 0 以外 | 0 | × |
0 | 0 以外 | 0 以外 | 0 | ○ |
0 以外 | 0 以外 | 0 以外 | 0 | ○ |
0 | 0 | 0 | 0 以外 | × |
0 以外 | 0 | 0 | 0 以外 | × |
0 | 0 以外 | 0 | 0 以外 | × |
0 以外 | 0 以外 | 0 | 0 以外 | × |
0 | 0 | 0 以外 | 0 以外 | ○ |
0 以外 | 0 | 0 以外 | 0 以外 | × |
0 | 0 以外 | 0 以外 | 0 以外 | ○ |
0 以外 | 0 以外 | 0 以外 | 0 以外 | ○ |
上記のレジスタに 0 が設定されている場合、対応するバッファへのメモリアクセスが抑制されることによるパフォーマンスの向上に効果があります。そのため、なるべくこれらのレジスタに 0 を設定することが望まれますが、ハードウェアでサポートされている組み合わせでなければならないことに注意が必要です。また、バッファのライトが発生するフラグメント処理の設定であるにもかかわらずライトアクセスをオフにした場合はバッファへの書き込みが行われず、バッファのリードが発生する設定であるにもかかわらずリードアクセスをオフにした場合は読み出される値が不定となります。
カラーバッファのリードアクセスをオフに設定することができるのは、
- 予約ユニフォーム
dmp_FragOperation.mode
にGL_FRAGOP_MODE_GL_DMP
が設定されている。 - カラーマスク設定レジスタ(0x0107)のビット [ 11 : 8 ] が 0x0 または 0xF に設定されている。
上記の条件をすべて満たしつつ、下記の条件のいずれかを満たす場合です。
- ブレンディングが有効(レジスタ 0x0100 のビット [ 8 : 8 ] が 1)で、srcRGB と srcAlpha の設定(レジスタ 0x0101 のビット [ 19 : 16 ]、[ 27 : 24 ])がデスティネーションカラーを必要としない(0x4、0x5、0x8、0x9、0xE 以外)。かつ、dstRGB と dstAlpha の設定(レジスタ 0x0101 のビット [ 23 : 20 ]、[ 31 : 28 ])が 0x0(
GL_ZERO
)。 - 論理演算が有効(レジスタ 0x0100 のビット [ 8 : 8 ] が 0)で、レジスタ 0x0102 の opcode の設定がデスティネーションカラーを必要としない(0x0、0x3、0x4、0x5 のいずれか)。
カラーバッファのライトアクセスをオフに設定することができるのは、下記の条件をすべて満たす場合です。
- 予約ユニフォーム
dmp_FragOperation.mode
にGL_FRAGOP_MODE_GL_DMP
が設定されている。 - カラーマスク設定レジスタ(0x0107)のビット [ 11 : 8 ] が 0x0 に設定されている。
デプスバッファのリードアクセスをオフに設定することができるのは、
- 予約ユニフォーム
dmp_FragOperation.mode
にGL_FRAGOP_MODE_GL_DMP
が設定されている。 - デプステストが無効、もしくは有効であっても比較方法にデプスバッファの値を必要としない。
上記の条件をすべて満たすか、下記の条件を満たす場合です。
- 予約ユニフォーム
dmp_FragOperation.mode
にGL_FRAGOP_MODE_SHADOW_DMP
が設定されている。
デプスバッファのライトアクセスをオフに設定することができるのは、下記の条件のいずれかを満たす場合です。
- デプステスト(レジスタ 0x0107 のビット [ 0 : 0 ])が無効(0x0)に設定されている。
- デプスバッファのマスキング設定(レジスタ 0x0107 のビット [ 12 : 12 ])が
GL_FALSE
(0x0)に設定されている。 - 予約ユニフォーム
dmp_FragOperation.mode
にGL_FRAGOP_MODE_GL_DMP
以外が設定されている。
ステンシルバッファのリードアクセスをオフに設定することができるのは、
- 予約ユニフォーム
dmp_FragOperation.mode
にGL_FRAGOP_MODE_SHADOW_DMP
が設定されている。
上記の条件を満たすか、予約ユニフォーム dmp_FragOperation.mode
に GL_FRAGOP_MODE_GL_DMP
が設定されている場合に、下記の条件のいずれかを満たす場合です。
- ステンシルテスト(レジスタ 0x0105 のビット [ 0 : 0 ])が無効(0x0)に設定されている。
- ステンシルテスト(レジスタ 0x0105 のビット [ 0 : 0 ])が有効(0x1)であっても比較方法にステンシルバッファの値を必要としない。
- ステンシルテストのマスキング値(レジスタ 0x0105 のビット [ 31 : 24 ])が 0x00 に設定されている。
ステンシルバッファのライトアクセスをオフに設定することができるのは、下記の条件のいずれかを満たす場合です。
- ステンシルテスト(レジスタ 0x0105 のビット [ 0 : 0 ])が無効(0x0)に設定されている。
- ステンシルテストのマスク設定(レジスタ 0x0105 のビット [ 15 : 8 ])が 0x00 に設定されている。
- ステンシルテストの fail、zfail、zpass(レジスタ 0x0106 のビット [ 2 : 0 ]、[ 6 : 4 ]、[ 10 : 8 ])が、すべて
GL_KEEP
(0x0)に設定されている。 - 予約ユニフォーム
dmp_FragOperation.mode
にGL_FRAGOP_MODE_GL_DMP
以外が設定されている。
8.8.10. ビューポート設定レジスタ(0x0041 ~ 0x0044, 0x0068)
glViewport()
で行われるビューポートの設定に対応するレジスタは以下のとおりです。これらのレジスタを設定したときは、「8.8.16. シザーテスト設定レジスタ(0x0065 ~ 0x0067)」も併せて変更しなければならない場合があります。
ビットレイアウト中の名前は以下のようにビューポートの設定に対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。
名前 | ビット数 | 説明 |
---|---|---|
VIEWPORT_WIDTH | 24 |
ビューポートの幅を 2 で除算した結果を 24 ビット浮動小数点数に変換した値です。 値の変換方法については「8.9.1. 24 ビット浮動小数点数への変換」を参照してください。 |
VIEWPORT_WIDTH_INV | 32 |
2 をビューポートの幅で除算した結果を 31 ビット浮動小数点数に変換した値を 1 ビット左へシフトした値です。 値の変換方法については「8.9.3. 31 ビット浮動小数点数への変換」を参照してください。 |
VIEWPORT_HEIGHT | 24 |
ビューポートの高さを 2 で除算した結果を 24 ビット浮動小数点数に変換した値です。 値の変換方法については「8.9.1. 24 ビット浮動小数点数への変換」を参照してください。 |
VIEWPORT_HEIGHT_INV | 32 |
2 をビューポートの高さで除算した結果を 31 ビット浮動小数点数に変換した値を 1 ビット左へシフトした値です。 値の変換方法については「8.9.3. 31 ビット浮動小数点数への変換」を参照してください。 |
VIEWPORT_X | 10 | ビューポートの始点(x 座標)をそのまま設定します。 |
VIEWPORT_Y | 10 | ビューポートの始点(y 座標)をそのまま設定します。 |
8.8.11. デプステスト設定レジスタ(0x0107, 0x0126)
デプステストの設定に対応するレジスタは以下のとおりです。これらのレジスタを設定したときは、「8.8.9.6. フレームバッファアクセス制御設定レジスタ(0x0112 ~ 0x0115)」も併せて変更しなければならない場合があります。
ビットレイアウト中の名前は以下のようにデプステストの設定に対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。表中にない名前は、ほかの設定で使用するビットです。
名前 | ビット数 | 説明 |
---|---|---|
enable | 1 |
0x0 : デプステスト無効 |
func | 3 |
0x0 : |
flag | 1 |
0x0 : |
func2 | 2 |
0x0 : |
8.8.12. 論理演算とブレンディング設定レジスタ(0x0100 ~ 0x0103)
論理演算とブレンディングの設定に対応するレジスタは以下のとおりです。これらのレジスタを設定したときは、「8.8.9.6. フレームバッファアクセス制御設定レジスタ(0x0112 ~ 0x0115)」も併せて変更しなければならない場合があります。
ビットレイアウト中の名前は以下のように論理演算とブレンディングの設定に対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。
名前 | ビット数 | 説明 |
---|---|---|
enable | 1 |
0x0 : 論理演算が有効 |
srcRGB dstRGB srcAlpha dstAlpha |
4 |
ブレンディングが無効である場合、srcRGB と srcAlpha には 0x1 を、dstRGB と dstAlpha には 0x0 を設定します。 ブレンディングが有効である場合は以下の値を設定します。 0x0 : |
modeRGB modeAlpha |
3 |
ブレンディングが無効である場合、0x0 を設定します。 ブレンディングが有効である場合は以下の値を設定します。 0x0 : |
red green blue alpha |
8 |
上から、 どの成分も、値(0.0 ~ 1.0)を 0 ~ 255 にマップしたときの符号なし 8 ビット整数に変換した値です。値の変換方法については「8.9.16. 浮動小数点数(0 ~ 1)から符号なし 8 ビット整数への変換」を参照してください。 |
opcode | 4 |
0x0 : |
論理演算が有効になっている場合は、レジスタ 0x0101 の設定(srcXXX、dstXXX、modeXXX)は無視されます。
8.8.13. アーリーデプステスト設定レジスタ(0x0061 ~ 0x0063, 0x006A, 0x0118)
アーリーデプステストの設定に対応するレジスタは以下のとおりです。これらのレジスタを設定したときは、「8.8.9.6. フレームバッファアクセス制御設定レジスタ(0x0112 ~ 0x0115)」と「8.8.11. デプステスト設定レジスタ(0x0107, 0x0126)」も併せて変更しなければならない場合があります。
ビットレイアウト中の名前は以下のように論理演算とブレンディングの設定に対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。
設定する関数 | ビット数 | 説明 |
---|---|---|
EnableEarlyDepthTest0 EnableEarlyDepthTest1 |
1 1 |
0x0 : アーリーデプステストが無効 |
EarlyDepthFunc | 2 |
0x0 : |
ClearEarlyDepthBit | 1 |
glClear() に GL_EARLY_DEPTH_BUFFER_BIT_DMP を含む引数を渡して、アーリーデプスバッファをクリアするときに 0x1 を設定します。 |
ClearEarlyDepthValue | 24 |
glClearEarlyDepthDMP() の引数 depth で指定した、アーリーデプスバッファのクリア値です。引数に渡す値そのままを設定します。 |
8.8.14. ステンシルテスト設定レジスタ(0x0105, 0x0106)
ステンシルテストの設定に対応するレジスタは以下のとおりです。これらのレジスタを設定したときは、「8.8.9.6. フレームバッファアクセス制御設定レジスタ(0x0112 ~ 0x0115)」も併せて変更しなければならない場合があります。
ビットレイアウト中の名前は以下のようにステンシルテストの設定に対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。
名前 | ビット数 | 説明 |
---|---|---|
enable | 1 |
0x0 : ステンシルテストが無効 |
fb_mask | 8 |
glStencilMask() の引数 mask で指定した、ステンシルバッファのマスキング値です。引数に渡す値の下位 8 ビットを設定します。 |
func | 3 |
0x0 : |
ref | 8 |
glStencilFunc() の引数 ref で指定した、ステンシルテストの参照値です。引数に渡す値そのままを設定します。 |
mask | 8 |
glStencilFunc() の引数 mask で指定した、ステンシルテストのマスキング値です。引数に渡す値そのままを設定します。 |
fail | 3 |
0x0 : |
zfail | 3 |
glStencilOp() の引数 zfail で変更した、デプステストでフラグメントが棄却された際のステンシルバッファの変更内容の設定です。設定値は fail と同じです。 |
zpass | 3 |
glStencilOp() の引数 zpass で変更した、デプステストでフラグメントが通過した際のステンシルバッファの変更内容の設定です。設定値は fail と同じです。 |
8.8.15. カリング設定レジスタ(0x0040)
カリングの設定に対応するレジスタは以下のとおりです。
ビットレイアウト中の名前は以下のようにステンシルテストの設定に対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。
名前 | ビット数 | 説明 |
---|---|---|
Culling | 2 |
上記以外の場合は 0x1 を設定します。 |
8.8.16. シザーテスト設定レジスタ(0x0065 ~ 0x0067)
シザーテストの設定に対応するレジスタは以下のとおりです。
ビットレイアウト中の名前は以下のようにシザーテストの設定に対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。
名前 | ビット数 | 説明 |
---|---|---|
enable | 2 |
0x0 : シザーテストが無効 |
x | 10 |
シザーテストが無効である場合は 0 を設定します。 シザーテストが有効である場合は引数 |
y | 10 |
シザーテストが無効である場合は 0 を設定します。 シザーテストが有効である場合は引数 |
width | 10 |
シザーテストが無効である場合は(カレントのカラーバッファの幅 - 1)を設定します。 シザーテストが有効である場合は( |
height | 10 |
シザーテストが無効である場合は(カレントのカラーバッファの高さ - 1)を設定します。 シザーテストが有効である場合は( |
8.8.17. カラーマスク設定レジスタ(0x0107)
glColorMask()
で行われるカラーマスク設定に対応するレジスタは以下のとおりです。これらのレジスタを設定したときは、「8.8.9.6. フレームバッファアクセス制御設定レジスタ(0x0112 ~ 0x0115)」も併せて変更しなければならない場合があります。
ビットレイアウト中の名前は以下のようにカラーマスクの設定に対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。表中にない名前は、「8.8.11. デプステスト設定レジスタ(0x0107, 0x0126)」で使用するビットです。
名前 | ビット数 | 説明 |
---|---|---|
red | 1 |
0x0 : |
green | 1 |
0x0 : |
blue | 1 |
0x0 : |
alpha | 1 |
0x0 : |
8.8.18. ブロックフォーマット設定レジスタ(0x011B)
ブロックフォーマットの設定に対応するレジスタは以下のとおりです。
設定する関数 | レジスタ | 説明 |
---|---|---|
glRenderBlockModeDMP()
|
0x011B の ビット [ 0 : 0 ] |
0x0 : GL_RENDER_BLOCK8_MODE_DMP 0x1 : GL_RENDER_BLOCK32_MODE_DMP |
8.8.19. 描画 API に関するレジスタ(0x0227 ~ 0x022A ほか)
glDrawElements()
と glDrawArrays()
の呼び出しで各ステートのバリデーションが行われるため、各ステートに関連するレジスタへのレジスタ設定コマンドが生成されます。これらの関数では、バリデーションにより生成されるコマンド以外にも、描画処理そのものに必要なレジスタ設定があります。
8.8.19.1. 頂点バッファを使用する場合の設定
頂点バッファを使用して描画を行う場合、以下のレジスタに対して設定を行います。コマンドの設定順序についての断りがない場合、各コマンドは描画開始コマンドより前に設定されていなければなりません。
ビットレイアウト中の名前は以下のようにそれぞれの設定に対応しています。
名前 | ビット数 | 説明 |
---|---|---|
DRAW_MODE DRAW_TRIANGLES1 DRAW_TRIANGLES2 |
2 1 1 |
0x0 : |
CALL_DRAWARRAYS | 1 |
1 に設定した場合、レジスタ 0x0200~0x0254 と 0x0280~0x02DF 以外のレジスタへの設定が正しく実行されない可能性があります。 |
INDEX_ARRAY_OFFSET | 28 |
頂点インデックスアレイのアドレスオフセットの設定です。レジスタ 0x0200 のビット [ 28 : 1 ] に設定されている、頂点アレイ共通のベースアドレスからのオフセット値です。ベースアドレス× 16 に、このオフセット値を加算した結果が、
VERTEX_NUM はレジスタ 0x0228 の [ 31 : 0 ] の設定、ARRAY_BASE_ADDR はレジスタ 0x0200 の [ 28 : 1 ] の設定です。 設定が変更にならない限り、再設定は必要ありません。 |
INDEX_ARRAY_TYPE | 1 |
頂点インデックスの型の設定です、
|
VERTEX_NUM | 32 | 描画する頂点数の設定です。設定が変更にならない限り、再設定は必要ありません。0 を設定した場合の動作は不定ですので、0 を設定しないでください。 |
FIRST_OFFSET | 32 |
glDrawArrays() を描画する場合の引数 first の値です。設定が変更にならない限り、再設定は必要ありません。 |
RESET_VTX_INFO | 1 |
このビットに 1 を書き込むと、三角形を構成するインデックス 0、1、2 の頂点の情報がリセットされます。 描画モードの引数を
|
KICK_COMMAND1 KICK_COMMAND2 |
特殊 |
描画を開始するときに、任意のビットに 1 を書き込みます。 KICK_COMMAND1(0x022E)が |
CLEAR_POST_VTX | 特殊 | 描画開始コマンドの直後に、任意のビットに 1 を書き込みます。描画開始ごとに設定する必要があります。 |
clearFrameBufferCacheData レジスタ 0x0111 [ 0 : 0 ] |
1 |
描画開始コマンドの直後に 1 を書き込みます。 このレジスタの詳細は「8.8.21. フレームバッファキャッシュクリアの設定レジスタ(0x0110, 0x0111)」を参照してください。 |
samplerType0 samplerType1 samplerType2 レジスタ 0x0080 [ 2 : 0 ] |
1 1 1 |
描画開始コマンドの直前に、有効にしなければならないテクスチャユニットに関してだけ 1 を設定し、描画開始コマンドの直後に 0 を設定します。有効にしなければならないテクスチャユニットに対して、常に 1 を設定していても動作の上で問題はありません。しかし、0 が設定されていると消費電力の低減に効果があるため、描画時以外は 0 に設定されています。 このレジスタの詳細は「8.8.6.2. テクスチャサンプラータイプ設定レジスタ(0x0080, 0x0083)」を参照してください。 |
DRAW_START | 1 |
ライブラリの初期化時に 1 が設定されます。1 が設定されている場合、描画が正しく行われません。0 が設定されている場合、レジスタ 0x02B0 から 0x02DF の範囲の設定コマンドが正しく反映されません。
描画開始コマンド後も、レジスタ 0x02B0 から 0x02DF の範囲の設定コマンドを使用しない場合は 0 が設定されたままでもかまいません。 |
DUMMY_CMD | 8 |
描画開始コマンドごとに、描画開始コマンドの直後に、0x0 を書き込むコマンドが 2 つ必要です。 このタイミングでこのレジスタに書き込むコマンドはダミーコマンドですので、設定値自体は意味を持ちません。 |
レジスタ 0x02BA の ビット [ 31 : 16 ] |
16 |
描画開始コマンドのあとに 0x7FFF を書き込むコマンドを実行すると、消費電力の低減に効果があります。 設定を行わなくても、動作上は問題ありませんが、設定を行う場合はバイトイネーブルに 0xC を設定し、ビット [ 15 : 0 ] に影響がないようにしてください。また、このレジスタへの設定の前に DRAW_START に 1 が設定されていなければなりません。 |
レジスタ 0x028A の ビット [ 31 : 16 ] |
16 |
描画開始コマンドのあとに 0x7FFF を書き込むコマンドを実行すると、消費電力の低減に効果があります。 設定を行わなくても、動作上は問題ありませんが、設定を行う場合はバイトイネーブルに 0xC を設定し、ビット [ 15 : 0 ] に影響がないようにしてください。 ジオメトリシェーダを使用しない(レジスタ 0x0244 のビット [ 0 : 0 ] が 0、かつレジスタ 0x0229 のビット [ 1 : 0 ] が 0 )場合は、レジスタ 0x02BA のビット [ 31 : 16 ] への設定がこのレジスタへの設定を兼ねるため、このレジスタへの設定コマンドは不要となります。 |
コマンドの依存関係に関する注意点
レジスタ 0x02BA のビット [ 31 : 16 ] への設定は、DRAW_START への設定のあとに行われなければなりません。
CALL_DRAWARRAYS に 1 が設定されている間は、レジスタ 0x0200~0x0254 と 0x0280~0x02DF 以外のレジスタへの設定が正しく実行されない場合があります。これらのレジスタへの設定は、CALL_DRAWARRAYS に 0 が設定されているときに行ってください。ただし、レジスタ 0x025E のビット [ 31 : 24 ] に対するダミーコマンドはこの限りではありません。
そのほかのコマンドで、描画開始コマンドの直後に必ず設定が必要なものがいくつかありますが、それらのコマンドの順番に依存関係はありません。
INDEX_ARRAY_OFFSET の設定に関する補足
表中の INDEX_ARRAY_OFFSET(レジスタ 0x0227 のビット [ 27 : 0 ])の説明では、条件によって 0 または 0x20 を設定する必要があると記載されていますが、厳密には、以下の条件を満たさないように設定すれば、0 や 0x20 以外の値でも正しい設定となります。
- VERTEX_NUM が 0x10 より大きい場合
((VERTEX_NUM - 0x10) × 2 + (ARRAY_BASE_ADDR << 4) + INDEX_ARRAY_OFFSET) & 0xFFF >= 0xFE0
- VERTEX_NUM が 0x10 以下の場合
(ARRAY_BASE_ADDR << 4 + INDEX_ARRAY_OFFSET) & 0xFFF >= 0xFE0
VERTEX_NUM はレジスタ 0x0228 の [ 31 : 0 ]、ARRAY_BASE_ADDR はレジスタ 0x0200 の [ 28 : 1 ] の設定値です。
ロードアレイに関する制限
KICK_COMMAND2(レジスタ 0x022F)への書き込みで描画を開始する場合は、ロードアレイを 12 個使用できないという制限があります。詳細については「ロードアレイの制限」を参照してください。
8.8.19.2. 頂点バッファを使用しない場合の設定
頂点バッファを使用せずに描画を行う場合のレジスタに対する設定を、使用する場合との違いを視点に説明します。ビットレイアウトは図 8-66 と同じです。以下にビットレイアウト中の名前と設定との対応を示します。頂点属性データコマンドが描画開始コマンドと同じように扱われます。コマンドの設定順序についての断りがない場合、各コマンドは描画開始コマンドより前に設定されていなければなりません。
名前 | ビット数 | 説明 |
---|---|---|
DRAW_MODE DRAW_TRIANGLES1 DRAW_TRIANGLES2 |
2 1 1 |
0x0 :
|
CALL_DRAWARRAYS | 1 |
1 に設定されている場合、レジスタ 0x0200~0x0254 と 0x0280~0x02DF 以外のレジスタへの設定が正しく実行されない可能性があります。 |
INDEX_ARRAY_OFFSET | 28 | 使用しません。 |
INDEX_ARRAY_TYPE | 1 | 使用しません。 |
VERTEX_NUM | 32 | 使用しません。処理される頂点数は、入力される頂点属性データの個数で決まります。 |
FIRST_OFFSET | 32 | 使用しません。 |
RESET_VTX_INFO | 1 |
そのほかの描画モード( |
KICK_COMMAND1 KICK_COMMAND2 |
特殊 | 設定しないでください。 |
CLEAR_POST_VTX | 特殊 |
頂点バッファを使用する場合と違いはありません。 |
clearFrameBufferCacheData レジスタ 0x0111 [ 0 : 0 ] |
1 | 頂点バッファを使用する場合と違いはありません。 |
samplerType0 samplerType1 samplerType2 レジスタ 0x0080 [ 2 : 0 ] |
1 1 1 |
頂点バッファを使用する場合と違いはありません。 |
DRAW_START | 1 | 頂点バッファを使用する場合と違いはありません。 |
レジスタ 0x02BA の ビット [ 31 : 16 ] |
16 | 頂点バッファを使用する場合と違いはありません。 |
レジスタ 0x028A の ビット [ 31 : 16 ] |
16 | 頂点バッファを使用する場合と違いはありません。 |
頂点属性データの入力には、「8.8.1.8. 固定頂点属性値設定レジスタ(0x0232 ~ 0x0235)」を使用します。
まず、レジスタ 0x0232 のビット [ 3 : 0 ] に 0xF を書き込みます。次に、頂点属性データを 24 ビット浮動小数点数に変換した 3 つの 32 ビットデータを、レジスタ 0x0233、0x0234、0x0235 の順に書き込みます。24 ビット浮動小数点数に変換した 3 つの 32 ビットデータは、「24 ビット浮動小数点数入力モード」にあるデータと同じ方法で作成します。
頂点バッファを使用しない場合、「8.8.1.9. 頂点属性アレイ設定レジスタ(0x0200 ~ 0x0227)」で説明されているレジスタへの設定は不要です。コマンドの設定順序についての依存関係は頂点バッファを使用する場合と同じです。
8.8.20. ジオメトリシェーダ設定レジスタ(0x0280 ~ 0x02AF ほか)
GPU には頂点処理を行う頂点シェーダプロセッサが複数搭載されています。ジオメトリシェーダを使用する場合、そのうちの 1つがジオメトリシェーダプロセッサとして動作します。このプロセッサを共用プロセッサと呼び、ジオメトリシェーダとして使用しないときは頂点シェーダプロセッサとして動作しているため、浮動小数点数レジスタやブールレジスタなどのリソースには頂点シェーダとしての値が設定されています。ジオメトリシェーダを使用しない設定から使用する設定に変更する場合、頂点シェーダとして設定されている値をジオメトリシェーダとしての設定に変更しなければなりません。同様にジオメトリシェーダを使用する設定から、使用しない設定に変更する場合にもジオメトリシェーダとして設定されている値を頂点シェーダとしての設定に変更しなければなりません。
レジスタ 0x02B0 から 0x02DF は頂点シェーダプロセッサの設定レジスタです。この範囲のレジスタに対する設定は、複数あるすべての頂点シェーダプロセッサに対して行われます。共用プロセッサに対しても同様に同じ設定が行われますが、レジスタ 0x0244 のビット [ 0 : 0 ] に 1 が設定されている場合、共用プロセッサには頂点シェーダプロセッサへのレジスタ設定が反映されなくなります。逆に 0 が設定されている、かつレジスタ 0x0229 のビット [ 1 : 0 ] が 0x0 の場合は設定が共用プロセッサに反映されます。
レジスタ 0x02B0 から0x02DF と同様の設定を共用プロセッサのみに行う場合は、レジスタのアドレスから 0x30 を引いたアドレス、つまりレジスタ 0x0280 から 0x02AF を使用します。
ジオメトリシェーダを使用する場合はレジスタ 0x0280 から 0x02AF にはジオメトリシェーダ固有の設定をし、ジオメトリシェーダを使用しない場合はレジスタ 0x0280 から 0x02AF にはレジスタ 0x02B0 から 0x02DF と同じ設定をする必要があります。これは、レジスタ 0x0244 のビット [ 0 : 0 ] に 0 を、レジスタ 0x0229 のビット [ 1 : 0 ] に 0x0 を設定し、頂点シェーダプロセッサへの設定が共用プロセッサにも反映されるようにしてから、レジスタ 0x02B0 から 0x02DF に対して再度設定することでも可能です。
ジオメトリシェーダを使用するには、これらの共用プロセッサに関するレジスタ設定と、入出力などに関するその他のレジスタ設定が必要となります。
8.8.20.1. 浮動小数点定数レジスタ(0x0290, 0x0291 ~ 0x0298)
設定に使用するレジスタのアドレスが異なるだけで、レジスタに設定する値は「8.8.1.1. 浮動小数点定数レジスタ(0x02C0, 0x02C1 ~ 0x02C8)」と同じです。
レジスタ 0x0290 がレジスタ 0x02C0 に、レジスタ 0x0291 ~ 0x0298 がレジスタ 0x02C1 ~ 0x02C8 に対応しています。
8.8.20.2. ブールレジスタ(0x0280)
設定に使用するレジスタのアドレスが異なるだけで、レジスタに設定する値は「8.8.1.2. ブールレジスタ(0x02B0)」と同じです。
レジスタ 0x0280 がレジスタ 0x02B0 に対応しています。
8.8.20.3. 整数レジスタ(0x0281 ~ 0x0284)
設定に使用するレジスタのアドレスが異なるだけで、レジスタに設定する値は「8.8.1.3. 整数レジスタ(0x02B1 ~ 0x02B4)」と同じです。
レジスタ 0x0281 ~ 0x0284 がレジスタ 0x02B1 ~ 0x02B4 に対応しています。
8.8.20.4. プログラムコード設定レジスタ(0x028F, 0x029B ~ 0x02A3, 0x02A5 ~ 0x02AD)
設定に使用するレジスタのアドレスが異なるだけで、レジスタに設定する値は「8.8.1.4. プログラムコード設定レジスタ(0x02BF, 0x02CB ~ 0x02D3, 0x02D5 ~ 0x02DD)」と同じです。
レジスタ 0x028F がレジスタ 0x02BF に、レジスタ 0x029B ~ 0x02A3 がレジスタ 0x02CB ~ 0x02D3 に、レジスタ 0x02A5 ~ 0x02AD がレジスタ 0x02D5 ~ 0x02DD に対応しています。
8.8.20.5. 開始アドレス設定レジスタ(0x028A)
設定に使用するレジスタのアドレスが異なるだけで、レジスタに設定する値は「8.8.1.5. 開始アドレス設定レジスタ(0x02BA)」と同じです。
レジスタ 0x028A がレジスタ 0x02BA に対応しています。
8.8.20.6. 頂点属性入力数設定レジスタ(0x0289)
ジオメトリシェーダに入力する頂点属性数を設定するレジスタを以下に示します。
count には(入力する頂点属性数 - 1)を設定します。ジオメトリシェーダに入力する頂点属性の数は、頂点シェーダから出力する頂点属性の数(generic
属性も含む)と同じです。
ここで設定する頂点属性数とは、頂点シェーダアセンブラで #pragma output_map
を定義した数ではなく、頂点シェーダアセンブラの #pragma output_map
で定義される出力レジスタの個数です。つまり、1 つの出力レジスタがコンポーネント別に複数の #pragma output_map
で定義されている場合は、1 とカウントします。
8.8.20.7. 入力レジスタのマッピング設定レジスタ(0x028B, 0x028C)
設定に使用するレジスタのアドレスが異なるだけで、レジスタに設定する値は「8.8.1.7. 入力レジスタのマッピング設定レジスタ(0x02BB, 0x02BC)」と同じです。ただし、ラインシェーダなどのジオメトリシェーダを使用している場合には、レジスタ 0x028B に 0x76543210 を、レジスタ 0x028C に 0xFEDCBA98 を設定します。
レジスタ 0x028B ~ 0x028C がレジスタ 0x02BB ~ 0x02BC に対応しています。
8.8.20.8. 出力レジスタ使用数設定レジスタ(0x004F, 0x025E)
ジオメトリシェーダから出力される出力レジスタの個数は「8.8.1.10. 出力レジスタ使用数設定レジスタ(0x004F, 0x024A, 0x0251, 0x025E)」と共通するレジスタに設定されます。
count1(レジスタ 0x004F)には使用する出力レジスタの個数そのままを、count2(レジスタ 0x025E のみ)には(使用する出力レジスタの個数 - 1)をそれぞれ設定します。それぞれのレジスタで設定される値とビット幅が異なる点に注意してください。
ここで設定する出力レジスタの個数とは、ジオメトリシェーダに #pragma output_map
で定義されている出力レジスタの個数を指します。つまり、1 つの出力レジスタがコンポーネント別に複数の #pragma output_map
で定義されている場合は、1 とカウントします。
8.8.20.9. 出力レジスタのマスク設定レジスタ(0x028D)
設定に使用するレジスタのアドレスが異なるだけで、レジスタに設定する値は「8.8.1.11. 出力レジスタのマスク設定レジスタ(0x02BD)」と同じです。
レジスタ 0x028D がレジスタ 0x02BD に対応しています。
8.8.20.10. 出力レジスタの属性設定レジスタ(0x0050 ~ 0x0056, 0x0064)
頂点シェーダから出力される頂点の属性についてではなく、ジオメトリシェーダから出力される頂点の属性について設定することを除いて、レジスタに設定する値は「8.8.1.12. 出力レジスタの属性設定レジスタ(0x0050 ~ 0x0056, 0x0064)」と同じです。
ジオメトリシェーダの出力属性は、ジオメトリシェーダで定義されている #pragma output_map
の設定で決定されます。これは、シェーダアセンブラのリンカが出力するマップファイルに生成される情報です。いくつかのジオメトリシェーダは、generic
属性を出力属性として定義しています。generic
属性として定義された出力属性には、リンクした頂点シェーダでのみ定義されている #pragma output_map
の設定が適用されます。その際、頂点シェーダで定義されている generic
属性は除かれます。
マップファイルの詳細については「頂点シェーダリファレンスマニュアル」を参照してください。
8.8.20.11. 出力属性のクロック制御レジスタ(0x006F)
頂点シェーダについてではなく、ジオメトリシェーダについて設定することを除いて、レジスタに設定する値は「8.8.1.13. 出力属性のクロック制御レジスタ(0x006F)」と同じです。
8.8.20.12. そのほかの設定レジスタ(0x0229, 0x0252, 0x0254, 0x0289)
ジオメトリシェーダを使用する際に設定する、そのほかのレジスタは以下のとおりです。
レジスタ | 説明 |
---|---|
0x0229 のビット [ 1 : 0 ] |
ジオメトリシェーダを使用する場合は 0x2 を、使用しない場合は 0x0 を設定します。 このレジスタ設定コマンドの前後にダミーコマンドを必要とします。ダミーコマンドにはバイトイネーブルを 0 とした無効コマンドを使用します。このレジスタ設定コマンドの直前には、レジスタ 0x0251 へのダミーコマンド 10 個とレジスタ 0x0200 へのダミーコマンド 30 個が、このレジスタ設定コマンドの直後には、レジスタ 0x0200 へのダミーコマンド 30 個が必要です。ただし、このビット以外を設定するコマンドにはダミーコマンドは必要ありません。 |
0x0229 のビット [ 31 : 31 ] | サブディビジョンシェーダ(ループ、Catmull-Clark)を使用する場合は 0x1 を、そのほかのジオメトリシェーダを使用する場合や、ジオメトリシェーダを使用しない場合は 0x0 を設定します。 |
0x0252 のビット [ 31 : 0 ] | サブディビジョンシェーダ(ループ、Catmull-Clark)を使用する場合は 0x00000001 を、パーティクルシステムを使用する場合は 0x01004302 を、それ以外のジオメトリシェーダを使用する場合や、ジオメトリシェーダを使用しない場合は 0x00000000 を設定します。 |
0x0289 のビット [ 31 : 24 ] | ジオメトリシェーダを使用する場合は 0x08 を設定します。ジオメトリシェーダを使用しない場合は 0xA0 を設定します。 |
0x0289 のビット [ 15 : 8 ] | サブディビジョンシェーダ(ループ、Catmull-Clark)またはパーティクルシステムを使用する場合は 0x01 を、それ以外のジオメトリシェーダを使用する場合や、ジオメトリシェーダを使用しない場合は 0x00 を設定します。 |
0x0254 のビット [ 4 : 0 ] | Catmull-Clark サブディビジョンシェーダを使用する場合は 0x3 を、ループサブディビジョンシェーダを使用する場合は 0x2 を設定します。それ以外の場合、このビットは使用されません。 |
8.8.21. フレームバッファキャッシュクリアの設定レジスタ(0x0110, 0x0111)
フレームバッファキャッシュクリアの設定に対応するレジスタは以下のとおりです。
clearFrameBufferCacheData に 1 を書き込むと、カラーバッファおよびデプスバッファの両方のキャッシュデータがフラッシュされます。clearFrameBufferCacheTag に 1 を書き込むと、カラーバッファおよびデプスバッファ両方のキャッシュのタグがクリアされます。キャッシュタグをクリアするコマンドはキャッシュデータをフラッシュするコマンドの直後に使用する必要があり、必ずキャッシュデータのフラッシュ、キャッシュタグのクリアの順で使用しなければなりません。
これらのレジスタを設定するコマンドは、glFlush()
や glFinish()
、glClear()
を呼び出したときや、カラーバッファおよびデプスバッファのアドレスが変更された際のステートフラグ(NN_GX_STATE_FRAMEBUFFER
)のバリデーションを行ったとき、ステートフラグ NN_GX_STATE_FBACCESS
のバリデーションを行ったときに生成されます。また、nngxSplitDrawCmdlist()
などで 3D コマンドバッファを区切る際には、割り込み発生用コマンドの直前に挿入されます。
キャッシュデータをフラッシュするコマンドは、glDrawArrays()
または glDrawElements()
による描画開始コマンドの直後に単独で生成されます。
2 つのレジスタへの設定が必要なタイミングは、すべての描画処理が完了したとき(描画結果を参照する前)、カラーバッファおよびデプスバッファをクリアしたとき、設定(サイズ、アドレス、フォーマット)を変更したとき、アクセスパターンを変更したときです。
通常、描画コマンドの直後には、毎回 clearFrameBufferCacheData を設定するコマンドを生成する必要がありますが、次の 2 つの条件を満たす場合には描画コマンドごとに生成する必要はありません。
- 描画コマンドの直後に clearFrameBufferCacheData を設定するコマンドを生成したあと、その次の描画コマンドまでにレジスタ 0x0100~0x0130 を設定するコマンドを 1 つも生成していない。
- 描画コマンドのあとでレジスタ 0x0080~0x00B7 にデータを設定する前に、レジスタ 0x0080 へのダミーコマンド(データとバイトイネーブルに 0 を設定)を 3 つ生成している。
描画コマンドのあとにレジスタ 0x0100~0x0130 にデータを設定する場合は、先に clearFrameBufferCacheData を設定するコマンドを 1 つ生成する必要があります。ただし、このコマンドを 1 つでも生成したあとならば、次の描画コマンドまでにレジスタ 0x0100~0x0130 にデータを設定するコマンドをいくつ生成してもかまいません。
同様に、描画コマンドのあとにレジスタ 0x0080 へのダミーコマンド(データとバイトイネーブルに 0 を設定)を 3 つ生成したあとならば、次の描画コマンドまでにレジスタ 0x0080~0x00B7 を設定するコマンドをいくつ生成してもかまいません。
8.8.22. 区切りコマンド設定レジスタ(0x0010)
レジスタ 0x0010 に 0x12345678 を書き込むことで、GPU の割り込みが発生します。3D コマンドバッファを区切る際には、本コマンドを設定してください。
8.8.23. コマンドバッファ実行レジスタ(0x0238 ~ 0x023D)
コマンドバッファの実行は通常、コマンドリクエストにキューイングされた 3D 実行コマンドの情報をもとに行われます。コマンドバッファ実行レジスタを利用すると、コマンドバッファに蓄積された 3D コマンドによって、区切りコマンドで GPU の割り込み処理を発生させることなく別のコマンドバッファを実行することができます。
コマンドバッファ実行インターフェースには 2 つのチャンネルが用意されています。通常のコマンドバッファの実行にはチャンネル 0 が使用され、2 つのチャンネルを同時に実行させることはできません。
コマンドバッファの実行には、実行するコマンドバッファのアドレスとサイズの設定と、実行(キック)レジスタの 3 種類のレジスタに設定を行う必要があります。
アドレス設定レジスタ(BUFFER_ADDR_CHANNEL0/1)には、実行するコマンドバッファの物理アドレスを 8 で割った値(8 バイト単位のアドレス)を設定します。設定する値は偶数でなければなりません。
サイズ設定レジスタ(BUFFER_SIZE_CHANNEL0/1)には、実行するコマンドバッファの総バイト数を 8 で割った値(8 バイト単位のサイズ)を設定します。設定する値は偶数でなければなりません。
キックレジスタ(KICK_CHANNEL0/1)に値が書き込まれると、各チャンネルのアドレス、サイズの設定情報を使ってコマンドバッファが実行されます。書き込む値は任意です。バイトイネーブルが 0 でなければ、データの値にかかわらず実行されます。コマンドバッファの 3D コマンドでキックレジスタに書き込みを行う場合は、そのコマンドをコマンドバッファの最後に格納してください。なお、コマンドバッファのアドレスとサイズにはアライメントが 16 バイトでなければならない(8 で割った値が偶数でなければならない)制約がありますので、キックコマンド(KICK_CHANNEL0/1 への書き込みコマンド)を格納した直後のアドレスのアライメントは 16 バイトでなければなりません。キックコマンドが実行されるまで、アドレスおよびサイズの設定は実行中のコマンドバッファに影響を与えることはありません。
注意事項
コマンドバッファ実行レジスタへの設定を利用する際は以下のことに注意してください。
- キックコマンドはコマンドバッファの最後に配置しなければなりません。その際は、キックコマンドが最後になるようにコマンドバッファのサイズを指定してください。
- バーストアクセスでキックコマンドを実行する場合はバーストアクセスの途中で書き込むことはできません。キックレジスタへの書き込みが最後であれば実行されます。
- キックコマンドを実行したあとも 2 つのチャンネルに設定されたアドレスとサイズは保持されますが、nngx 関数などで 3D コマンドが実行されたときはチャンネル 0 の設定が上書きされます。
- 実行するコマンドバッファの領域がフラッシュされていなければ、処理が正しく行われない可能性があります。
- チャンネル 0 とチャンネル 1 は同時に実行することができません。
- キックコマンドを実行してから指定されたコマンドバッファのコマンドが実行されるまでの間に、コマンド実行が中断される期間があります。そのため、小さなサイズのコマンドバッファを指定するキックコマンドを頻繁に実行することは、GPU の処理コストとして無視できない大きさになりえます。
8.8.23.1. コマンドバッファの連続実行
下図のように、コマンドバッファ実行レジスタへの書き込みコマンドをコマンドバッファの最後に格納することによって、連続して N 個のコマンドバッファを実行させることができます。
通常、コマンドバッファの最後には上図のコマンドバッファ N のように区切りコマンドを格納します。そこで区切りコマンドの代わりに、次に実行するコマンドバッファのサイズとアドレスの設定コマンドとキックコマンドの組み合わせを格納すれば、GPU の割り込みを発生させることなく複数のコマンドバッファを実行することができ、CPU 負荷の軽減に繋がります。ただし、最後のコマンドバッファで実行される最後のコマンドは区切りコマンドでなければなりません。
最初のコマンドバッファを実行するには、nngxAdd3DCommand()
の引数 bufferaddr
と buffersize
にそのコマンドバッファの先頭アドレスとサイズ、copycmd
に GL_FALSE
を渡して呼び出してください。
8.8.23.2. 同じコマンドバッファの繰り返し実行
先の例では、同じ内容を繰り返し実行する場合でも別のコマンドバッファとして用意しなければなりませんが、2 つあるチャンネルを利用することで同じコマンドバッファを繰り返し実行させることができます。
例えば、以下の組み合わせであれば、連続するレジスタへの書き込みコマンド 1 つでジャンプ用のコマンドを構成することができます。ただし、ジャンプ先のコマンドバッファの最後がチャンネル 1 のキックコマンドである必要があります。
レジスタ | 設定する値 |
---|---|
BUFFER_SIZE_CHANNEL0 | ジャンプ先のコマンドバッファのサイズ |
BUFFER_SIZE_CHANNEL1 | 戻り先のコマンドバッファのサイズ(次のジャンプ用コマンドまたは区切りコマンドまで) |
BUFFER_ADDR_CHANNEL0 | ジャンプ先のコマンドバッファのアドレス |
BUFFER_ADDR_CHANNEL1 | 戻り先のコマンドバッファのアドレス(このジャンプ用コマンドの直後) |
KICK_CHANNEL0 | 任意(キックコマンドを実行する) |
この方法では、ジャンプ元のコマンドバッファで予め戻り先のアドレス情報を設定しておくため、ジャンプ先のコマンドバッファにアドレス情報を含める必要がありません。
上図では、コマンドバッファ 1 でジャンプ先をチャンネル 0 側に、戻り先をチャンネル 1 側に設定したあと、チャンネル 0 のキックコマンドでコマンドバッファ A を実行し、コマンドバッファ A の最後にあるチャンネル 1 のキックコマンドでコマンドバッファ 1 に実行を戻しています。実行中にジャンプ先のコマンドバッファ A の内容を変更することはできませんので、ジャンプ先から戻る際に使用するチャンネルを固定にする必要があることに注意してください。
戻り先の最後に再度ジャンプ用コマンドを格納すれば、同じコマンドバッファを繰り返し実行させることができます。最初のコマンドバッファを実行するには、nngxAdd3DCommand()
の bufferaddr
と buffersize
にそのコマンドバッファの先頭アドレスと最初のキックコマンドまでのサイズ、copycmd
に GL_FALSE
を渡して呼び出してください。各ジャンプ用コマンドに含まれるチャンネル 1 のコマンドサイズには、ジャンプ元への戻り先アドレスから次のキックコマンドまでのサイズを設定してください。
この方法を用いれば、以下のような処理を行うことができます。
- 特定の描画処理を繰り返し実行
- ジャンプ先の情報を編集して描画処理を分岐
- 描画処理をモジュール化し、ジャンプ用コマンドのみでシーンを構成
8.8.24. 未記載のビットに対する設定について
これまでに説明したレジスタのうち、情報が記載されていないビットの設定には、バイトイネーブルに 0 を設定することによりアクセスを行わないものや、固定値を設定しているものがあります。それらのビットへのアクセスに関する情報を記載します。記載のないビットに関しては、GPU に影響がないものとして任意の値を設定することができますが、なるべくバイトイネーブルに 0 を設定することを推奨します。また、レジスタそのものの情報が記載されていない場合は、設定を行わないでください。
固定値を設定するように記載されているレジスタは、nngxInitialize()
の実行時に各固定値で初期化されますので、アプリケーションで初期化するためのコマンドを発行する必要はありません。固定値を設定するビットと、値の変更が可能なビットが同じレジスタの同じバイト存在する場合は、変更する値と固定値とを同時に書き込む必要があります。
レジスタ | 説明 |
---|---|
0x0061 のビット [ 31 : 8 ] | バイトイネーブルに 0 を設定し、アクセスしないでください。 |
0x0062 のビット [ 31 : 8 ] | バイトイネーブルに 0 を設定し、アクセスしないでください。 |
0x006A のビット [ 31 : 24 ] | バイトイネーブルに 0 を設定し、アクセスしないでください。 |
0x006E のビット [ 24 : 24 ] | 1 を設定してください。 |
0x0080 のビット [ 3 : 3 ] と ビット [ 31 : 24 ] |
0 を設定してください。 |
0x0080 のビット [ 12 : 12 ] | 1 を設定してください。 |
0x0080 のビット [ 23 : 17 ] | このレジスタのビット [ 16 : 16 ] への書き込みでテクスチャキャッシュのクリアを行うときは 0 を設定してください。それ以外の場合はバイトイネーブルに 0 を設定し、アクセスしないでください。 |
0x0083 のビット [ 17 : 16 ] | 0 を設定してください。 |
0x0093 のビット [ 17 : 16 ] | 0 を設定してください。 |
0x009B のビット [ 17 : 16 ] | 0 を設定してください。 |
0x00AC のビット [ 10 : 3 ] | 0x60 を設定してください。 |
0x00AD のビット [ 31 : 8 ] | 0xE0C080 を設定してください。 |
0x00E0 のビット [ 25 : 24 ] | 0 を設定してください。 |
0x0100 のビット [ 25 : 16 ] | 0x0E4 を設定してください。 |
0x0110 のビット [ 31 : 1 ] | 0 を設定してください。 |
0x0111 のビット [ 31 : 1 ] | 0 を設定してください。 |
0x011E のビット [ 24 : 24 ] | 1 を設定してください。 |
0x01C0 のビット [ 9 : 8 ] | 0 を設定してください。 |
0x01C0 のビット [ 19 : 18 ] | 0 を設定してください。 |
0x01C0 のビット [ 29 : 28 ] | 0 を設定してください。 |
0x01C3 のビット [ 11 : 8 ] | 0x4 を設定してください。 |
0x01C3 のビット [ 31 : 31 ] | 1 を設定してください。 |
0x01C4 のビット [ 18 : 18 ] | 1 を設定してください。 |
0x0229 のビット [ 9 : 9 ] | 0 を設定してください。 |
0x0229 のビット [ 23 : 16 ] | バイトイネーブルに 0 を設定し、アクセスしないでください。 |
0x0244 のビット [ 31 : 8 ] | バイトイネーブルに 0 を設定し、アクセスしないでください。 |
0x0245 のビット [ 7 : 1 ] | 0 を設定してください。 |
0x0245 のビット [ 31 : 8 ] | バイトイネーブルに 0 を設定し、アクセスしないでください。 |
0x0253 のビット [ 31 : 16 ] | バイトイネーブルに 0 を設定し、アクセスしないでください。 |
0x025E のビット [ 16 : 16 ] | バイトイネーブルに 0 を設定し、アクセスしないでください。 |
0x025F のビット [ 31 : 1 ] | 0 を設定してください。 |
0x0280 のビット [ 31 : 16 ] | 0x7FFF を設定してください。 |
0x0289 のビット [ 23 : 16 ] | バイトイネーブルに 0 を設定し、アクセスしないでください。 |
0x028A のビット [ 31 : 16 ] | 0x7FFF を設定してください。 |
0x028D のビット [ 31 : 16 ] | 0x0000 を設定してください。 |
0x02B0 のビット [ 31 : 16 ] | 0x7FFF を設定してください。 |
0x02B9 のビット [ 15 : 8 ] | 0x00 を設定してください。 |
0x02B9 のビット [ 23 : 16 ] | バイトイネーブルに 0 を設定し、アクセスしないでください。 |
0x02B9 のビット [ 31 : 24 ] | 0xA0 を設定してください。 |
0x02BA のビット [ 31 : 16 ] | 0x7FFF を設定してください。 |
0x02BD のビット [ 31 : 16 ] | 0x0000 を設定してください。 |
8.8.25. ジオメトリシェーダを使用するときのレジスタ設定
SDK が提供するジオメトリシェーダを使用する際に、「8.8.20. ジオメトリシェーダ設定レジスタ(0x0280 ~ 0x02AF ほか)」で説明したレジスタにどのような値を設定するのかを紹介します。
8.8.25.1. ポイントシェーダ
ポイントシェーダの使用時に設定するレジスタの値を以下に示します。
レジスタ | 説明 |
---|---|
0x004F のビット [ 2 : 0 ] | リンクした頂点シェーダで定義されている出力レジスタの個数を設定します。generic 属性は個数に含みません。 |
0x0050 ~ 0x0056 |
リンクした頂点シェーダで定義した出力レジスタの属性を 0x0050 から詰めて設定します。 0x0050 には 0x03020100 を設定します。generic 属性としてポイントサイズが出力されますが、本レジスタには影響しません。続けて、小さいインデックスの出力レジスタから順に、定義した属性を 0x0051 から詰めて設定します。 例えば、ポイントスプライトであれば、頂点座標の次にテクスチャ座標が設定されるはずなので、 未使用属性の部分は 0x1F で各バイトを埋めます。 |
0x0064 | リンクした頂点シェーダで定義した出力レジスタの属性に従います。 |
0x006F | リンクした頂点シェーダで定義した出力レジスタの属性に従います。 |
0x0229 のビット [ 31 : 31 ] | 0 を設定します。 |
0x0242 のビット [ 3 : 0 ] | リンクした頂点シェーダに入力する頂点属性数 – 1 を設定します。 |
0x024A のビット [ 3 : 0 ] | リンクした頂点シェーダで定義されている出力レジスタの個数 – 1 を設定します。generic 属性は個数に含まれます。 |
0x0251 のビット [ 3 : 0 ] | リンクした頂点シェーダで定義されている出力レジスタの個数 – 1 を設定します。generic 属性は個数に含まれます。 |
0x0252 | 0x00000000 を設定します。 |
0x0254 のビット [ 4 : 0 ] | 設定する必要はありません。 |
0x025E のビット [ 3 : 0 ] | リンクした頂点シェーダで定義されている出力レジスタの個数 – 1 を設定します。generic 属性は個数に含みません。 |
0x0280 のビット [ 15 : 0 ] | 0x0000 を設定します。 |
0x0281 のビット [ 23 : 0 ] | 設定する必要はありません。 |
0x0282 のビット [ 23 : 0 ] | 設定する必要はありません。 |
0x0283 のビット [ 23 : 0 ] | 設定する必要はありません。 |
0x0284 のビット [ 23 : 0 ] | 設定する必要はありません。 |
0x0289 のビット [ 3 : 0 ] | リンクした頂点シェーダで定義されている出力レジスタの個数 – 1 を設定します。generic 属性は個数に含まれます。 |
0x0289 のビット [ 15 : 8 ] | 0x00 を設定します。 |
0x0289 のビット [ 31 : 24 ] | 0x08 を設定します。 |
0x028D のビット [ 15 : 0 ] | リンクした頂点シェーダで定義されている出力レジスタの個数を N としたとき、((1 << N) - 1) を設定します。generic 属性は個数に含みません。 |
0x0290 ~ 0x0293 |
浮動小数定数を設定するため、{ 0x0290, 0x0291, 0x0292, 0x0293 }に以下の値の組み合わせを設定します。
|
ポイントシェーダで設定する予約ユニフォームは特定のレジスタに割り当てられていますので、使用時には以下のレジスタに対しても設定を行わなければなりません。
予約ユニフォーム | 割り当てられているレジスタ |
---|---|
dmp_Point.viewport |
c67.xy
|
dmp_Point.distanceAttenuation |
b0
|
8.8.25.2. ラインシェーダ
ラインシェーダの使用時に設定するレジスタの値を以下に示します。
レジスタ | 説明 |
---|---|
0x004F のビット [ 2 : 0 ] | リンクした頂点シェーダで定義されている出力レジスタの個数を設定します。 |
0x0050 ~ 0x0056 |
リンクした頂点シェーダで定義した出力レジスタの属性を 0x0050 から詰めて設定します。 0x0050 には 0x03020100 を設定します。続けて、小さいインデックスの出力レジスタから順に、定義した属性を 0x0051 から詰めて設定します。 未使用属性の部分は 0x1F で各バイトを埋めます。 |
0x0064 | リンクした頂点シェーダで定義した出力レジスタの属性に従います。 |
0x006F | リンクした頂点シェーダで定義した出力レジスタの属性に従います。 |
0x0229 のビット [ 31 : 31 ] | 0 を設定します。 |
0x0242 のビット [ 3 : 0 ] | リンクした頂点シェーダに入力する頂点属性数 – 1 を設定します。 |
0x024A のビット [ 3 : 0 ] | リンクした頂点シェーダで定義されている出力レジスタの個数 – 1 を設定します。 |
0x0251 のビット [ 3 : 0 ] | リンクした頂点シェーダで定義されている出力レジスタの個数 – 1 を設定します。 |
0x0252 | 0x00000000 を設定します。 |
0x0254 のビット [ 4 : 0 ] | 設定する必要はありません。 |
0x025E のビット [ 3 : 0 ] | リンクした頂点シェーダで定義されている出力レジスタの個数 – 1 を設定します。 |
0x0280 のビット [ 15 : 0 ] | 0x0000 を設定します。ビット [ 15 : 15 ] は描画するたびに設定する必要があります。 |
0x0281 のビット [ 23 : 0 ] | 設定する必要はありません。 |
0x0282 のビット [ 23 : 0 ] | 設定する必要はありません。 |
0x0283 のビット [ 23 : 0 ] | 設定する必要はありません。 |
0x0284 のビット [ 23 : 0 ] | 設定する必要はありません。 |
0x0289 のビット [ 3 : 0 ] | リンクした頂点シェーダで定義されている出力レジスタの個数 – 1 を設定します。 |
0x0289 のビット [ 15 : 8 ] | 0x00 を設定します。 |
0x0289 のビット [ 31 : 24 ] | 0x08 を設定します。 |
0x028D のビット [ 15 : 0 ] | リンクした頂点シェーダで定義されている出力レジスタの個数を N としたとき、((1 << N) - 1) を設定します。 |
0x0290 ~ 0x0293 |
浮動小数定数を設定するため、{ 0x0290, 0x0291, 0x0292, 0x0293 }に以下の値の組み合わせを設定します。
|
ラインシェーダで設定する予約ユニフォームは特定のレジスタに割り当てられていますので、使用時には以下のレジスタに対しても設定を行わなければなりません。
予約ユニフォーム | 割り当てられているレジスタ |
---|---|
dmp_Line.width |
c67.xyzw
|
8.8.25.3. シルエットシェーダ
シルエットシェーダの使用時に設定するレジスタの値を以下に示します。
レジスタ | 説明 |
---|---|
0x004F のビット [ 2 : 0 ] | 0x2 を設定します。 |
0x0050 ~ 0x0056 | 0x0050 に 0x03020100、0x0051 に 0x0B0A0908、0x0052 ~ 0x0056 に 0x1F1F1F1F を設定します。 |
0x0064 | 0x00000000 を設定します。 |
0x006F | 0x00000003 を設定します。 |
0x0229 のビット [ 31 : 31 ] | 0 を設定します。 |
0x0242 のビット [ 3 : 0 ] | リンクした頂点シェーダに入力する頂点属性数 – 1 を設定します。 |
0x024A のビット [ 3 : 0 ] | 0x2 を設定します。 |
0x0251 のビット [ 3 : 0 ] | 0x2 を設定します。 |
0x0252 | 0x00000000 を設定します。 |
0x0254 のビット [ 4 : 0 ] | 設定する必要はありません。 |
0x025E のビット [ 3 : 0 ] | 0x1 を設定します。 |
0x0280 のビット [ 15 : 0 ] | 0x0000 を設定します。ビット [ 15 : 15 ] は描画するたびに設定する必要があります。 |
0x0281 のビット [ 23 : 0 ] | 設定する必要はありません。 |
0x0282 のビット [ 23 : 0 ] | 設定する必要はありません。 |
0x0283 のビット [ 23 : 0 ] | 設定する必要はありません。 |
0x0284 のビット [ 23 : 0 ] | 設定する必要はありません。 |
0x0289 のビット [ 3 : 0 ] | 頂点シェーダから出力される頂点属性は頂点座標、カラー、法線の 3 つですので、0x2 を設定します。 |
0x0289 のビット [ 15 : 8 ] | 0x00 を設定します。 |
0x0289 のビット [ 31 : 24 ] | 0x08 を設定します。 |
0x028D のビット [ 15 : 0 ] | 0x0003 を設定します。 |
0x0290 ~ 0x0293 |
浮動小数定数を設定するため、{ 0x0290, 0x0291, 0x0292, 0x0293 }に以下の値の組み合わせを設定します。
|
シルエットシェーダで設定する予約ユニフォームは特定のレジスタに割り当てられていますので、使用時には以下のレジスタに対しても設定を行わなければなりません。
予約ユニフォーム | 割り当てられているレジスタ |
---|---|
dmp_Shilhouette.width |
c71.xy
|
dmp_Shilhouette.openEdgeDepthBias |
c71.z
|
dmp_Shilhouette.color |
c72.xyzw
|
dmp_Shilhouette.openEdgeColor |
c73.xyzw
|
dmp_Shilhouette.openEdgeWidth |
c74.xyzw
|
dmp_Shilhouette.acceptEmptyTriangles |
b0
|
dmp_Shilhouette.saceleByW |
b1
|
dmp_Shilhouette.frontFaceCCW |
b2
|
dmp_Shilhouette.openEdgeWidthScaleByW |
b3
|
dmp_Shilhouette.openEdgeDepthBiasScaleByW |
b4
|
8.8.25.4. Catmull-Clark サブディビジョンシェーダ
Catmull-Clark サブディビジョンシェーダの使用時に設定するレジスタの値を以下に示します。
レジスタ | 説明 |
---|---|
0x004F のビット [ 2 : 0 ] | リンクした頂点シェーダで定義されている出力レジスタの個数を設定します。 |
0x0050 ~ 0x0056 |
リンクした頂点シェーダで定義した出力レジスタの属性を 0x0050 から詰めて設定します。 0x0050 には 0x03020100 を設定します。続けて、小さいインデックスの出力レジスタから順に、定義した属性を 0x0051 から詰めて設定します。 未使用属性の部分は 0x1F で各バイトを埋めます。 |
0x0064 | リンクした頂点シェーダで定義した出力レジスタの属性に従います。 |
0x006F | リンクした頂点シェーダで定義した出力レジスタの属性に従います。 |
0x0229 のビット [ 31 : 31 ] | 1 を設定します。 |
0x0242 のビット [ 3 : 0 ] | リンクした頂点シェーダに入力する頂点属性数 – 1 を設定します。 |
0x024A のビット [ 3 : 0 ] | リンクした頂点シェーダで定義されている出力レジスタの個数 – 1 を設定します。 |
0x0251 のビット [ 3 : 0 ] | リンクした頂点シェーダで定義されている出力レジスタの個数 – 1 を設定します。 |
0x0252 | 0x00000001 を設定します。 |
0x0254 のビット [ 4 : 0 ] | 0x03 を設定します。 |
0x025E のビット [ 3 : 0 ] | リンクした頂点シェーダで定義されている出力レジスタの個数 – 1 を設定します。 |
0x0280 のビット [ 15 : 0 ] | 0x0000 を設定します。ビット [ 15 : 15 ] は描画するたびに設定する必要があります。 |
0x0281 のビット [ 23 : 0 ] | 設定する必要はありません。 |
0x0282 のビット [ 23 : 0 ] |
リンクしたジオメトリシェーダのプログラムオブジェクトのファイルによって設定する値が変化します。 DMP_subdivision1.obj ならば 0x0212FF を設定します。 |
0x0283 のビット [ 23 : 0 ] | 設定する必要はありません。 |
0x0284 のビット [ 23 : 0 ] | 設定する必要はありません。 |
0x0289 のビット [ 3 : 0 ] | リンクした頂点シェーダで定義されている出力レジスタの個数 – 1 を設定します。 |
0x0289 のビット [ 15 : 8 ] | 0x01 を設定します。 |
0x0289 のビット [ 31 : 24 ] | 0x08 を設定します。 |
0x028D のビット [ 15 : 0 ] | リンクした頂点シェーダで定義されている出力レジスタの個数を N としたとき、((1 << N) - 1) を設定します。 |
0x0290 ~ 0x0293 |
浮動小数定数を設定するため、{ 0x0290, 0x0291, 0x0292, 0x0293 }に以下の値の組み合わせを設定します。
さらに、 DMP_subdivision2.obj の場合のみ DMP_subdivision3.obj の場合のみ DMP_subdivision4.obj の場合のみ DMP_subdivision5.obj の場合のみ DMP_subdivision6.obj の場合のみ |
Catmull-Clark サブディビジョンシェーダで設定する予約ユニフォームは特定のレジスタに割り当てられていますので、使用時には以下のレジスタに対しても設定を行わなければなりません。
予約ユニフォーム | 割り当てられているレジスタ |
---|---|
dmp_Subdivision.Level |
c74.x
|
dmp_Subdivision.fragmentLightingEnabled |
b2
|
8.8.25.5. ループサブディビジョンシェーダ
ループサブディビジョンシェーダの使用時に設定するレジスタの値を以下に示します。
レジスタ | 説明 |
---|---|
0x004F のビット [ 2 : 0 ] | リンクした頂点シェーダで定義されている出力レジスタの個数を設定します。generic 属性は個数に含みません。 |
0x0050 ~ 0x0056 |
リンクした頂点シェーダで定義した出力レジスタの属性を 0x0050 から詰めて設定します。 0x0050 には 0x03020100 を設定します。続けて、小さいインデックスの出力レジスタから順に、定義した属性を 0x0051 から詰めて設定します。generic 属性は無視します。 未使用属性の部分は 0x1F で各バイトを埋めます。 |
0x0064 | リンクした頂点シェーダで定義した出力レジスタの属性に従います。 |
0x006F | リンクした頂点シェーダで定義した出力レジスタの属性に従います。 |
0x0229 のビット [ 31 : 31 ] | 1 を設定します。 |
0x0242 のビット [ 3 : 0 ] | リンクした頂点シェーダに入力する頂点属性数 – 1 を設定します。 |
0x024A のビット [ 3 : 0 ] | リンクした頂点シェーダで定義されている出力レジスタの個数 – 1 を設定します。generic 属性は個数に含まれます。 |
0x0251 のビット [ 3 : 0 ] | リンクした頂点シェーダで定義されている出力レジスタの個数 – 1 を設定します。generic 属性は個数に含まれます。 |
0x0252 | 0x00000001 を設定します。 |
0x0254 のビット [ 4 : 0 ] | 0x02 を設定します。 |
0x025E のビット [ 3 : 0 ] | リンクした頂点シェーダで定義されている出力レジスタの個数 – 1 を設定します。generic 属性は個数に含みません。 |
0x0280 のビット [ 15 : 0 ] | 0x0000 を設定します。ビット [ 15 : 15 ] は描画するたびに設定する必要があります。 |
0x0281 のビット [ 23 : 0 ] | 設定する必要はありません。 |
0x0282 のビット [ 23 : 0 ] | 設定する必要はありません。 |
0x0283 のビット [ 23 : 0 ] | 設定する必要はありません。 |
0x0284 のビット [ 23 : 0 ] | 設定する必要はありません。 |
0x0289 のビット [ 3 : 0 ] | リンクした頂点シェーダで定義されている出力レジスタの個数 – 1 を設定します。generic 属性は個数に含まれます。 |
0x0289 のビット [ 15 : 8 ] | 0x01 を設定します。 |
0x0289 のビット [ 31 : 24 ] | 0x08 を設定します。 |
0x028D のビット [ 15 : 0 ] | リンクした頂点シェーダで定義されている出力レジスタの個数を N としたとき、((1 << N) - 1) を設定します。generic 属性は個数に含みません。 |
0x0290 ~ 0x0293 |
浮動小数定数を設定するため、{ 0x0290, 0x0291, 0x0292, 0x0293 }に以下の値の組み合わせを設定します。
|
ループサブディビジョンシェーダで設定する予約ユニフォームは特定のレジスタに割り当てられていますので、使用時には以下のレジスタに対しても設定を行わなければなりません。
予約ユニフォーム | 割り当てられているレジスタ |
---|---|
dmp_Subdivision.Level |
c86.x
|
dmp_Subdivision.fragmentLightingEnabled |
b0
|
8.8.25.6. パーティクルシステムシェーダ
パーティクルシステムシェーダの使用時に設定するレジスタの値を以下に示します。
レジスタ | 説明 |
---|---|
0x004F のビット [ 2 : 0 ] | 0x3 を設定します。 |
0x0050 ~ 0x0056 |
0x0050 に 0x03020100、0x0051 に 0x0B0A0908、0x0052 にはテクスチャ座標 2 を使用する場合は 0x17160D0C を、使用しない場合は 0x1F1F0D0C を設定します。 0x0053 ~ 0x0056 には 0x1F1F1F1F を設定します。 |
0x0064 | 0x00000000 を設定します。 |
0x006F | テクスチャ座標 2 を使用する場合は 0x00000503 を、使用しない場合は 0x00000103 を設定します。 |
0x0229 のビット [ 31 : 31 ] | 0 を設定します。 |
0x0242 のビット [ 3 : 0 ] | リンクした頂点シェーダに入力する頂点属性数 – 1 を設定します。 |
0x024A のビット [ 3 : 0 ] | 0x4 を設定します。 |
0x0251 のビット [ 3 : 0 ] | 0x4 を設定します。 |
0x0252 | 0x01004302 を設定します。 |
0x0254 のビット [ 4 : 0 ] | 設定する必要はありません。 |
0x025E のビット [ 3 : 0 ] | 0x2 を設定します。 |
0x0280 のビット [ 15 : 0 ] | 0x0000 を設定します。 |
0x0281 のビット [ 23 : 0 ] | 設定する必要はありません。 |
0x0282 のビット [ 23 : 0 ] | 設定する必要はありません。 |
0x0283 のビット [ 23 : 0 ] | 設定する必要はありません。 |
0x0284 のビット [ 23 : 0 ] | 0x0100FE を設定します。 |
0x0289 のビット [ 3 : 0 ] | 頂点シェーダから出力される頂点属性は頂点座標、制御点のバウンディングボックスサイズ 4 つの計 5 つですので、0x4 を設定します。 |
0x0289 のビット [ 15 : 8 ] | 0x01 を設定します。 |
0x0289 のビット [ 31 : 24 ] | 0x08 を設定します。 |
0x028D のビット [ 15 : 0 ] | 0x0007 を設定します。 |
0x0290 ~ 0x0293 |
浮動小数定数を設定するため、{ 0x0290, 0x0291, 0x0292, 0x0293 }に以下の値の組み合わせを設定します。
|
パーティクルシステムシェーダで設定する予約ユニフォームは特定のレジスタに割り当てられていますので、使用時には以下のレジスタに対しても設定を行わなければなりません。
予約ユニフォーム | 割り当てられているレジスタ |
---|---|
dmp_PartSys.color |
c26.xyzw ~ c29.xyzw |
dmp_PartSys.viewport |
c30.xy
|
dmp_PartSys.pointSize |
c31.xy
|
dmp_PartSys.time |
c31.z
|
dmp_PartSys.speed |
c31.w
|
dmp_PartSys.distanceAttenuation |
c32.xyz
|
dmp_PartSys.countMax |
c32.w
|
dmp_PartSys.randSeed |
c33.xyzw
|
dmp_PartSys.aspect |
c34.xyzw ~ c37.xyzw |
dmp_PartSys.randomCore |
c38.xyzw
|
8.9. レジスタに設定する値へのフォーマット変換
レジスタに設定する値のいくつかは、アプリケーションで設定した値から内部フォーマットに変換されて設定されています。そのほとんどは 32 ビット浮動小数点数から変換された値となっています。
8.9.1. 24 ビット浮動小数点数への変換
32 ビット浮動小数点数から 24 ビット浮動小数点数(符号部 1 ビット、指数部 7 ビット、仮数部 16 ビット)への変換コードを以下に示します。_inarg
に 32 ビット浮動小数点数を渡すと、_outarg
の unsigned int
型変数に 24 ビット浮動小数点数が格納されます。
#define UTL_F2F_16M7E(_inarg, _outarg) \ { \ unsigned uval_, m_; \ int e_; \ float f_; \ static const int bias_ = 128 - (1 << (7 - 1)); \ f_ = (_inarg); \ uval_ = *(unsigned*)&f_; \ e_ = (uval_ & 0x7fffffff) ? (((uval_ >> 23) & 0xff) - bias_) : 0; \ m_ = (uval_ & 0x7fffff) >> (23 - 16); \ if (e_ >= 0) \ _outarg = m_ | (e_ << 16) | ((uval_ >> 31) << (16 + 7)); \ else \ _outarg = ((uval_ >> 31) << (16 + 7)); \ }
8.9.2. 16 ビット浮動小数点数への変換
32 ビット浮動小数点数から 16 ビット浮動小数点数(符号部 1 ビット、指数部 5 ビット、仮数部 10 ビット)への変換コードを以下に示します。_inarg
に 32 ビット浮動小数点数を渡すと、_outarg
の unsigned int
型変数に 16 ビット浮動小数点数が格納されます。
#define UTL_F2F_10M5E(_inarg, _outarg) \ { \ unsigned uval_, m_; \ int e_; \ float f_; \ static const int bias_ = 128 - (1 << (5 - 1)); \ f_ = (_inarg); \ uval_ = *(unsigned*)&f_; \ e_ = (uval_ & 0x7fffffff) ? (((uval_ >> 23) & 0xff) - bias_) : 0; \ m_ = (uval_ & 0x7fffff) >> (23 - 10); \ if (e_ >= 0) \ _outarg = m_ | (e_ << 10) | ((uval_ >> 31) << (10 + 5)); \ else \ _outarg = ((uval_ >> 31) << (10 + 5)); \ }
8.9.3. 31 ビット浮動小数点数への変換
32 ビット浮動小数点数から 31 ビット浮動小数点数(符号部 1 ビット、指数部 7 ビット、仮数部 23 ビット)への変換コードを以下に示します。_inarg
に 32 ビット浮動小数点数を渡すと、_outarg
の unsigned int
型変数に 31 ビット浮動小数点数が格納されます。
#define UTL_F2F_23M7E(_inarg, _outarg) \ { \ unsigned uval_, m_; \ int e_; \ float f_; \ static const int bias_ = 128 - (1 << (7 - 1)); \ f_ = (_inarg); \ uval_ = *(unsigned*)&f_; \ e_ = (uval_ & 0x7fffffff) ? (((uval_ >> 23) & 0xff) - bias_) : 0; \ m_ = (uval_ & 0x7fffff) >> (23 - 23); \ if (e_ >= 0) \ _outarg = m_ | (e_ << 23) | ((uval_ >> 31) << (23 + 7)); \ else \ _outarg = ((uval_ >> 31) << (23 + 7)); \ }
8.9.4. 20 ビット浮動小数点数への変換
32 ビット浮動小数点数から 20 ビット浮動小数点数(符号部 1 ビット、指数部 7 ビット、仮数部 12 ビット)への変換コードを以下に示します。_inarg
に 32 ビット浮動小数点数を渡すと、_outarg
の unsigned int
型変数に 20 ビット浮動小数点数が格納されます。
#define UTL_F2F_12M_7E(_inarg, _outarg) \ { \ unsigned uval_, m_; \ int e_; \ float f_; \ static const int bias_ = 128 - (1 << (7 - 1)); \ f_ = (_inarg); \ uval_ = *(unsigned*)&f_; \ e_ = (uval_ & 0x7fffffff) ? (((uval_ >> 23) & 0xff) - bias_) : 0; \ m_ = (uval_ & 0x7fffff) >> (23 - 12); \ if (e_ >= 0) \ _outarg = m_ | (e_ << 12) | ((uval_ >> 31) << (12 + 7)); \ else \ _outarg = ((uval_ >> 31) << (12 + 7)); \ }
8.9.5. 小数部 7 ビットの符号つき 8 ビット固定小数点数への変換
32 ビット浮動小数点数から 8 ビット固定小数点数(小数部 7 ビットの符号つき)への変換コードを以下に示します。負の値は 2 の補数で表現します。_inarg
に 32 ビット浮動小数点数を渡すと、_outarg
に 8 ビット固定小数点数が格納されます。
#define UTL_F2FX_8W_1I_T(_inarg, _outarg) \ { \ float f_; \ unsigned v_; \ f_ = (_inarg); \ v_ = *(unsigned*)&f_; \ if (f_ == 0.f || (v_ & 0x7f800000) == 0x7f800000) \ _outarg = 0; \ else \ { \ f_ += 0.5f * (1 << 1); \ f_ *= 1 << (8 - 1); \ if (f_ < 0) \ f_ = 0; \ else if (f_ >= (1 << 8)) \ f_ = (1 << 8) - 1; \ if (f_ >= (1 << (8 - 1))) \ _outarg = (unsigned)(f_ - (1 << (8 - 1))); \ else \ _outarg = (unsigned)(f_ + (1 << (8 - 1))); \ } \ }
8.9.6. 小数部 11 ビットの符号つき 12 ビット固定小数点数への変換
32 ビット浮動小数点数から 12 ビット固定小数点数(小数部 11 ビットの符号つき)への変換コードを以下に示します。小数部は絶対値ですので、負の値は 2 の補数ではありません。_inarg
に 32 ビット浮動小数点数を渡すと、_outarg
に 12 ビット固定小数点数が格納されます。
#define UTL_F2FX_12W_1I_F(_inarg, _outarg) \ { \ float f_; \ unsigned v_; \ f_ = (_inarg); \ v_ = *(unsigned*)&f_; \ if (f_ == 0.f || (v_ & 0x7f800000) == 0x7f800000) \ _outarg = 0; \ else \ { \ f_ *= (1 << (12 - 1)); \ if (f_ < 0) \ { \ _outarg = 1 << (12 - 1); \ f_ = -f_; \ } \ else \ _outarg = 0; \ if (f_ >= (1 << (12 - 1))) f_ = (1 << (12 - 1)) - 1; \ _outarg |= (unsigned)(f_); \ } \ }
8.9.7. 小数部 11 ビットの符号つき 12 ビット固定小数点数への変換 2
32 ビット浮動小数点数から 12 ビット固定小数点数(小数部 11 ビットの符号つき)への変換コードを以下に示します。負の値は 2 の補数で表現します。_inarg
に 32 ビット浮動小数点数を渡すと、_outarg
に 12 ビット固定小数点数が格納されます。
#define UTL_F2FX_12W_1I_T(_inarg, _outarg) \ { \ float f_; \ unsigned v_; \ f_ = (_inarg); \ v_ = *(unsigned*)&f_; \ if (f_ == 0.f || (v_ & 0x7f800000) == 0x7f800000) \ _outarg = 0; \ else \ { \ f_ += 0.5f * (1 << 1); \ f_ *= 1 << (12 - 1); \ if (f_ < 0) \ f_ = 0; \ else if (f_ >= (1 << 12)) \ f_ = (1 << 12) - 1; \ if (f_ >= (1 << (12 - 1))) \ _outarg = (unsigned)(f_ - (1 << (12 - 1))); \ else \ _outarg = (unsigned)(f_ + (1 << (12 - 1))); \ } \ }
8.9.8. 小数部 8 ビットの符号つき 13 ビット固定小数点数への変換
32 ビット浮動小数点数から 13 ビット固定小数点数(小数部 8 ビットの符号つき)への変換コードを以下に示します。負の値は 2 の補数で表現します。_inarg
に 32 ビット浮動小数点数を渡すと、_outarg
に 13 ビット固定小数点数が格納されます。
#define UTL_F2FX_13W_5I_T(_inarg, _outarg) \ { \ float f_; \ unsigned v_; \ f_ = (_inarg); \ v_ = *(unsigned*)&f_; \ if (f_ == 0.f || (v_ & 0x7f800000) == 0x7f800000) \ _outarg = 0; \ else \ { \ f_ += 0.5f * (1 << 5); \ f_ *= 1 << (13 - 5); \ if (f_ < 0) \ f_ = 0; \ else if (f_ >= (1 << 13)) \ f_ = (1 << 13) - 1; \ if (f_ >= (1 << (13 - 1))) \ _outarg = (unsigned)(f_ - (1 << (13 - 1))); \ else \ _outarg = (unsigned)(f_ + (1 << (13 - 1))); \ } \ }
8.9.9. 小数部 11 ビットの符号つき 13 ビット固定小数点数への変換
32 ビット浮動小数点数から 13 ビット固定小数点数(小数部 11 ビットの符号つき)への変換コードを以下に示します。負の値は 2 の補数で表現します。_inarg
に 32 ビット浮動小数点数を渡すと、_outarg
に 13 ビット固定小数点数が格納されます。
#define UTL_F2FX_13W_2I_T(_inarg, _outarg) \ { \ float f_; \ unsigned v_; \ f_ = (_inarg); \ v_ = *(unsigned*)&f_; \ if (f_ == 0.f || (v_ & 0x7f800000) == 0x7f800000) \ _outarg = 0; \ else \ { \ f_ += 0.5f * (1 << 2); \ f_ *= 1 << (13 - 2); \ if (f_ < 0) \ f_ = 0; \ else if (f_ >= (1 << 13)) \ f_ = (1 << 13) - 1; \ if (f_ >= (1 << (13 - 1))) \ _outarg = (unsigned)(f_ - (1 << (13 - 1))); \ else \ _outarg = (unsigned)(f_ + (1 << (13 - 1))); \ } \ }
8.9.10. 小数部 12 ビットの符号つき 16 ビット固定小数点数への変換
32 ビット浮動小数点数から 16 ビット固定小数点数(小数部 12 ビットの符号つき)への変換コードを以下に示します。負の値は 2 の補数で表現します。_inarg
に 32 ビット浮動小数点数を渡すと、_outarg
に 16 ビット固定小数点数が格納されます。
#define UTL_F2FX_16W_4I_T(_inarg, _outarg) \ { \ float f_; \ unsigned v_; \ f_ = (_inarg); \ v_ = *(unsigned*)&f_; \ if (f_ == 0.f || (v_ & 0x7f800000) == 0x7f800000) \ _outarg = 0; \ else \ { \ f_ += 0.5f * (1 << 4); \ f_ *= 1 << (16 - 4); \ if (f_ < 0) \ f_ = 0; \ else if (f_ >= (1 << 16)) \ f_ = (1 << 16) - 1; \ if (f_ >= (1 << (16 - 1))) \ _outarg = (unsigned)(f_ - (1 << (16 - 1))); \ else \ _outarg = (unsigned)(f_ + (1 << (16 - 1))); \ } \ }
8.9.11. 小数部 0 ビットの符号なし 8 ビット固定小数点数への変換
32 ビット浮動小数点数から 8 ビット固定小数点数(小数部 0 ビットの符号なし)への変換コードを以下に示します。_inarg
に 32 ビット浮動小数点数を渡すと、_outarg
に 8 ビット固定小数点数が格納されます。
#define UTL_F2UFX_8W_8I(_inarg, _outarg) \ { \ float f_ = (_inarg); \ unsigned val_; \ unsigned v_ = *(unsigned*)&f_; \ if (f_ <= 0 || (v_ & 0x7f800000) == 0x7f800000) \ val_ = 0; \ else \ { \ f_ *= 1 << (8 - 8); \ if (f_ >= (1 << 8)) \ val_ = (1 << 8) - 1; \ else \ val_ = (unsigned)(f_); \ } \ (_outarg) = val_; \ }
8.9.12. 小数部 11 ビットの符号なし 11 ビット固定小数点数への変換
32 ビット浮動小数点数から 11 ビット固定小数点数(小数部 11 ビットの符号なし)への変換コードを以下に示します。_inarg
に 32 ビット浮動小数点数を渡すと、_outarg
に 11 ビット固定小数点数が格納されます。
#define UTL_F2UFX_11W_0I(_inarg, _outarg) \ { \ float f_ = (_inarg); \ unsigned val_; \ unsigned v_ = *(unsigned*)&f_; \ if (f_ <= 0 || (v_ & 0x7f800000) == 0x7f800000) \ val_ = 0; \ else \ { \ f_ *= 1 << (11 - 0); \ if (f_ >= (1 << 11)) \ val_ = (1 << 11) - 1; \ else \ val_ = (unsigned)(f_); \ } \ (_outarg) = val_; \ }
8.9.13. 小数部 12 ビットの符号なし 12 ビット固定小数点数への変換
32 ビット浮動小数点数から 12 ビット固定小数点数(小数部 12 ビットの符号なし)への変換コードを以下に示します。_inarg
に 32 ビット浮動小数点数を渡すと、_outarg
に 12 ビット固定小数点数が格納されます。
#define UTL_F2UFX_12W_0I(_inarg, _outarg) \ { \ float f_ = (_inarg); \ unsigned val_; \ unsigned v_ = *(unsigned*)&f_; \ if (f_ <= 0 || (v_ & 0x7f800000) == 0x7f800000) \ val_ = 0; \ else \ { \ f_ *= 1 << (12 - 0); \ if (f_ >= (1 << 12)) \ val_ = (1 << 12) - 1; \ else \ val_ = (unsigned)(f_); \ } \ (_outarg) = val_; \ }
8.9.14. 小数部 24 ビットの符号なし 24 ビット固定小数点数への変換
32 ビット浮動小数点数から 24 ビット固定小数点数(小数部 24 ビットの符号なし)への変換コードを以下に示します。_inarg
に 32 ビット浮動小数点数を渡すと、_outarg
に 24 ビット固定小数点数が格納されます。
#define UTL_F2UFX_24W_0I(_inarg, _outarg) \ { \ float f_ = (_inarg); \ unsigned val_; \ unsigned v_ = *(unsigned*)&f_; \ if (f_ <= 0 || (v_ & 0x7f800000) == 0x7f800000) \ val_ = 0; \ else \ { \ f_ *= 1 << (24 - 0); \ if (f_ >= (1 << 24)) \ val_ = (1 << 24) - 1; \ else \ val_ = (unsigned)(f_); \ } \ (_outarg) = val_; \ }
8.9.15. 小数部 8 ビットの符号なし 24 ビット固定小数点数への変換
32 ビット浮動小数点数から 24 ビット固定小数点数(小数部 8 ビットの符号なし)への変換コードを以下に示します。_inarg
に 32 ビット浮動小数点数を渡すと、_outarg
に 24 ビット固定小数点数が格納されます。
#define UTL_F2UFX_24W_16I(_inarg, _outarg) \ { \ float f_ = (_inarg); \ unsigned val_; \ unsigned v_ = *(unsigned*)&f_; \ if (f_ <= 0 || (v_ & 0x7f800000) == 0x7f800000) \ val_ = 0; \ else \ { \ f_ *= 1 << (24 - 16); \ if (f_ >= (1 << 24)) \ val_ = (1 << 24) - 1; \ else \ val_ = (unsigned)(f_); \ } \ (_outarg) = val_; \ }
8.9.16. 浮動小数点数(0 ~ 1)から符号なし 8 ビット整数への変換
0 ~ 1 の範囲の 32 ビット浮動小数点数から符号なし 8 ビット整数への変換コードを以下に示します。f
に 32 ビット浮動小数点数を渡すと、符号なし 8 ビット整数が返ります。
((unsigned)(0.5f + (f) * (float)((1 << 8) - 1)))
8.9.17. 浮動小数点数(0 ~ 1)から符号なし 8 ビット整数への変換 2
0 ~ 1 の範囲の 32 ビット浮動小数点数から符号なし 8 ビット整数への変換コードを以下に示します。f
に 32 ビット浮動小数点数を渡すと、符号なし 8 ビット整数が返ります。
((unsigned)((f) * (float)((1 << 8) - 1)))
8.9.18. 浮動小数点数(-1 ~ 1)から符号つき 8 ビット整数への変換
-1 ~ 1 の範囲の 32 ビット浮動小数点数から符号つき 8 ビット整数への変換コードを以下に示します。f
に 32 ビット浮動小数点数を渡すと、符号つき 8 ビット整数が返ります。
(((unsigned int)(fabs(127.f * (f))) & 0x7f)|(f < 0 ? 0x80 : 0))
8.9.19. 16 ビット浮動小数点数から 32 ビット浮動小数点数への変換
16 ビット浮動小数点数(符号部 1 ビット、指数部 5 ビット、仮数部 10 ビット)から 32 ビット浮動小数点数への変換コードを以下に示します。_inarg
に unsigned int
型変数に格納された 16 ビット浮動小数点数を渡すと、_outarg
の float
型変数に 32 ビット浮動小数点数が格納されます。
#define UTL_U2F_10M5E(_inarg, _outarg) \ { \ int e_; \ unsigned m_; \ unsigned u_ = (_inarg); \ const int width_ = 10 + 5 + 1; \ const int bias_ = 128 - (1 << (5 - 1)); \ e_ = (u_ >> 10) & ((1 << 5) - 1); \ m_ = u_ & ((1 << 10) - 1); \ if (u_ & ((1 << (width_ - 1)) - 1)) \ u_ = ((u_ >> (5 + 10)) << 31) | (m_ << (23 - 10)) | ((e_ + bias_) << 23); \ else \ u_ = ((u_ >> (5 + 10)) << 31); \ (_outarg) = *(float*)&u_; \ }
8.10. レジスタマップ
「8.8. PICA レジスタ情報」で紹介したレジスタ情報のレジスタマップを示します。レジスタマップは、関連するページ、関数・予約ユニフォーム、更新される可能性のあるステートをアドレスごとにまとめて表にしています。
8.10.1. レジスタ 0x0010 ~ 0x00FF のレジスタマップ
アドレス | 参照先 | 関数・予約ユニフォーム | NN_GX_STATE_ |
---|---|---|---|
0x0010 | 8.8.22 |
nngxSplitDrawCmdlist() 、nngxTransferRenderImage() |
- |
0x0040 | 8.8.15 |
glCullFace() 、glDisable(GL_CULL_FACE) 、glEnable(GL_CULL_FACE) 、glFrontFace() |
OTHERS |
0x0041~0x0044 | 8.8.10 |
glViewport()
|
OTHERS |
0x0047 | 8.8.9.4 |
dmp_FragOperation.enableClippingPlane
|
FSUNIFORM |
0x0048~0x004B |
dmp_FragOperation.clippingPlane
|
FSUNIFORM | |
0x004D | 8.8.9.3 |
dmp_FragOperation.wScale 、glDepthRangef() 、glDisable(GL_POLYGON_OFFSET_FILL) 、glEnable(GL_POLYGON_OFFSET_FILL) 、glPolygonOffset() |
FSUNIFORM TRIOFFSET |
0x004E | |||
0x004F | 出力レジスタの使用数設定 | SHADERPROGRAM | |
0x0050~0x0056 | 出力レジスタの属性設定 | SHADERPROGRAM | |
0x0061 | 8.8.13 |
glEarlyDepthFuncDMP()
|
OTHERS |
0x0062 |
glDisable(GL_EARLY_DEPTH_TEST_DMP) 、glEnable(GL_EARLY_DEPTH_TEST_DMP) |
OTHERS | |
0x0063 |
glClear(GL_EARLY_DEPTH_BUFFER_BIT_DMP)
|
- | |
0x0064 | 8.8.20.10 | 出力レジスタの属性設定 | SHADERPROGRAM |
0x0065~0x0067 | 8.8.16 |
glDisable(GL_SCISSOR_TEST) 、glEnable(GL_SCISSOR_TEST) 、glScissor() |
SCISSOR |
0x0068 | 8.8.10 |
glViewport()
|
OTHERS |
0x006A | 8.8.13 |
glClearEarlyDepthDMP()
|
OTHERS |
0x006D | 8.8.9.3 |
dmp_FragOperation.wScale
|
FSUNIFORM |
0x006E | 8.8.3 |
glRenderbufferStorage() 、glTexture2DImage2D() |
FRAMEBUFFER |
0x006F | 出力属性のクロック制御 | SHADERPROGRAM | |
0x0080 | 8.8.6.2 |
dmp_Texture[i].samplerType (i=0,1,2)
|
TEXTURE |
8.8.6.3 |
dmp_Texture[2].texcoord 、dmp_Texture[3].texcoord 、dmp_Texture[3].samplerType |
FSUNIFORM | |
8.8.19 |
glDrawArrays() 、glDrawElements() |
- | |
0x0081 | 8.8.6.8 |
glTexParameter()
|
TEXTURE |
0x0082 | 8.8.6.6 |
glTexImage2D() 、glCompressedTexImage2D() 、glCopyTexImage2D() |
TEXTURE |
0x0083 | 8.8.6.2 |
dmp_Texture[0].samplerType
|
TEXTURE |
8.8.6.7 |
glTexImage2D()、glCompressedTexImage2D()、glCopyTexImage2D()
|
TEXTURE | |
8.8.6.8 |
glTexParameter()
|
TEXTURE | |
0x0084 | 8.8.6.8 |
glTexParameter() 、glCopyTexImage2D() 、glCompressedTexImage2D() 、glTexImage2D() |
TEXTURE |
0x0085~0x008A | 8.8.2 |
glTexImage2D() 、glCompressedTexImage2D() 、glCopyTexImage2D() |
TEXTURE |
0x008B | 8.8.6.1 |
dmp_Texture[0].perspectiveShadow 、dmp_Texture[0].shadowZBias |
FSUNIFORM |
0x008E | 8.8.6.7 |
glTexImage2D() 、glCompressedTexImage2D() 、glCopyTexImage2D() |
TEXTURE |
0x008F | 8.8.5.1 |
dmp_FragmentLighting.enabled
|
FSUNIFORM |
0x0091 | 8.8.6.8 |
glTexParameter()
|
TEXTURE |
0x0092 | 8.8.6.6 |
glTexImage2D() 、glCompressedTexImage2D() 、glCopyTexImage2D() |
TEXTURE |
0x0093 | 8.8.6.7 |
glTexImage2D() 、glCompressedTexImage2D() 、glCopyTexImage2D() |
TEXTURE |
8.8.6.8 |
glTexParameter()
|
TEXTURE | |
0x0094 | 8.8.6.8 |
glTexImage2D() 、glCompressedTexImage2D() 、glCopyTexImage2D() |
TEXTURE |
0x0095 | 8.8.2 |
glTexImage2D() 、glCompressedTexImage2D() 、glCopyTexImage2D() |
TEXTURE |
0x0096 | 8.8.6.7 |
glTexImage2D() 、glCompressedTexImage2D() 、glCopyTexImage2D() |
TEXTURE |
0x0099 | 8.8.6.8 |
glTexParameter()
|
TEXTURE |
0x009A | 8.8.6.6 |
glTexImage2D() 、glCompressedTexImage2D() 、glCopyTexImage2D() |
TEXTURE |
0x009B | 8.8.6.7 |
glTexImage2D() 、glCompressedTexImage2D() 、glCopyTexImage2D() |
TEXTURE |
8.8.6.8 |
glTexParameter()
|
TEXTURE | |
0x009C | 8.8.6.8 |
glTexParameter() 、glCopyTexImage2D() 、glCompressedTexImage2D() 、glTexImage2D() |
TEXTURE |
0x009D | 8.8.2 |
glTexImage2D() 、glCompressedTexImage2D() 、glCopyTexImage2D() |
TEXTURE |
0x009E | 8.8.6.7 |
glTexImage2D() 、glCompressedTexImage2D() 、glCopyTexImage2D() |
TEXTURE |
0x00A8 | 8.8.6.4 |
dmp_Texture[3].ptClampU 、dmp_Texture[3].ptClampV 、dmp_Texture[3].ptRgbMap 、dmp_Texture[3].ptAlphaMap 、dmp_Texture[3].ptAlphaSeparate 、dmp_Texture[3].ptNoiseEnable 、dmp_Texture[3].ptShiftU 、dmp_Texture[3].ptShiftV 、dmp_Texture[3].ptTexBias |
FSUNIFORM |
0x00A9~0x00AB |
dmp_Texture[3].ptNoiseU 、dmp_Texture[3].ptNoiseV |
FSUNIFORM | |
0x00AC |
dmp_Texture[3].ptMinFilter 、dmp_Texture[3].ptTexWidth 、dmp_Texture[3].ptTexBias |
FSUNIFORM | |
0x00AD |
dmp_Texture[3].ptTexOffset
|
FSUNIFORM | |
0x00AF | 8.8.6.5 |
dmp_Texture[3].ptSampler{RgbMap,AlphaMap,NoiseMap,R,G,B,A}
|
LUT |
0x00B0~0x00B7 | 参照テーブルへのデータ設定 | LUT | |
0x00C0 | 8.8.4 |
dmp_TexEnv[0].srcRgb 、dmp_TexEnv[0].srcAlpha |
FSUNIFORM |
0x00C1 |
dmp_TexEnv[0].operandRgb 、dmp_TexEnv[0].operandAlpha |
FSUNIFORM | |
0x00C2 |
dmp_TexEnv[0].combineRgb 、dmp_TexEnv[0].combineAlpha |
FSUNIFORM | |
0x00C3 |
dmp_TexEnv[0].constRgba
|
FSUNIFORM | |
0x00C4 |
dmp_TexEnv[0].scaleRgb 、dmp_TexEnv[0].scaleAlpha |
FSUNIFORM | |
0x00C8 | 8.8.4 |
dmp_TexEnv[1].srcRgb 、dmp_TexEnv[1].srcAlpha |
FSUNIFORM |
0x00C9 |
dmp_TexEnv[1].operandRgb 、dmp_TexEnv[1].operandAlpha |
FSUNIFORM | |
0x00CA |
dmp_TexEnv[1].combineRgb 、dmp_TexEnv[1].combineAlpha |
FSUNIFORM | |
0x00CB |
dmp_TexEnv[1].constRgba
|
FSUNIFORM | |
0x00CC |
dmp_TexEnv[1].scaleRgb 、dmp_TexEnv[1].scaleAlpha |
FSUNIFORM | |
0x00D0 | 8.8.4 |
dmp_TexEnv[2].srcRgb 、dmp_TexEnv[2].srcAlpha |
FSUNIFORM |
0x00D1 |
dmp_TexEnv[2].operandRgb 、dmp_TexEnv[2].operandAlpha |
FSUNIFORM | |
0x00D2 |
dmp_TexEnv[1].combineRgb 、dmp_TexEnv[1].combineAlpha |
FSUNIFORM | |
0x00D3 |
dmp_TexEnv[2].constRgba
|
FSUNIFORM | |
0x00D4 |
dmp_TexEnv[2].scaleRgb 、dmp_TexEnv[2].scaleAlpha |
FSUNIFORM | |
0x00D8 | 8.8.4 |
dmp_TexEnv[3].srcRgb 、dmp_TexEnv[3].srcAlpha |
FSUNIFORM |
0x00D9 |
dmp_TexEnv[3].operandRgb 、dmp_TexEnv[3].operandAlpha |
FSUNIFORM | |
0x00DA |
dmp_TexEnv[3].combineRgb 、dmp_TexEnv[3].combineAlpha |
FSUNIFORM | |
0x00DB |
dmp_TexEnv[3].constRgba
|
FSUNIFORM | |
0x00DC |
dmp_TexEnv[3].scaleRgb 、dmp_TexEnv[3].scaleAlpha |
FSUNIFORM | |
0x00E0 | 8.8.4.1 |
dmp_TexEnv[i].bufferInput (i=1,2,3,4)
|
FSUNIFORM |
8.8.7.1 |
dmp_Gas.shadingDensitySrc
|
FSUNIFORM | |
8.8.8.1 |
dmp_Fog.mode 、dmp_Fog.zFlip |
FSUNIFORM | |
0x00E1 | 8.8.8.1 |
dmp_Fog.color
|
FSUNIFORM |
0x00E4 | 8.8.7.1 |
dmp_Gas.attenuation
|
FSUNIFORM |
0x00E5 |
dmp_Gas.accMax
|
FSUNIFORM | |
0x00E6 | 8.8.8.2 |
dmp_Fog.sampler
|
LUT |
0x00E8~0x00EF | 参照テーブルへのデータ設定 | LUT | |
0x00F0 | 8.8.4 |
dmp_TexEnv[4].srcRgb 、dmp_TexEnv[4].srcAlpha |
FSUNIFORM |
0x00F1 |
dmp_TexEnv[4].operandRgb 、dmp_TexEnv[4].operandAlpha |
FSUNIFORM | |
0x00F2 |
dmp_TexEnv[4].combineRgb 、dmp_TexEnv[4].combineAlpha |
FSUNIFORM | |
0x00F3 |
dmp_TexEnv[4].constRgba
|
FSUNIFORM | |
0x00F4 |
dmp_TexEnv[4].scaleRgb 、dmp_TexEnv[4].scaleAlpha |
FSUNIFORM | |
0x00F8 | 8.8.4 |
dmp_TexEnv[5].srcRgb 、dmp_TexEnv[5].srcAlpha |
FSUNIFORM |
0x00F9 |
dmp_TexEnv[5].operandRgb 、dmp_TexEnv[5].operandAlpha |
FSUNIFORM | |
0x00FA |
dmp_TexEnv[5].combineRgb 、dmp_TexEnv[5].combineAlpha |
FSUNIFORM | |
0x00FB |
dmp_TexEnv[5].constRgba
|
FSUNIFORM | |
0x00FC |
dmp_TexEnv[5].scaleRgb 、dmp_TexEnv[5].scaleAlpha |
FSUNIFORM | |
0x00FD | 8.8.4.1 |
dmp_TexEnv[0].bufferColor
|
FSUNIFORM |
8.10.2. レジスタ 0x0100 ~ 0x01FF のレジスタマップ
アドレス | 参照先 | 関数・予約ユニフォーム | NN_GX_STATE_ |
---|---|---|---|
0x0100 | 8.8.9.1 |
dmp_FragOperation.mode
|
FSUNIFORM |
8.8.12 |
glDisable(GL_BLEND) 、glEnable(GL_BLEND) 、glDisable(GL_COLOR_LOGIC_OP) 、glEnable(GL_COLOR_LOGIC_OP) |
OTHERS | |
0x0101 | 8.8.12 |
glBlendEquation() 、glBlendEquationSeparate() 、glBlendFunc() 、glBlendFuncSeparate() |
OTHERS |
0x0102 |
glLogicOp()
|
OTHERS | |
0x0103 |
glBlendColor()
|
OTHERS | |
0x0104 | 8.8.9.5 |
dmp_FragOperation.enableAlphaTest 、dmp_FragOperation.alphaTestFunc 、dmp_FragOperation.alphaRefValue |
FSUNIFORM |
0x0105 | 8.8.14 |
glDisable(GL_STENCIL_TEST) 、glEnable(GL_STENCIL_TEST) 、glStencilFunc() 、glStencilMask() |
OTHERS |
0x0106 |
glStencilOp()
|
OTHERS | |
0x0107 | 8.8.11 |
glDisable(GL_DEPTH_TEST) 、glEnable(GL_DEPTH_TEST) 、glDepthFunc() 、glDepthMask() |
OTHERS |
8.8.17 |
glColorMask()
|
OTHERS | |
0x0110 | 8.8.21 |
glFinish() 、glFlush() 、nngxSplitDrawCmdlist() 、nngxTransferRenderImage() |
FRAMEBUFFER FBACCESS |
0x0111 |
glFinish() 、glFlush() 、glDrawArrays() 、glDrawElements() 、nngxSplitDrawCmdlist() 、nngxTransferRenderImage() |
FRAMEBUFFER FBACCESS |
|
0x0112~0x0115 | 8.8.9.6 |
dmp_FragOperation.mode 、glDisable(GL_BLEND) 、glEnable(GL_BLEND) 、glDisable(GL_COLOR_LOGIC_OP) 、glEnable(GL_COLOR_LOGIC_OP) 、glColorMask() 、glDisable(GL_DEPTH_TEST) 、glEnable(GL_DEPTH_TEST) 、glDepthMask() 、glDisable(GL_STENCIL_TEST) 、glEnable(GL_STENCIL_TEST) 、glStencilMask() |
FBACCESS |
0x0116 | 8.8.3 |
glRenderbufferStorage() 、glTexture2DImage2D() |
FRAMEBUFFER |
0x0117 | |||
0x0118 | 8.8.13 |
glDisable(GL_EARLY_DEPTH_TEST_DMP) 、glEnable(GL_EARLY_DEPTH_TEST_DMP) |
OTHERS |
0x011B | 8.8.18 |
glRenderBlockModeDMP()
|
OTHERS |
0x011C~0x011E | 8.8.3 |
glRenderbufferStorage() 、glTexImage2D() 、glTexture2DImage2D() |
FRAMEBUFFER |
0x0120 | 8.8.7.1 |
dmp_Gas.lightXY
|
FSUNIFORM |
0x0121 |
dmp_Gas.lightZ
|
FSUNIFORM | |
0x0122 | |||
0x0123 | 8.8.7.2 |
dmp_Gas.sampler{TR,TG,TB}
|
LUT |
0x0124 | 参照テーブルへのデータ設定 | LUT | |
0x0125 | 8.8.7.1 |
dmp_Gas.autoAcc
|
- |
0x0126 | 8.8.7.1 |
dmp_Gas.deltaZ
|
FSUNIFORM |
8.8.11 |
glDepthFunc()
|
OTHERS | |
0x0130 | 8.8.9.2 |
dmp_FragOperation.penumbraScale 、dmp_FragOperation.penumbraBias |
FSUNIFORM |
0x0140 | 8.8.5.3 |
dmp_FragmentMaterial.specular0 、dmp_FragmentLightSource[0].specular0 |
FSUNIFORM |
0x0141 |
dmp_LightEnv.lutEnabledRefl 、dmp_FragmentMaterial.specular1 、dmp_FragmentLightSource[0].specular1 |
FSUNIFORM | |
0x0142 |
dmp_FragmentMaterial.diffuse 、dmp_FragmentLightSource[0].diffuse |
FSUNIFORM | |
0x0143 |
dmp_FragmentMaterial.ambient 、dmp_FragmentLightSource[0].ambient |
FSUNIFORM | |
0x0144 |
dmp_FragmentLightSource[0].position
|
FSUNIFORM | |
0x0145 | |||
0x0146 |
dmp_FragmentLightSource[0].spotDirection
|
FSUNIFORM | |
0x0147 | |||
0x0149 |
dmp_FragmentLightSource[0].position 、dmp_FragmentLightSource[0].twoSideDiffuse 、dmp_FragmentLightSource[0].geomFactor0 、dmp_FragmentLightSource[0].geomFactor1 |
FSUNIFORM | |
0x014A |
dmp_FragmentLightSource[0].distanceAttenuationBias
|
FSUNIFORM | |
0x014B |
dmp_FragmentLightSource[0].distanceAttenuationScale
|
FSUNIFORM | |
0x0150 | 8.8.5.3 |
dmp_FragmentMaterial.specular0 、dmp_FragmentLightSource[1].specular0 |
FSUNIFORM |
0x0151 |
dmp_LightEnv.lutEnabledRefl 、dmp_FragmentMaterial.specular1 、dmp_FragmentLightSource[1].specular1 |
FSUNIFORM | |
0x0152 |
dmp_FragmentMaterial.diffuse 、dmp_FragmentLightSource[1].diffuse |
FSUNIFORM | |
0x0153 |
dmp_FragmentMaterial.ambient 、dmp_FragmentLightSource[1].ambient |
FSUNIFORM | |
0x0154 |
dmp_FragmentLightSource[1].position
|
FSUNIFORM | |
0x0155 | |||
0x0156 |
dmp_FragmentLightSource[1].spotDirection
|
FSUNIFORM | |
0x0157 | |||
0x0159 |
dmp_FragmentLightSource[1].position 、dmp_FragmentLightSource[1].twoSideDiffuse 、dmp_FragmentLightSource[1].geomFactor0 、dmp_FragmentLightSource[1].geomFactor1 |
FSUNIFORM | |
0x015A |
dmp_FragmentLightSource[1].distanceAttenuationBias
|
FSUNIFORM | |
0x015B |
dmp_FragmentLightSource[1].distanceAttenuationScale
|
FSUNIFORM | |
0x0160 | 8.8.5.3 |
dmp_FragmentMaterial.specular0 、dmp_FragmentLightSource[2].specular0 |
FSUNIFORM |
0x0161 |
dmp_LightEnv.lutEnabledRefl 、dmp_FragmentMaterial.specular1 、dmp_FragmentLightSource[2].specular1 |
FSUNIFORM | |
0x0162 |
dmp_FragmentMaterial.diffuse 、dmp_FragmentLightSource[2].diffuse |
FSUNIFORM | |
0x0163 |
dmp_FragmentMaterial.ambient 、dmp_FragmentLightSource[2].ambient |
FSUNIFORM | |
0x0164 |
dmp_FragmentLightSource[2].position
|
FSUNIFORM | |
0x0165 | |||
0x0166 |
dmp_FragmentLightSource[2].spotDirection
|
FSUNIFORM | |
0x0167 | |||
0x0169 |
dmp_FragmentLightSource[2].position 、dmp_FragmentLightSource[2].twoSideDiffuse 、dmp_FragmentLightSource[2].geomFactor0 、dmp_FragmentLightSource[2].geomFactor1 |
FSUNIFORM | |
0x016A |
dmp_FragmentLightSource[2].distanceAttenuationBias
|
FSUNIFORM | |
0x016B |
dmp_FragmentLightSource[2].distanceAttenuationScale
|
FSUNIFORM | |
0x0170 | 8.8.5.3 |
dmp_FragmentMaterial.specular0 、dmp_FragmentLightSource[3].specular0 |
FSUNIFORM |
0x0171 |
dmp_LightEnv.lutEnabledRefl 、dmp_FragmentMaterial.specular1 、dmp_FragmentLightSource[3].specular1 |
FSUNIFORM | |
0x0172 |
dmp_FragmentMaterial.diffuse 、dmp_FragmentLightSource[3].diffuse |
FSUNIFORM | |
0x0173 |
dmp_FragmentMaterial.ambient 、dmp_FragmentLightSource[3].ambient |
FSUNIFORM | |
0x0174 |
dmp_FragmentLightSource[3].position
|
FSUNIFORM | |
0x0175 | |||
0x0176 |
dmp_FragmentLightSource[3].spotDirection
|
FSUNIFORM | |
0x0177 | |||
0x0179 |
dmp_FragmentLightSource[3].position 、dmp_FragmentLightSource[3].twoSideDiffuse 、dmp_FragmentLightSource[3].geomFactor0 、dmp_FragmentLightSource[3].geomFactor1 |
FSUNIFORM | |
0x017A |
dmp_FragmentLightSource[3].distanceAttenuationBias
|
FSUNIFORM | |
0x017B |
dmp_FragmentLightSource[3].distanceAttenuationScale
|
FSUNIFORM | |
0x0180 | 8.8.5.3 |
dmp_FragmentMaterial.specular0 、dmp_FragmentLightSource[4].specular0 |
FSUNIFORM |
0x0181 |
dmp_LightEnv.lutEnabledRefl 、dmp_FragmentMaterial.specular1 、dmp_FragmentLightSource[4].specular1 |
FSUNIFORM | |
0x0182 |
dmp_FragmentMaterial.diffuse 、dmp_FragmentLightSource[4].diffuse |
FSUNIFORM | |
0x0183 |
dmp_FragmentMaterial.ambient 、dmp_FragmentLightSource[4].ambient |
FSUNIFORM | |
0x0184 |
dmp_FragmentLightSource[4].position
|
FSUNIFORM | |
0x0185 | |||
0x0186 |
dmp_FragmentLightSource[4].spotDirection
|
FSUNIFORM | |
0x0187 | |||
0x0189 |
dmp_FragmentLightSource[4].position 、dmp_FragmentLightSource[4].twoSideDiffuse 、dmp_FragmentLightSource[4].geomFactor0 、dmp_FragmentLightSource[4].geomFactor1 |
FSUNIFORM | |
0x018A |
dmp_FragmentLightSource[4].distanceAttenuationBias
|
FSUNIFORM | |
0x018B |
dmp_FragmentLightSource[4].distanceAttenuationScale
|
FSUNIFORM | |
0x0190 | 8.8.5.3 |
dmp_FragmentMaterial.specular0 、dmp_FragmentLightSource[5].specular0 |
FSUNIFORM |
0x0191 |
dmp_LightEnv.lutEnabledRefl 、dmp_FragmentMaterial.specular1 、dmp_FragmentLightSource[5].specular1 |
FSUNIFORM | |
0x0192 |
dmp_FragmentMaterial.diffuse 、dmp_FragmentLightSource[5].diffuse |
FSUNIFORM | |
0x0193 |
dmp_FragmentMaterial.ambient 、dmp_FragmentLightSource[5].ambient |
FSUNIFORM | |
0x0194 |
dmp_FragmentLightSource[5].position
|
FSUNIFORM | |
0x0195 | |||
0x0196 |
dmp_FragmentLightSource[5].spotDirection
|
FSUNIFORM | |
0x0197 | |||
0x0199 |
dmp_FragmentLightSource[5].position 、dmp_FragmentLightSource[5].twoSideDiffuse 、dmp_FragmentLightSource[5].geomFactor0 、dmp_FragmentLightSource[5].geomFactor1 |
FSUNIFORM | |
0x019A |
dmp_FragmentLightSource[5].distanceAttenuationBias
|
FSUNIFORM | |
0x019B |
dmp_FragmentLightSource[5].distanceAttenuationScale
|
FSUNIFORM | |
0x01A0 | 8.8.5.3 |
dmp_FragmentMaterial.specular0 、dmp_FragmentLightSource[6].specular0 |
FSUNIFORM |
0x01A1 |
dmp_LightEnv.lutEnabledRefl 、dmp_FragmentMaterial.specular1 、dmp_FragmentLightSource[6].specular1 |
FSUNIFORM | |
0x01A2 |
dmp_FragmentMaterial.diffuse 、dmp_FragmentLightSource[6].diffuse |
FSUNIFORM | |
0x01A3 |
dmp_FragmentMaterial.ambient 、dmp_FragmentLightSource[6].ambient |
FSUNIFORM | |
0x01A4 |
dmp_FragmentLightSource[6].position
|
FSUNIFORM | |
0x01A5 | |||
0x01A6 |
dmp_FragmentLightSource[6].spotDirection
|
FSUNIFORM | |
0x01A7 | |||
0x01A9 |
dmp_FragmentLightSource[6].position 、dmp_FragmentLightSource[6].twoSideDiffuse 、dmp_FragmentLightSource[6].geomFactor0 、dmp_FragmentLightSource[6].geomFactor1 |
FSUNIFORM | |
0x01AA |
dmp_FragmentLightSource[6].distanceAttenuationBias
|
FSUNIFORM | |
0x01AB |
dmp_FragmentLightSource[6].distanceAttenuationScale
|
FSUNIFORM | |
0x01B0 | 8.8.5.3 |
dmp_FragmentMaterial.specular0 、dmp_FragmentLightSource[7].specular0 |
FSUNIFORM |
0x01B1 |
dmp_LightEnv.lutEnabledRefl 、dmp_FragmentMaterial.specular1 、dmp_FragmentLightSource[7].specular1 |
FSUNIFORM | |
0x01B2 |
dmp_FragmentMaterial.diffuse 、dmp_FragmentLightSource[7].diffuse |
FSUNIFORM | |
0x01B3 |
dmp_FragmentMaterial.ambient 、dmp_FragmentLightSource[7].ambient |
FSUNIFORM | |
0x01B4 |
dmp_FragmentLightSource[7].position
|
FSUNIFORM | |
0x01B5 | |||
0x01B6 |
dmp_FragmentLightSource[7].spotDirection
|
FSUNIFORM | |
0x01B7 | |||
0x01B9 |
dmp_FragmentLightSource[7].position 、dmp_FragmentLightSource[7].twoSideDiffuse 、dmp_FragmentLightSource[7].geomFactor0 、dmp_FragmentLightSource[7].geomFactor1 |
FSUNIFORM | |
0x01BA |
dmp_FragmentLightSource[7].distanceAttenuationBias
|
FSUNIFORM | |
0x01BB |
dmp_FragmentLightSource[7].distanceAttenuationScale
|
FSUNIFORM | |
0x01C0 | 8.8.5.2 |
dmp_FragmentLighting.ambient 、dmp_FragmentMaterial.ambient 、dmp_FragmentMaterial.emission |
FSUNIFORM |
0x01C2 | 8.8.5.1 |
dmp_FragmentLightSource[i].enabled (i =0~7) |
FSUNIFORM |
0x01C3 | 8.8.5.8 |
dmp_LightEnv.invertShadow 、dmp_LightEnv.shadowAlpha 、dmp_LightEnv.shadowPrimary 、dmp_LightEnv.shadowSecondary 、dmp_LightEnv.shadowSelector |
FSUNIFORM |
8.8.5.9 |
dmp_LightEnv.bumpMode 、dmp_LightEnv.bumpRenorm 、dmp_LightEnv.bumpSelector 、dmp_LightEnv.clampHighlights 、dmp_LightEnv.config 、dmp_LightEnv.fresnelSelector |
FSUNIFORM | |
0x01C4 | 8.8.5.3 |
dmp_FragmentLightSource[i].distanceAttenuationEnabled (i=0~7)、dmp_FragmentLightSource[i].shadowed 、dmp_FragmentLightSource[i].spotEnabled |
FSUNIFORM |
8.8.5.9 |
dmp_LightEnv.fresnelSelector 、dmp_LightEnv.lutEnabledD0 、dmp_LightEnv.lutEnabledD1 、dmp_LightEnv.lutEnabledRefl |
FSUNIFORM | |
0x01C5 | 8.8.5.4 |
|
LUT |
0x01C6 | 8.8.5.1 |
dmp_FragmentLighting.enabled
|
FSUNIFORM |
0x01C8~0x01CF | 8.8.5.4 | 参照テーブルへのデータ設定 | LUT |
0x01D0 | 8.8.5.5 |
dmp_LightEnv.absLutInputD0 、dmp_LightEnv.absLutInputD1 、dmp_LightEnv.absLutInputSP 、dmp_LightEnv.absLutInputFR 、dmp_LightEnv.absLutInputRB 、dmp_LightEnv.absLutInputRG 、dmp_LightEnv.absLutInputRR |
FSUNIFORM |
0x01D1 | 8.8.5.6 |
dmp_LightEnv.lutInputD0 、dmp_LightEnv.lutInputD1 、dmp_LightEnv.lutInputSP 、dmp_LightEnv.lutInputFR 、dmp_LightEnv.lutInputRB 、dmp_LightEnv.lutInputRG 、dmp_LightEnv.lutInputRR |
FSUNIFORM |
0x01D2 | 8.8.5.7 |
dmp_LightEnv.lutScaleD0 、dmp_LightEnv.lutScaleD1 、dmp_LightEnv.lutScaleSP 、dmp_LightEnv.lutScaleFR 、dmp_LightEnv.lutScaleRB 、dmp_LightEnv.lutScaleRG 、dmp_LightEnv.lutScaleRR |
FSUNIFORM |
0x01D9 | 8.8.5.1 |
dmp_FragmentLightSource[i].enabled (i =0~7) |
FSUNIFORM |
8.10.3. レジスタ 0x0200 ~ 0x02FF のレジスタマップ
アドレス | 参照先 | 関数・予約ユニフォーム | NN_GX_STATE_ |
---|---|---|---|
0x0200 | 8.8.1.9 |
glBufferData()
|
VERTEX |
0x0201 |
glVertexAttribPointer()
|
VERTEX | |
0x0202 |
glEnableVertexAttribArray() 、glDisableVertexAttribArray() 、glVertexAttribPointer() |
VERTEX | |
0x0203~0x0226 |
glBufferData() 、glVertexAttribPointer() |
VERTEX | |
0x0227 | 8.8.1.9 |
glBufferData()
|
- |
8.8.19 |
glDrawElements()
|
- | |
0x0228 | 8.8.19 |
glDrawElements() 、glDrawArrays() |
- |
0x0229 |
glDrawElements()
|
SHADERMODE | |
0x022A |
glDrawArrays()
|
- | |
0x022E |
glDrawArrays()
|
- | |
0x022F |
glDrawElements()
|
- | |
0x0231 |
glDrawElements() 、glDrawArrays() |
- | |
0x0232 | 8.8.1.8 |
glVertexAttribPointer() 、glVertexAttrib{1234}f() 、glVertexAttrib{1234}fv() |
VERTEX |
0x0233~0x0235 | 頂点属性データの設定 | VERTEX | |
0x0238~0x023D | 8.8.23 |
コマンドバッファの実行
|
- |
0x0242 | 8.8.1.6 | 頂点属性の入力数設定 | SHADERPROGRAM |
0x0244 | 8.8.20 | 共用プロセッサ設定 | SHADERMODE |
0x0245 | 8.8.19 |
glDrawElements() 、glDrawArrays() |
- |
0x024A | 8.8.1.10 | 出力レジスタの使用数設定 | SHADERPROGRAM |
0x0251 | 8.8.1.10 | 出力レジスタの使用数設定 | SHADERPROGRAM |
0x0252 | 8.8.20.12 | サブディビジョンシェーダの使用設定 | SHADERPROGRAM |
0x0253 | 8.8.19 |
glDrawElements() 、glDrawArrays() |
- |
0x0254 | 8.8.20.12 | サブディビジョンシェーダの使用設定 | SHADERPROGRAM |
0x025E | 8.8.1.10 | 出力レジスタの使用数設定 | SHADERPROGRAM |
8.8.20.8 | 出力レジスタの使用数設定(ジオメトリシェーダ) | SHADERPROGRAM | |
8.8.19 |
glDrawElements() 、glDrawArrays() |
- | |
0x025F | 8.8.19 |
|
- |
0x0280 | 8.8.20.2 | ブールレジスタ(ジオメトリシェーダ) |
VSUNIFORM SHADERMODE |
0x0281~0x0284 | 8.8.20.3 | 整数レジスタ(ジオメトリシェーダ) |
VSUNIFORM SHADERMODE |
0x0289 | 8.8.20.6 | 頂点入力数設定レジスタ(ジオメトリシェーダ) | SHADERPROGRAM |
8.8.20.12 | ジオメトリシェーダ使用の設定 | SHADERMODE | |
0x028A | 8.8.20.5 | 開始アドレス設定レジスタ(ジオメトリシェーダ) |
SHADERPROGRAM SHADERMODE |
0x028B | 8.8.20.7 | 入力レジスタのマッピング設定レジスタ(ジオメトリシェーダ) | VERTEX |
0x028C | |||
0x028D | 8.8.20.9 | 出力レジスタのマスク設定レジスタ(ジオメトリシェーダ) |
SHADERPROGRAM SHADERMODE |
0x028F | 8.8.20.4 | プログラムコード設定レジスタ(ジオメトリシェーダ) | SHADERBINARY |
0x0290 | 8.8.20.1 | 浮動小数点定数レジスタ(ジオメトリシェーダ) |
SHADERFLOAT VSUNIFORM |
0x0291~0x0298 | 浮動小数点定数のロード(ジオメトリシェーダ) | ||
0x029B | 8.8.20.4 | プログラムコードのロードアドレス(ジオメトリシェーダ) | SHADERBINARY |
0x029C~0x02A3 | プログラムコードのロード(ジオメトリシェーダ) | ||
0x02A5 | 8.8.20.4 | Swizzle パターンのロードアドレス(ジオメトリシェーダ) | SHADERBINARY |
0x02A6~0x02AD | Swizzle パターンのロード(ジオメトリシェーダ) | ||
0x02B0 | 8.8.1.2 | ブールレジスタ |
VSUNIFORM SHADERMODE |
0x02B1~0x02B4 | 8.8.1.3 | 整数レジスタ |
VSUNIFORM SHADERMODE |
0x02B9 | 8.8.1.6 | 頂点入力数設定レジスタ |
SHADERPROGRAM SHADERMODE |
0x02BA | 8.8.1.5 | 開始アドレス設定レジスタ |
SHADERPROGRAM SHADERMODE |
0x02BB | 8.8.1.7 | 入力レジスタのマッピング設定レジスタ | VERTEX |
0x02BC | |||
0x02BD | 8.8.1.11 | 出力レジスタのマスク設定レジスタ |
SHADERPROGRAM SHADERMODE |
0x02BF | 8.8.1.4 | プログラムコード設定レジスタ | SHADERBINARY |
0x02C0 | 8.8.1.1 | 浮動小数点定数レジスタ |
SHADERFLOAT VSUNIFORM |
0x02C1~0x02C8 | 浮動小数点定数のロード | ||
0x02CB | 8.8.1.4 | プログラムコードのロードアドレス | SHADERBINARY |
0x02CC~0x02D3 | プログラムコードのロード | ||
0x02D5 | 8.8.1.4 | Swizzle パターンのロードアドレス | SHADERBINARY |
0x02D6~0x02DD | Swizzle パターンのロード |