8. コマンドキャッシュ

コマンドキャッシュとは、3D グラフィックスの描画で呼び出した関数がコマンドリストに蓄積した 3D コマンドをそのまま再使用する機能です。3D コマンドそのものを再利用しますので、本来ならば 3D コマンドを生成するために必要な関数呼び出しで発生するコストを削減し、CPU 処理の軽減を期待することができます。

コマンドキャッシュを利用してできることには以下のものがあります。

  • コマンドリストの保存
  • コマンドリストの再使用
  • コマンドリストのコピー
  • コマンドリストのエクスポート、インポート
  • 3D コマンドの追加
  • 3D コマンドの編集

この章では、コマンドキャッシュの利用方法を紹介し、3D コマンドの編集に必要な情報を提供します。

8.1. コマンドリストの保存

コマンドキャッシュは、コマンドリストに格納されている 3D コマンドバッファの内容と、キューイングされているコマンドリクエストを対象とする機能です。しかし、コマンドキャッシュは保存の開始と終了の宣言によって、コマンドリストを再使用するための情報を取得するだけですので、コマンドキャッシュとしてのオブジェクトは存在しません。保存の対象となったコマンドリストに蓄積された情報をそのまま利用するため、アプリケーションでコピーを作成していない限り、対象のコマンドリストをクリアしたり破棄したりするとコマンドキャッシュは機能しなくなります。

コマンドリストの保存を開始するには、nngxStartCmdlistSave() を呼び出します。

コード 8-1. コマンドリストの保存開始
void nngxStartCmdlistSave(void);

この関数で保存を開始したあと、終了させていない状態で再度呼び出した場合は GL_ERROR_8034_DMP のエラーを、オブジェクト名が 0 のコマンドリストをバインドしているときに呼び出した場合は GL_ERROR_8035_DMP のエラーを生成します。

コマンドリストの保存を終了し、コマンドキャッシュの情報を取得するには nngxStopCmdlistSave() を呼び出します。

コード 8-2. コマンドリストの保存終了
void nngxStopCmdlistSave(GLuint* bufferoffset, GLsizei* buffersize, 
        GLuint* requestid, GLsizei* requestsize);

コマンドキャッシュの情報として、bufferoffset には 3D コマンドバッファの保存開始オフセットが、buffersize には 3D コマンドバッファの保存バイトサイズが、requestid にはコマンドリクエストの保存開始 ID が、requestsize にはコマンドリクエストの保存数がそれぞれ返されます。コマンドリストの保存が開始されていない状態で呼び出した場合は GL_ERROR_8036_DMP のエラーを生成します。

コマンドリストの保存の開始と終了により、コマンドリストの 3D コマンドバッファに、パディング用のダミーコマンドが生成される場合があります。

図 8-1. コマンドリストの保存

nngxStartCmdlistSave nngxStopCmdlistSave

8.1.1. ステート

ステートとは、3D グラフィックスを機能ごとにまとめた設定のことです。gl 関数などが呼び出されると対応するステートが更新され、更新されたステートに関連して生成された 3D コマンドが 3D コマンドバッファに蓄積されます。そのため、ステートが更新されたかどうかは、描画に必要な 3D コマンドが保存され、コマンドキャッシュが正しく機能するかどうかに関係しています。

1 つのステートは 1 つ以上の gl 関数またはユニフォーム設定に対応しています。また、1 つの gl 関数が複数のステートを更新する可能性もあります。必要とする 3D コマンドが確実に保存されるようにするなど、アプリケーションでステートを指定するときは、ステートフラグの論理和で指定する必要があります。

表 8-1. ステートフラグ
ステートフラグ 説明
NN_GX_STATE_SHADERBINARY

シェーダバイナリのステートです。

glUseProgram() で切り替わった前後のプログラムオブジェクトにリンクされているシェーダオブジェクトが、異なる glShaderBinary() でロードされていた場合に更新されます。

更新された場合、シェーダアセンブラコードをロードするための 3D コマンドを生成します。

NN_GX_STATE_SHADERPROGRAM

シェーダプログラムのステートです。

glUseProgram() により、異なるプログラムオブジェクトに切り替わった場合に更新されます。

更新された場合、頂点属性の構成の設定などに関する 3D コマンドを生成します。前回のバリデーション時と比較して異なる設定のレジスタに関してのみ 3D コマンドが生成されます。

NN_GX_STATE_SHADERMODE

シェーダモードのステートです。

glUseProgram() により、ジオメトリシェーダの使用・不使用が切り替わった場合に更新されます。

更新された場合、ジオメトリシェーダの使用・不使用を切り替える 3D コマンドを生成します。

NN_GX_STATE_SHADERFLOAT

シェーダの浮動小数点数定義のステートです。

glUseProgram() により、アタッチされているシェーダオブジェクトが異なるプログラムオブジェクトに切り替わった場合に更新されます。

更新された場合、シェーダアセンブラで def 命令によって定義された値を浮動小数点数レジスタに設定する 3D コマンドを生成します。

NN_GX_STATE_VSUNIFORM

頂点シェーダのユニフォーム設定のステートです。

glUseProgram() により、異なるプログラムオブジェクトに切り替わった場合や、glUniform*() で頂点シェーダのユニフォームの値が設定された場合に更新されます。整数型のユニフォームは設定が変更された場合にのみステートが更新されますが、浮動小数点数型のユニフォームは設定が変更されなくても更新されます。

更新された場合、シェーダアセンブラでユニフォームとして定義された浮動小数点数レジスタ、ブールレジスタ、整数レジスタに値を設定する 3D コマンドを生成します。

NN_GX_STATE_FSUNIFORM

予約フラグメントシェーダのユニフォーム設定のステートです。

glUseProgram() により、異なるプログラムオブジェクトに切り替わった場合や、glUniform*() で予約フラグメントシェーダのユニフォームの値が設定された場合に更新されます。

更新された場合、予約フラグメントシェーダに関するレジスタに値を設定する 3D コマンドを生成します。

NN_GX_STATE_LUT

参照テーブルのステートです。

glBindTexture()glTexImage1D()glTexSubImage1D() により、参照テーブルの内容が変更された場合や、バインドされていた参照テーブルが glDeleteTextures() で削除された場合、glUseProgram() または glUniform*() で参照テーブルに関係するユニフォームの値が変更された場合に更新されます。

更新された場合、参照テーブルを設定する 3D コマンドを生成します。

NN_GX_STATE_TEXTURE

テクスチャ(プロシージャルテクスチャを除く)のステートです。

glBindTexture()glTexImage2D()glCopyTexImage2D()glCopyTexSubImage2D()glCompressedTexImage2D()glTexParameter*() が呼び出された場合や、バインドされているテクスチャが glDeleteTextures() で削除された場合、glUseProgram() または glUniform*() で予約フラグメントシェーダのユニフォーム "dmp_Texture[i].samplerType" の値が変更された場合に更新されます。

更新された場合、テクスチャユニットに関する 3D コマンド(プロシージャルテクスチャを除く)を生成します。

NN_GX_STATE_FRAMEBUFFER

フレームバッファのバッファ情報のステートです。

glBindFramebuffer()glBindFramebufferRenderbuffer()glFramebufferTexture2D()glDeleteFramebuffers()glBindRenderbuffer()glRenderbufferStorage()glDeleteRenderbuffers() が呼び出された場合に更新されます。

更新された場合、フレームバッファのフォーマットやバッファアドレスに関する 3D コマンドを生成します。

NN_GX_STATE_VERTEX

頂点属性データのステートです。

glBindBuffer()glBufferData()glBufferSubData()glEnableVertexAttribArray()glDisableVertexAttribArray()glVertexAttrib()glVertexAttribPointer()glUseProgram() が呼び出された場合や、バインドされている頂点バッファが glDeleteBuffers() で削除された場合に更新されます。

更新された場合、頂点属性データに関する 3D コマンドを生成します。

NN_GX_STATE_TRIOFFSET

ポリゴンオフセットのステートです。

GL_POLYGON_OFFSET_FILL の設定が glEnable()glDisable() により変更された場合や、glDepthRangef()glPolygonOffset() により設定が変更された場合、glUseProgram() が呼び出された場合に更新されます。

更新された場合、ポリゴンオフセットに関する 3D コマンドを生成します。

NN_GX_STATE_FBACCESS

フレームバッファのアクセス方法のステートです。

GL_COLOR_LOGIC_OPGL_BLENDGL_DEPTH_TESTGL_STENCIL_TESTGL_EARLY_DEPTH_TEST_DMP の設定が glEnable()glDisable() により変更された場合や、glDepthFunc()glEarlyDepthFuncDMP()glColorMask()glDepthMask()glStencilMask() により設定が変更された場合、glUniform*() で予約フラグメントシェーダのユニフォーム "dmp_FragOperation.mode" が設定された場合に更新されます。

更新された場合、フレームバッファの読み書きなどのアクセス方法に関する 3D コマンドを生成します。

NN_GX_STATE_SCISSOR

シザーテストのステートです。

GL_SCISSOR_TEST の設定が glEnable()glDisable() により変更された場合や、glScissor()glViewport() により設定が変更された場合、シザーテストが有効であるときにフレームバッファのサイズが変更された場合に更新されます。

更新された場合、シザーテストに関する 3D コマンドを生成します。

NN_GX_STATE_OTHERS

glDraw*() 以外で 3D コマンドを生成する関数のステートです。

glDrawElements()glDrawArrays() 以外で、3D コマンドが生成される関数が呼び出された場合に更新されます。

更新された場合に生成される 3D コマンドについては、表 8-3 を参照してください。

NN_GX_STATE_ALL 上記すべてを指定するためのフラグです。

8.1.2. コマンド生成

3D コマンドバッファに蓄積される 3D コマンドのほとんどは glDrawElements()glDrawArrays() で生成されます。これらの関数は内部でステートをチェックし、更新されたステートに関する 3D コマンドを生成します。これをバリデートと呼びます。

nngxValidateState() は、バリデートを任意のタイミングで行うことができます。また、nngxUpdateState() で、指定したステートフラグのステートを更新状態にし、次のタイミングで指定したステートの 3D コマンドをすべて生成させることができます。

コード 8-3. ステートのバリデートとステートフラグの指定
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_SHADERBINARYNN_GX_STATE_SHADERPROGRAMNN_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 より先、または同時に指定して呼び出さなければなりません。
表 8-2. nngxValidateState() が生成するエラー
エラー 原因
GL_ERROR_8066_DMP 呼び出した結果、3D コマンドバッファがオーバーフローした
GL_ERROR_806C_DMP バリデートにより各種エラーが発生した
GL_ERROR_80B2_DMP 3D コマンドバッファが設定されていない
GL_ERROR_80B3_DMP

有効なプログラムオブジェクトが設定されていない(glUseProgram() が一度も呼び出されていない、もしくは glUseProgram() を呼び出したときに program に 0 が指定されていた)状態で、プログラムオブジェクトに関連する以下のステートをバリデートしようとした。

  • NN_GX_STATE_SHADERBINARY
  • NN_GX_STATE_SHADERPROGRAM
  • NN_GX_STATE_SHADERMODE
  • NN_GX_STATE_SHADERFLOAT
  • NN_GX_STATE_VSUNIFORM
  • NN_GX_STATE_FSUNIFORM
  • NN_GX_STATE_LUT
  • NN_GX_STATE_VERTEX
  • NN_GX_STATE_TRIOFFSET
  • NN_GX_STATE_FBACCESS

バリデートによりエラーとなる原因には以下のものがあります。

  • 有効になっているテクスチャに対してテクスチャメモリがアロケートされていない。
    解決するには、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 コマンドが生成されます。

表 8-3. 3D コマンドを生成する関数
関数 生成条件
glBlendColor() 設定値を変更したとき。
glBlendEquation() 設定値を変更したとき。
glBlendEquationSeparate() 設定値を変更したとき。
glBlendFunc() 設定値を変更したとき。
glBlendFuncSeparate() 設定値を変更したとき。
glClearEarlyDepthDMP() 設定値を変更したとき。
glColorMask() 設定値を変更したとき。
glCullFace() 設定値を変更したとき。
glDepthFunc() 設定値を変更したとき。
glDepthMask() 設定値を変更したとき。
glDisable() GL_COLOR_LOGIC_OPGL_BLENDGL_DEPTH_TESTGL_EARLY_DEPTH_TEST_DMPGL_STENCIL_TESTGL_CULL_FACE の設定値を変更したとき。他の設定値に関しては変更しても生成されません。
glEarlyDepthFuncDMP() 設定値を変更したとき。
glEnable() GL_COLOR_LOGIC_OPGL_BLENDGL_DEPTH_TESTGL_EARLY_DEPTH_TEST_DMPGL_STENCIL_TESTGL_CULL_FACE の設定値を変更したとき。他の設定値に関しては変更しても生成されません。
glFrontFace() 設定値を変更したとき。
glLogicOp() 設定値を変更したとき。
glRenderBlockModeDMP() 設定値を変更したとき。
glStencilFunc() 設定値を変更したとき。
glStencilMask() 設定値を変更したとき。
glStencilOp() 設定値を変更したとき。
glViewport() 必ず生成する。

上表の関数のうち、一部機能(GL_COLOR_LOGIC_OPGL_BLENDGL_DEPTH_TESTGL_STENCIL_TESTGL_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() を呼び出すことでも、指定されたステートの完全コマンドを生成するように設定することができます。

コード 8-4. コマンド出力モードの設定
void nngxSetCommandGenerationMode(GLenum mode);

mode NN_GX_CMDGEN_MODE_CONDITIONAL を指定した場合は差分コマンドを生成するモードに設定します。デフォルトはこのモードです。NN_GX_CMDGEN_MODE_UNCONDITIONAL を指定した場合は完全コマンドを生成するモードに設定します。それ以外の値を mode に指定した場合は GL_ERROR_804D_DMP のエラーを生成します。現在のモード設定を nngxGetCommandGenerationMode() で取得することができます。

コード 8-5. コマンド出力モードの取得
void nngxGetCommandGenerationMode(GLenum* mode);

mode に現在のモード設定が返されます。

完全コマンドを生成するモードで影響を受けるステートには以下のものがあります。

  • 予約フラグメントシェーダのユニフォームの設定に関するステート
  • 頂点シェーダの整数型ユニフォームの設定に関するステート
  • 参照テーブルデータの設定に関するステート
  • 表 8-3 に記載されている関数に関するステート

更新されたステートの 3D コマンドに加えて、更新されたかどうかに関わらず、上記のステートに関しての完全コマンドが生成されます。ただし、参照テーブルに関連するステートすべてが更新されていても、3D コマンドは有効になっている参照テーブルの分だけが生成されます。参照テーブルが有効となる条件は以下のようになっています。

表 8-4. 参照テーブルが有効となる条件
参照テーブル 条件
フラグメントライティングの反射の赤成分(RR) dmp_FragmentLighting.enabledGL_TRUE が設定されている、かつ dmp_LightEnv.config の設定が RR を使用する設定になっている、かつ dmp_LightEnv.lutEnabledReflGL_TRUE が設定されている。
フラグメントライティングの反射の緑成分(RG) dmp_FragmentLighting.enabledGL_TRUE が設定されている、かつ dmp_LightEnv.config の設定が RG を使用する設定になっている、かつ dmp_LightEnv.lutEnabledReflGL_TRUE が設定されている。
フラグメントライティングの反射の青成分(RB) dmp_FragmentLighting.enabledGL_TRUE が設定されている、かつ dmp_LightEnv.config の設定が RB を使用する設定になっている、かつ dmp_LightEnv.lutEnabledReflGL_TRUE が設定されている。
フラグメントライティングのディストリビューションファクタ 0(D0) dmp_FragmentLighting.enabledGL_TRUE が設定されている、かつ dmp_LightEnv.config の設定が D0 を使用する設定になっている、かつ dmp_LightEnv.lutEnabledD0GL_TRUE が設定されている。
フラグメントライティングのディストリビューションファクタ 1(D1) dmp_FragmentLighting.enabledGL_TRUE が設定されている、かつ dmp_LightEnv.config の設定が D1 を使用する設定になっている、かつ dmp_LightEnv.lutEnabledD1GL_TRUE が設定されている。
フラグメントライティングのフレネルファクタ(FR) dmp_FragmentLighting.enabledGL_TRUE が設定されている、かつ dmp_LightEnv.config の設定が FR を使用する設定になっている、かつ dmp_LightEnv.fresnelSelectorGL_LIGHT_ENV_NO_FRESNEL_DMP 以外の値が設定されている。
フラグメントライティングのスポットライト減衰(SP) dmp_FragmentLighting.enabledGL_TRUE が設定されている、かつ dmp_LightEnv.config の設定が SP を使用する設定になっている、かつ dmp_FragmentLightSource[i].enabledGL_TRUE が設定されている、かつ dmp_FragmentLightSource[i].spotEnabledGL_TRUE が設定されている。
フラグメントライティングの距離減衰 dmp_FragmentLighting.enabledGL_TRUE が設定されている、かつ dmp_FragmentLightSource[i].enabledGL_TRUE が設定されている、かつ dmp_FragmentLightSource[i].distanceAttenuationEnabledGL_TRUE が設定されている。
プロシージャルテクスチャのRGB マッピングの F 関数 dmp_Texture[3].samplerTypeGL_TEXTURE_PROCEDURAL_DMP が設定されている。
プロシージャルテクスチャのアルファマッピングの F 関数 dmp_Texture[3].samplerTypeGL_TEXTURE_PROCEDURAL_DMP が設定されている、かつ dmp_Texture[3].ptAlphaSeparateGL_TRUE が設定されている。
プロシージャルテクスチャのノイズ変調関数 dmp_Texture[3].samplerTypeGL_TEXTURE_PROCEDURAL_DMP が設定されている、かつ dmp_Texture[3].ptNoiseEnableGL_TRUE が設定されている。
プロシージャルテクスチャのカラー参照テーブル dmp_Texture[3].samplerTypeGL_TEXTURE_PROCEDURAL_DMP が設定されている。
フォグのフォグ係数 dmp_Fog.modeGL_FALSE 以外の値が設定されている。
ガスのシェーディング参照テーブル dmp_Fog.modeGL_GAS_DMP が設定されている。

8.1.4. コマンドキャッシュの制限事項および注意事項

コマンドキャッシュを使用する場合、以下の制限事項および注意事項があります。

  • フラグメントライティングが有効(予約ユニフォーム dmp_FragmentLighting.enabledGL_TRUE)、かつ全光源が無効(予約ユニフォーム dmp_FragmentLightSource[i].enabled がすべて GL_FALSE)の場合、nngxValidateState() で予約フラグメントシェーダユニフォームのステートフラグ(NN_GX_STATE_FSUNIFORM)を指定してバリデートしても、その後で描画関数を呼び出したときに再度ライティングに関連する 3D コマンドが生成されます。
  • 予約ユニフォーム dmp_Gas.accMax に関連する 3D コマンドは、nngxValidateState() で予約フラグメントシェーダユニフォームのステートフラグ(NN_GX_STATE_FSUNIFORM)を指定してバリデートしても、その後で描画関数を呼び出したときに生成されます。
  • 予約フラグメントユニフォーム dmp_Gas.autoAccGL_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() で更新されているステートをステートフラグで取得することができます。

コード 8-6. 更新されたステートの取得
void nngxGetUpdatedState (GLbitfield* statemask);

8.1.6. ステート更新の無効化

nngxInvalidateState() でステートの更新を無効化することができます。

コード 8-7. ステート更新の無効化
void nngxInvalidateState (GLbitfield statemask);

statemask に更新を無効化するステートフラグを論理和で指定します。statemask に指定されたステートフラグに対応するステートは、更新されていても関連するコマンドが生成されなくなります。

8.2. コマンドリストの再使用

nngxUseSavedCmdlist() または nngxUseSavedCmdlistNoCacheFlush() にコマンドリストの保存によって取得したコマンドキャッシュの情報を渡すことで、3D コマンドおよびコマンドリクエストを再使用することができます。前者は追加する 3D コマンドのキャッシュフラッシュを行いますが、後者は行いません。

コード 8-8. コマンドリストの再使用
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 で指定されたステートに対してのみ完全コマンドを生成します。statemaskNN_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()copycmdGL_FALSE を指定したときと同じですが、cmdlist で指定したコマンドリストの 3D コマンドバッファのキャッシュフラッシュを行いません。3D コマンドバッファの領域がフラッシュされていることをアプリケーションで保証しなければなりません。

図 8-2. nngxUseSavedCmdlist() の copycmd による動作の違い

nngxUseSavedCmdlist

表 8-5. nngxUseSavedCmdlist() および nngxUseSavedCmdlistNoCacheFlush() が生成するエラー
エラー 原因
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 コマンドもコマンドリクエストも上書きされることに注意してください。

コード 8-9. コマンドリストのコピー
void nngxCopyCmdlist(GLuint scmdlist, GLuint dcmdlist);

scmdlist にコピー元のコマンドリスト、dcmdlist にコピー先のコマンドリストを指定します。

この関数の動作は直接コマンドキャッシュに関係しませんが、コマンドキャッシュの情報がオフセットを基準に作成されることから、コマンドリストの保存直後に作成したコピーを再利用することができます。そのため、コピー後はコピー元のコマンドリストをクリアすることもできます。

表 8-6. nngxCopyCmdlist() が生成するエラー
エラー 原因
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() は現在バインドされているコマンドリストに別のコマンドリストの情報すべてを追加でコピーすることができます。

コード 8-10. コマンドリストの追加コピー
void nngxAddCmdlist(GLuint cmdlist);

cmdlist にコピー元のコマンドリストを指定します。

コピー元のコマンドリストに蓄積されたすべてのコマンドは、現在バインドされているコマンドリストに追加で蓄積されます。現在バインドされているコマンドリストに、すでにコマンドが蓄積されている場合は蓄積済みコマンドのあとに、コマンドが追加されます。

バインドされているコマンドリストの 3D コマンドバッファが区切られた直後ではなく、かつ追加する側のコマンドリクエストの先頭のコマンドが 3D 実行コマンドではない場合は、ライブラリ内で nngxSplitDrawCmdlist() を呼び出し、コマンドバッファを区切ってから追加を行います。

バインドされているコマンドリストの 3D コマンドバッファが区切られた直後ではなく、かつ追加するコマンドリクエストの先頭のコマンドが 3D 実行コマンドである場合は、必要に応じてコピー先のコマンドバッファにダミーコマンドを追加することでアライメントしてからコマンドが追加されます。

ライブラリ内で nngxSplitDrawCmdlist() を呼び出したときやダミーコマンドを追加したときは、そのサイズも含めて上限サイズのチェックが行われます。

表 8-7. nngxAddCmdlist() が生成するエラー
エラー 原因
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() を呼び出すことで、コマンドキャッシュで取得したコマンドリストの内容をバイナリデータとしてメモリに保存(エクスポート)することができます。

コード 8-11. コマンドリストのエクスポート
GLsizei nngxExportCmdlist(GLuint cmdlist, GLuint bufferoffset, 
        GLsizei buffersize, GLuint requestid, GLsizei requestsize, 
        GLsizei datasize, GLvoid* data);

cmdlist にはエクスポートするコマンドリストを指定します。

bufferoffset buffersize には、エクスポートする 3D コマンドバッファの領域をバイトオフセットとバイトサイズで指定します。requestidrequestsize には、エクスポートするコマンドリクエストの開始 ID(0 から始まる蓄積順序)とエクスポートの対象とするコマンドリクエストの数を指定します。

data datasize には、エクスポート先のメモリ領域の先頭アドレスとそのサイズを指定します。この関数は返り値でエクスポートされたデータのバイトサイズを返しますが、data に 0(NULL)を指定した場合はエクスポートを行わず、エクスポートに必要なメモリのサイズを返します。エクスポートの手順としては、エクスポートに必要なメモリのサイズを取得してからメモリ領域を確保し、エクスポートすることを想定しています。

この関数の bufferoffsetbuffersizerequestidrequestsize には、矛盾のない組み合わせの値が指定されなければなりません。安全なデータをエクスポートするには、nngxStopCmdlistSave() で取得できる保存情報や、3D コマンドの蓄積中に同じタイミングで nngxGetCmdlistParameteri() を呼び出して取得した値を使用することを推奨します。nngxGetCmdlistParameteri()pnameNN_GX_CMDLIST_USED_BUFSIZE を渡して蓄積済みの 3D コマンドバッファのサイズ、NN_GX_CMDLIST_USED_REQCOUNT を渡して蓄積済みのコマンドリクエストの個数が取得できます。エクスポート対象となるコマンドリストの蓄積の開始時と終了時に、この二つの値を組みにして取得します。開始時に取得した値を bufferoffsetrequested に、終了時の値から開始時の値を減算した値を buffersizerequestsize に指定してください。

エクスポートする 3D コマンドバッファ領域は、以下の条件を満たしていなければなりません。

  • bufferoffset は、エクスポートするコマンドリクエストのうちの最初の 3D 実行コマンドが実行する領域内のどこかに指定されていなければなりません。
  • エクスポートされるすべての 3D 実行コマンドが実行する区切りのコマンドはすべてエクスポートされていなければなりません。
  • 最後の 3D 実行コマンドが実行する領域より後の領域までエクスポートすることができますが、その領域に区切りコマンドが含まれてはいけません。
  • コマンドリクエストが 1 つもエクスポートされない場合は、逆に区切りのコマンドが含まれていてはいけません。
図 8-3. エクスポートする 3D コマンドバッファ領域の指定とその可否

図 8-4. エクスポートする 3D コマンドバッファ領域の指定とその可否(コマンドリクエストが 1 つもエクスポートされない場合)

表 8-8. nngxExportCmdlist() が生成するエラー
エラー 原因
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 コマンドに対して、bufferoffsetbuffersize による 3D コマンドバッファの指定が正しくない

8.4.1. エクスポート情報の取得

エクスポートされたバイナリデータに含まれているコマンドリストの情報(エクスポート情報)は、nngxGetExportedCmdlistInfo() で取得することができます。

コード 8-12. エクスポート情報の取得
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 コマンドを追加コピー(インポート)することができます。

コード 8-13. コマンドリストのインポート
void nngxImportCmdlist(GLuint cmdlist, GLvoid* data, GLsizei datasize);

cmdlist には、現在バインドされているコマンドリストも、バインドされていないコマンドリストのどちらも指定することができます。指定したコマンドリストに 3D コマンドがすでに蓄積されていた場合は、そのあとに追加する形でインポートが行われます。

インポートするデータの最初のコマンドリクエストが 3D 実行コマンドでない場合は、インポート先のコマンドリストをバインドして、nngxSplitDrawCmdlist() でコマンドの区切りを追加しなければなりません。

data datasize には、エクスポートデータへのポインタとエクスポートデータのバイトサイズを指定します。

インポートの結果、インポート先のコマンドリストの 3D コマンドバッファに、パディング用のダミーコマンドが生成される場合があります。

表 8-9. nngxImportCmdlist() が生成するエラー
エラー 原因
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 コマンドのキャッシュフラッシュを行いますが、後者は行いません。

コード 8-14. 3D コマンドの追加
void nngxAdd3DCommand(const GLvoid* bufferaddr, GLsizei buffersize, 
        GLboolean copycmd);
void nngxAdd3DCommandNoCacheFlush(const GLvoid* bufferaddr, 
        GLsizei buffersize);

この関数は copycmd の指定によって動作が異なります。

copycmd GL_TRUE が指定されている場合、bufferaddrbuffersize で指定された先頭アドレスとバイトサイズの領域に格納されている 3D コマンドを、現在バインドされているコマンドリストの 3D コマンドバッファに追加コピーします。指定された領域にコマンドの区切りが存在する場合の動作は保証されていません。buffersize は 4 の倍数の正値でなければなりません。

copycmd GL_FALSE が指定されている場合、bufferaddrbuffersize で指定された先頭アドレスとバイトサイズの領域に格納されている 3D コマンドを実行する 3D 実行コマンドをコマンドリクエストに追加します。現在バインドされているコマンドリストの 3D コマンドバッファがコマンドの区切りで区切られていない場合は、内部でコマンドの区切りを追加してからコマンドリクエストを追加します。指定された領域の最後の 3D コマンドがコマンドの区切りでない場合の動作は保証されていません。bufferaddrは 16 の倍数の値、buffersize は 16 の倍数の正値でなければなりません。

nngxAdd3DCommandNoCacheFlush() の動作は、nngxAdd3DCommand()copycmdGL_FALSE を指定したときと同じですが、追加する 3D コマンドのキャッシュフラッシュを行いません。

表 8-10. nngxAdd3DCommand() および nngxAdd3DCommandNoCacheFlush() が生成するエラー
エラー 原因
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()pnameNN_GX_CMDLIST_TOP_BUFADDR を渡して呼び出し、3D コマンドバッファの先頭アドレスを取得する必要があります。

3D コマンドやレジスタに書き込む値のエンディアンがリトルエンディアンであるため、以降で示すビットレイアウトや数値の表記と、メモリ上でのバイトオーダーとの対応に注意してください。

8.7.2. 3D コマンドバッファの仕様

3D コマンドバッファは、GPU のレジスタに書き込まれる 3D コマンド(PICA レジスタ書き込みコマンド)の集合です。3D コマンドは、連続する 64 ビット単位のコマンドの集合で、32 ビットのヘッダと 32 ビットのデータで構成されています。ヘッダの内容によってデータの個数が変動しますが、3D コマンドのアライメントは 64 ビットです。そのため、データの個数によっては最後の 64 ビットの上位 32 ビットのデータが無視されます。

3D コマンドの各ビットには、以下の情報が格納されています。

図 8-5. 3D コマンドのビットレイアウト

SEQ SIZE BE ADDR DATA

表 8-11. 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 ビットのデータが無視されます。

図 8-6. バーストアクセス時のデータの格納順序

header 1st. data 2nd. data 3rd. data 4th. data 5th. data

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 コマンドは、各モジュールのパイプラインフラッシュのコストがかかります。

各モジュールに割り当てられているレジスタの範囲は以下のとおりです。

表 8-12. 各モジュールに割り当てられているレジスタの範囲
モジュール レジスタの範囲
トライアングルセットアップ 0x0040 から 0x005F
ラスタライゼーションモジュール 0x0060 から 0x006F
テクスチャユニット 0x0080 から 0x00BF
フラグメントライティング 0x0140 から 0x01DF
テクスチャコンバイナ 0x00C0 から 0x00FF
パーフラグメントオペレーションモジュール 0x0100 から 0x013F
補足:

実際にはレジスタの存在しないアドレスも含まれています。

8.8. PICA レジスタ情報

この節では、いくつかの PICA レジスタに関して、そのアドレスと設定方法、値のフォーマットを説明します。これらの情報を元に、該当するレジスタに対する書き込み箇所を 3D コマンドバッファから検索して内容を書き換えることで、その機能に対する設定値を変更することができます。

注意:

レジスタにメモリアドレスを設定する場合は、nn::gx::GetPhysicalAddr() で仮想アドレスを物理アドレスに変換する必要があります。

レジスタのビットレイアウトは以下の様式で記載しています。

図 8-7. レジスタのビットレイアウトの凡例

レジスタアドレス ビット位置 設定する値に指定がないビット(基本的には0を設定) バイトイネーブルによってアクセスを禁止すべきビット 設定する値が固定値のビット 設定する値に指定があり、識別のための名前がつけられたビット name

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 で指定します。

図 8-8. 浮動小数点定数レジスタのインデックス指定(0x02C0)のビットレイアウト

0x02C0 MODE INDEX

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 ビット浮動小数点数への変換」を参照してください。

図 8-9. 24 ビット浮動小数点数入力モードでのデータの配置

1st. data 2nd. data 3rd. data w z y x 23 16 15 8 7 0

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 通りあります。

図 8-10. ブールレジスタ(0x02B0)のビットレイアウト

0x02B0 0x7FFF b15 b0

レジスタ 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 通りあります。

図 8-11. 整数レジスタ(0x02B1 ~ 0x02B4)のビットレイアウト

0x02B1 0x02B4 x y z

レジスタ 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)

頂点シェーダで実行するプログラムコードのロードに使用するレジスタには、プログラムをロードするアドレスの指定するレジスタと、プログラムデータを書き込むための複数のレジスタが存在します。

図 8-12. プログラムコードのロードレジスタ(0x02CB ~ 0x02D3)のビットレイアウト

0x02CB 0x02CC 0x02D3 ADDR DATA

レジスタ 0x02CB には、頂点シェーダのプログラムコードをロードするアドレスを ADDR に設定します。レジスタ 0x02CC ~ 0x02D3 には、ロードするプログラムコードのデータを書き込みます。

プログラムコードのロードアドレスをレジスタ 0x02CB に設定してから、0x02CC ~ 0x02D3 のいずれかのレジスタにデータを書き込みます。頂点シェーダプログラムの 1 命令は 32 ビットですので、1 データの書き込みが 1 命令に対応し、1 つ書き込むごとにロードアドレスが 1 インクリメントされます。いずれのレジスタに書き込んでも処理結果は変わりません。

プログラムコードを更新したあとは、プログラムの更新完了を GPU に通知するためにレジスタ 0x02BF の任意のビットに 1 を書き込む必要があります。

上記のプログラムコードに加え、Swizzle パターンデータをロードする必要があります。Swizzle パターンを設定するレジスタを以下に示します。

図 8-13. Swizzle パターンのロードレジスタ(0x02D5 ~ 0x02DD)のビットレイアウト

0x02D5 0x02D6 0x02DD ADDR DATA

レジスタ 0x02D5 には、Swizzle パターンをロードするアドレスを ADDR に設定します。レジスタ 0x02D6 ~ 0x02DD には、ロードする Swizzle パターンのデータを書き込みます。

Swizzle パターンのロードアドレスをレジスタ 0x02D5 に設定してから、0x02D6 ~ 0x02DD のいずれかのレジスタにデータを書き込みます。データを 1 つ書き込むごとにロードアドレスが 1 インクリメントされます。いずれのレジスタに書き込んでも処理結果は変わりません。

8.8.1.5. 開始アドレス設定レジスタ(0x02BA)

シェーダアセンブラで定義した main ラベルのアドレスが頂点シェーダの開始アドレスです。

図 8-14. 開始アドレス設定レジスタ(0x02BA)のビットレイアウト

0x02BA 0x7FFF addr

レジスタ 0x02BA のビット [ 15 : 0 ] に頂点シェーダの開始アドレスを設定します。

8.8.1.6. 頂点属性入力数設定レジスタ(0x0242, 0x02B9)

頂点シェーダに入力される頂点属性数が設定されるレジスタは複数あり、それぞれに同じ値が設定されます。

図 8-15. 頂点属性入力数設定レジスタ(0x0242, 0x02B9)のビットレイアウト

0x0242 count 0x02B9 0xA0 0x00

count には(入力する頂点属性数 - 1)を設定します。入力する頂点属性数は、頂点バッファを使用する場合(ロードアレイを使用して頂点データをロードする場合)は 12 個まで、頂点バッファを使用しない場合(コマンドバッファ経由で頂点データをロードする場合)は 16 個までです。

8.8.1.7. 入力レジスタのマッピング設定レジスタ(0x02BB, 0x02BC)

頂点シェーダに入力される頂点属性データと入力レジスタとのマッピングが設定されるレジスタを以下に示します。

図 8-16. 入力レジスタのマッピング設定レジスタ(0x02BB, 0x02BC)のビットレイアウト

0x02BB 0x02BC attrib_0 attrib_1 attrib_2 attrib_3 attrib_4 attrib_5 attrib_6 attrib_7 attrib_8 attrib_9 attrib_10 attrib_11 attrib_12 attrib_13 attrib_14 attrib_15

attrib_0 ~ attrib_15 には、頂点シェーダに入力される頂点属性データが、どの入力レジスタに格納されるのかを入力レジスタのインデックス番号("v0" が 0x0、"v1" が 0x1、"v15" が 0xF)で設定します。頂点シェーダに入力される頂点属性の順番は glBindAttribLocation() で指定した index とは対応せず、「頂点属性アレイ設定レジスタ(0x0200 ~ 0x0227)」で説明されている内部頂点属性の番号と対応しています。

8.8.1.8. 固定頂点属性値設定レジスタ(0x0232 ~ 0x0235)

glVertexAttrib4f() などで設定される固定頂点属性値は、24 ビット浮動小数点数に変換されて GPU へ転送されます。固定頂点属性値は、以下のレジスタへの設定で GPU に転送されます。

図 8-17. 固定頂点属性値設定レジスタ(0x0232 ~ 0x0235)のビットレイアウト

0x0232 0x0233 0x0234 0x0235 index x y z w

まず、レジスタ 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 のバリデーションで生成されます。

図 8-18. 頂点属性アレイ設定レジスタ(0x0200 ほか)のビットレイアウト

0x0200 0x0201 0x0202 0x0203 0x0204 0x0205 0x0227 ARRAY_BASE_ADDR ARRAY_TYPE0 ARRAY_TYPE1 ARRAY_TYPE2 ARRAY_TYPE3 ARRAY_TYPE4 ARRAY_TYPE5 ARRAY_TYPE6 ARRAY_TYPE7 ARRAY_TYPE8 ARRAY_TYPE9 ARRAY_TYPE10 ARRAY_TYPE11 ARRAY_NUM CONST_ATTRIB_MASK ARRAYn_OFFSET ARRAYn_ELEM0 ARRAYn_ELEM1 ARRAYn_ELEM2 ARRAYn_ELEM3 ARRAYn_ELEM4 ARRAYn_ELEM5 ARRAYn_ELEM6 ARRAYn_ELEM7 ARRAYn_ELEM8 ARRAYn_ELEM9 ARRAYn_ELEM10 ARRAYn_ELEM11 ARRAYn_ATTRIB_NUM ARRAYn_STRIDE INDEX_ARRAY_TYPE INDEX_ARRAY_OFFSET

これらのレジスタで行われる設定には、ベースアドレス、内部頂点属性の型、固定頂点属性のマスク、頂点属性の総数、各ロードアレイのバイトオフセット、ロードアレイの要素の情報、ロードアレイの要素数、ロードアレイのバイト数、インデックスアレイのオフセットがあります。

ベースアドレス

レジスタ 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() で指定された sizetype の組み合わせで決定されます。組み合わせとレジスタに設定する値の対応は以下のようになっています。

表 8-13. 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)番目の要素を先頭から順に設定します。要素には使用する内部頂点属性またはパディングを設定し、レジスタに設定する値と要素の対応は以下のようになっています。

表 8-14. レジスタに設定する値と要素の対応
設定値 要素
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() の引数 typeGL_UNSIGNED_SHORT の場合は 1 を、GL_UNSIGNED_BYTE の場合は 0 を設定します。glDrawArrays() の場合は常に 1 を設定します。

例 1)インターリーブドアレイの例

コード 8-15. インターリーブドアレイの例(構造体)
struct vertex_t
{
    float position[3];
    float color[4];
    float texcoord[2];
} vertex[NUM_VERTEX];

上に示した構造体により頂点データを構成した場合、頂点アレイの設定は以下のようになります。

コード 8-16. インターリーブドアレイの例(頂点アレイの設定)
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)独立アレイの例

コード 8-17. 独立アレイの例(構造体)
#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 つのオブジェクトで共有し、順番にデータを配置していると仮定しています。

コード 8-18. 独立アレイの例(頂点アレイの設定)
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 を設定した場合の要素はパディングと設定されています。これは、ロードアレイが頂点属性として使用しない領域を含む場合に使用します。

例えば、以下のような構造体の頂点データを作成したとします。

コード 8-19. パディングを使用する構造体の例
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_FLOATGL_SHORTGL_BYTEGL_UNSIGNED_BYTE)の頂点属性を要素としている場合、ロードアレイの要素には指定されていなくても 4 バイト未満のパディングが自動で挿入される場合があります。ロードアレイを構成する各要素は、4 バイトの型(要素とする内部頂点属性の型が GL_FLOAT である、またはパディングである)、2 バイトの型(要素とする内部頂点属性の型が GL_SHORT である)、1 バイトの型(要素とする内部頂点属性の型が GL_BYTEGL_UNSIGNED_BYTE である)のいずれかです。ロードアレイの各要素は、その要素自身の型のサイズでアライメントされるように自動でパディングが挿入されます。また、そのロードアレイが含む要素のうち、最も大きい型のサイズでアライメントされるように各頂点データの最後に自動でパディングが挿入されます。

例えば、以下のような構造体の頂点データを作成したとします。

コード 8-20. 自動でパディングが挿入される例
struct vertex_t
{
    GLfloat position[3];
    GLubyte color[3];
    GLfloat texcoord[2];
    GLubyte param;
} vertex[NUM_VERTEX];

ロードアレイは positioncolortexcoordparam の 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)

頂点シェーダから出力される頂点属性数を設定するレジスタは複数あり、一部を除いて同じ値を設定します。

図 8-19. 出力レジスタ使用数設定レジスタ(0x004F, 0x024A, 0x0251, 0x025E)のビットレイアウト

0x004F 0x024A 0x0251 0x025E count1 count2

count1(レジスタ 0x004F)には使用する出力レジスタの個数そのままを、count2(レジスタ 0x024A, 0x0251, 0x025E すべて)には(使用する出力レジスタの個数 - 1)をそれぞれ設定します。count1 のみ、値とビット幅が異なる点に注意してください。

出力レジスタの個数とは頂点シェーダアセンブラに #pragma output_map で定義された個数ですが、使用している出力レジスタの数ですので、複数の頂点属性を 1 つの出力レジスタにパックしている場合は 1 とカウントします。

8.8.1.11. 出力レジスタのマスク設定レジスタ(0x02BD)

頂点シェーダで書き込む出力レジスタのマスクを設定するレジスタには、16 個ある出力レジスタの、どのレジスタに書き込みが行われるかをビットで指定します。

図 8-20. 出力レジスタのマスク設定レジスタ(0x02BD)のビットレイアウト

0x02BD 0x0000 o15 o0

レジスタ 0x02BD のビット [ 15 : 0 ] の各ビットが、出力レジスタの 1 つ 1 つに対応しています。ビット [0] が "o0"、ビット [1] が "o1"、・・・、ビット [15] が "o15" に対応し、#pragma output_map で定義されている出力レジスタに対応するビットには 1 を書き込みます。定義されていない出力レジスタに対応するビットには 0 を書き込みます。

8.8.1.12. 出力レジスタの属性設定レジスタ(0x0050 ~ 0x0056, 0x0064)

頂点シェーダから頂点属性を出力するのに使用可能な出力レジスタの数は 7 です。出力レジスタの各コンポーネントで出力する属性を設定するレジスタは複数あり、使用する出力レジスタの若い番号から順に設定します。

図 8-21. 出力属性の設定レジスタ(0x0050 ~ 0x0056, 0x0064)のビットレイアウト

0x0050 0x0056 0x0064 attrib_w attrib_z attrib_y attrib_z texcoord

ビットレイアウト中の名前は以下のように出力属性の設定に対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。

表 8-15. 名前と設定の対応(出力属性の設定レジスタ)
名前 ビット数 説明

attrib_x

attrib_y

attrib_z

attrib_w

5

上から、出力レジスタの x、y、z、w コンポーネントに設定する頂点属性です。

0x00 : 頂点座標の x 成分
0x01 : 頂点座標の y 成分
0x02 : 頂点座標の z 成分
0x03 : 頂点座標の w 成分
0x04 : クォータニオンの x 成分
0x05 : クォータニオンの y 成分
0x06 : クォータニオンの z 成分
0x07 : クォータニオンの w 成分
0x08 : 頂点カラーの赤成分
0x09 : 頂点カラーの緑成分
0x0A : 頂点カラーの青成分
0x0B : 頂点カラーのアルファ成分
0x0C : テクスチャ座標 0 の u 成分
0x0D : テクスチャ座標 0 の v 成分
0x0E : テクスチャ座標 1 の u 成分
0x0F : テクスチャ座標 1 の v 成分
0x10 : テクスチャ座標 0 の w 成分
0x12 : ビューベクタの x 成分
0x13 : ビューベクタの y 成分
0x14 : ビューベクタの z 成分
0x16 : テクスチャ座標 2 の u 成分
0x17 : テクスチャ座標 2 の v成分
0x1F : 無効

texcoord 1

頂点シェーダから出力される頂点属性にテクスチャ座標が含まれているかどうかを設定します。

0x0 : テクスチャ座標を出力しない
0x1 : テクスチャ座標を出力する

例)頂点シェーダで以下のように定義した場合を例に、レジスタに設定する値を説明します。

コード 8-21. 出力属性の設定例
#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)

頂点シェーダから出力する頂点属性の種類によって、クロック制御レジスタへの設定値を変更しなければならない場合があります。

図 8-22. 出力属性のクロック制御レジスタ(0x006F)のビットレイアウト

0x006F viewVector texture0w texture2 texture1 texture0 vertexColor vertexZ

ビットレイアウト中の名前は以下のように出力属性のクロック制御設定に対応しています。下表では、それぞれのビットと設定値の対応についても説明しています。

表 8-16. 名前と設定の対応(出力属性のクロック制御レジスタ)
名前 ビット数 説明
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-23. テクスチャアドレス設定レジスタ(0x0085 ほか)のビットレイアウト

0x0085 0x0086 0x0087 0x0088 0x0089 0x008A 0x0095 0x009D TEXTURE_2D(TEXTURE0) TEXTURE_CUBE_MAP_POSITIVE_X TEXTURE_CUBE_MAP_NEGATIVE_X TEXTURE_CUBE_MAP_POSITIVE_Y TEXTURE_CUBE_MAP_NEGATIVE_Y TEXTURE_CUBE_MAP_POSITIVE_Z TEXTURE_CUBE_MAP_NEGATIVE_Z TEXTURE_2D(TEXTURE1) TEXTURE_2D(TEXTURE2)

テクスチャデータのアドレス(テクスチャアドレス)はすべて 8 バイトアドレス(物理アドレスを 8 で割った値)で設定します。キューブマップ用の 6 面すべてのテクスチャアドレス(28 ビット)の上位 6 ビットはレジスタ 0x0085 のビット [ 27 : 22 ] を共有します。

注意:

テクスチャアドレスのアライメントは 128 バイトである必要があります。正しいアライメントでなければ、GPU がハングアップしたり、描画結果が壊れたりするなどの現象が発生する可能性があります。

8.8.3. レンダーバッファ設定レジスタ(0x006E, 0x0116, 0x0117, 0x011C ~ 0x011E)

レンダーバッファに関連するレジスタ設定には、カラーバッファとデプスバッファの 2 つのバッファについて設定する複数のレジスタがあります。これらのレジスタに対する設定コマンドはステートフラグ NN_GX_STATE_FRAMEBUFFER のバリデーションで生成されます。

図 8-24. レンダーバッファ設定レジスタ(0x006E, 0x0116, 0x0117, 0x011C ~ 0x011E)のビットレイアウト

0x006E 0x0116 0x0117 0x011C 0x011D 0x011E DEPTHBUFFER_HEIGHT DEPTHBUFFER_WIDTH DEPTHBUFFER_FORMAT DEPTHBUFFER_ADDR COLORBUFFER_FORMAT COLORBUFFER_PIXEL COLORBUFFER_ADDR COLORBUFFER_HEIGHT COLORBUFFER_WIDTH 1

ビットレイアウト中の名前は以下のようにレンダーバッファの設定に対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。

表 8-17. 名前と設定の対応(レンダーバッファ設定レジスタ)
名前 ビット数 説明
COLORBUFFER_FORMAT 3

カラーバッファのフォーマットを設定します。

0x0 : GL_RGBA8_OES または GL_GAS_DMP
0x2 : GL_RGB5_A1
0x3 : GL_RGB565
0x4 : GL_RGBA4

COLORBUFFER_PIXEL 2

カラーバッファのフォーマットのピクセルサイズを設定します。

0x0 : 16 ビット
0x2 : 32ビット

COLORBUFFER_WIDTH 11 カラーバッファの幅のピクセル数を設定します。
COLORBUFFER_HEIGHT 10 カラーバッファの高さのピクセル数 - 1 を設定します。
COLORBUFFER_ADDR 28 カラーバッファのアドレスを 8 バイトアドレス(物理アドレスを 8 で割った値)で設定します。
DEPTHBUFFER_FORMAT 2

デプスバッファのフォーマットを設定します。

0x0 : GL_DEPTH_COMPONENT16
0x2 : GL_DEPTH_COMPONENT24_OES
0x3 : GL_DEPTH24_STENCIL8_EXT

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)を先頭とする複数のレジスタに分かれています。

表 8-18. コンバイナ番号とレジスタの先頭アドレス
コンバイナ番号 先頭アドレス(comb_top)
0 0x00C0
1 0x00C8
2 0x00D0
3 0x00D8
4 0x00F0
5 0x00F8
図 8-25. テクスチャコンバイナ設定レジスタ(0x00C0 ~ 0x00C4 ほか)のビットレイアウト

comb_top srcAlpha2 srcAlpha1 srcAlpha0 srcRgb2 srcRgb1 srcRgb0 operandAlpha2 operandAlpha1 operandAlpha0 operandRgb2 operandRgb1 operandRgb0 combineAlpha combineRgb constRgba3 constRgba2 constRgba1 constRgba0 scaleAlpha scaleRgb

ビットレイアウト中の名前は以下のように予約ユニフォームに対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。

表 8-19. 名前と予約ユニフォームの対応(テクスチャコンバイナ設定レジスタ)
名前 ビット数 説明

srcRgb0

srcRgb1

srcRgb2

4

上から、dmp_TexEnv[i].srcRgb に設定する値の第 1 ~第 3 要素です。

0x0 : GL_PRIMARY_COLOR
0x1 : GL_FRAGMENT_PRIMARY_COLOR_DMP
0x2 : GL_FRAGMENT_SECONDARY_COLOR_DMP
0x3 : GL_TEXTURE0
0x4 : GL_TEXTURE1
0x5 : GL_TEXTURE2
0x6 : GL_TEXTURE3
0xE : GL_CONSTANT
0xF : GL_PREVIOUS
0xD : GL_PREVIOUS_BUFFER_DMP

srcAlpha0

srcAlpha1

srcAlpha2

4

上から、dmp_TexEnv[i].srcAlpha に設定する値の第 1 ~第 3 要素です。

設定の内容は srcRgb0 ~ srcRgb2 と同じです。

operandRgb0

operandRgb1

operandRgb2

4

上から、dmp_TexEnv[i].operandRgb に設定する値の第 1 ~第 3 要素です。

0x0 : GL_SRC_COLOR
0x1 : GL_ONE_MINUS_SRC_COLOR
0x2 : GL_SRC_ALPHA
0x3 : GL_ONE_MINUS_SRC_ALPHA
0x4 : GL_SRC_R_DMP
0x5 : GL_ONE_MINUS_SRC_R_DMP
0x8 : GL_SRC_G_DMP
0x9 : GL_ONE_MINUS_SRC_G_DMP
0xC : GL_SRC_B_DMP
0xD : GL_ONE_MINUS_SRC_B_DMP

operandAlpha0

operandAlpha1

operandAlpha2

3

上から、dmp_TexEnv[i].operandAlpha に設定する値の第 1 ~第 3 要素です。

0x0 : GL_SRC_ALPHA
0x1 : GL_ONE_MINUS_SRC_ALPHA
0x2 : GL_SRC_R_DMP
0x3 : GL_ONE_MINUS_SRC_R_DMP
0x4 : GL_SRC_G_DMP
0x5 : GL_ONE_MINUS_SRC_G_DMP
0x6 : GL_SRC_B_DMP
0x7 : GL_ONE_MINUS_SRC_B_DMP

combineRgb 4

dmp_TexEnv[i].combineRgb に設定する値です。

0x0 : GL_REPLACE
0x1 : GL_MODULATE
0x2 : GL_ADD
0x3 : GL_ADD_SIGNED
0x4 : GL_INTERPOLATE
0x5 : GL_SUBTRACT
0x6 : GL_DOT3_RGB
0x7 : GL_DOT3_RGBA
0x8 : GL_MULT_ADD_DMP
0x9 : GL_ADD_MULT_DMP

combineAlpha 4

dmp_TexEnv[i].combineAlpha に設定する値です。

combineRgb の値から GL_DOT3_RGB を除いたものを設定することができます。

constRgba0

constRgba1

constRgba2

constRgba3

8

上から、dmp_TexEnv[i].constRgba に設定する値の第 1 ~第 4 要素です。

0.0 ~ 1.0 の値を 0 ~ 255 にマップしたときの符号なし 8 ビット整数を設定します。

値の変換方法については「8.9.16. 浮動小数点数(0 ~ 1)から符号なし 8 ビット整数への変換」を参照してください。

scaleRgb

scaleAlpha

2

dmp_TexEnv[i].scaleRgb, dmp_TexEnv[i].scaleAlpha に設定する値です。

0x0 : 1.0
0x1 : 2.0
0x2 : 4.0

dmp_TexEnv[i].srcRgb および dmp_TexEnv[i].srcAlpha の設定には以下の制限があります。

  • i が 0 の場合、dmp_TexEnv[i].srcRgb および dmp_TexEnv[i].srcAlpha の各 3 要素に対して、GL_PREVIOUSGL_PREVIOUS_BUFFER_DMP を設定してはいけません。
  • i が 0 以外の場合、dmp_TexEnv[i].srcRgb および dmp_TexEnv[i].srcAlpha のそれぞれに、各 3 要素のうちの少なくとも 1 つは GL_CONSTANTGL_PREVIOUSGL_PREVIOUS_BUFFER_DMP のいずれが設定されなければなりません。

8.8.4.1. コンバイナバッファ設定レジスタ(0x00E0, 0x00FD)

"dmp_TexEnv[i]." で始まる予約ユニフォームでは、コンバイナバッファに対する設定も行われます。コンバイナバッファの予約ユニフォームに値を設定するレジスタは以下のとおりです。レジスタ 0x00E0 の他のビットはガス設定などで使用されていることに注意してください。

図 8-26. コンバイナバッファ設定レジスタ(0x00E0, 0x00FD)のビットレイアウト

0x00E0 0x00FD 0x0 zFlip bufferInput1 bufferInput0 shadingDensitySrc mode bufferColor3 bufferColor2 bufferColor1 bufferColor0

ビットレイアウト中の名前は以下のように予約ユニフォームに対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。

表 8-20. 名前と予約ユニフォームの対応(コンバイナバッファ設定レジスタ)
名前 ビット数 説明

bufferColor0

bufferColor1

bufferColor2

bufferColor3

4

上から、dmp_TexEnv[0].bufferColor に設定する値の第 1 ~第 4 要素です。

0.0 ~ 1.0 の値を 0 ~ 255 にマップしたときの符号なし 8 ビット整数を設定します。

値の変換方法については「8.9.16. 浮動小数点数(0 ~ 1)から符号なし 8 ビット整数への変換」を参照してください。

bufferInput0

bufferInput1

1 * 4

上から、dmp_TexEnv[i].bufferInput に設定する値の第 1 ~第 2 要素です。i は 1 ~ 4 で、下位のビットが 1 の設定に対応しています。

0x0 : GL_PREVIOUS_BUFFER_DMP
0x1 : GL_PREVIOUS

8.8.5. フラグメントライティング設定レジスタ(0x008F ほか)

フラグメントライティングの予約ユニフォーム(名前に dmp_FragmentLightingdmp_FragmentMaterialdmp_FragmentLightSource[i]dmp_LightEnv を含む予約ユニフォーム)に関連するレジスタについて説明します。

8.8.5.1. ライティングの有効化・無効化制御レジスタ(0x008F, 0x01C2, 0x01C6, 0x01D9)

ライティングの有効化・無効化を制御する予約ユニフォームに対応するレジスタは以下のとおりです。

図 8-27. ライティングの有効化・無効化制御レジスタ(0x008F, 0x01C2 ほか)のビットレイアウト

0x008F 0x01C6 0x01C2 0x01D9 enabled0 enabled1 src_num id8 id7 id6 id5 id4 id3 id2 id1

ビットレイアウト中の名前は以下のように予約ユニフォームに対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。

表 8-21. 名前と予約ユニフォームの対応(ライティングの有効化・無効化制御レジスタ)
名前 ビット数 説明
enabled0 1

dmp_FragmentLighting.enabled に設定する値です。

0x0 : GL_FALSE
0x1 : GL_TRUE

enabled1 1

dmp_FragmentLighting.enabled に設定する値です。

0x0 : GL_TRUE
0x1 : GL_FALSE

※ 設定する値に注意してください。

src_num 3

(有効な光源数 - 1)を設定します。すべての光源が無効である場合には 0 を設定します。

有効な光源数とは、dmp_FragmentLightSource[i].enabledGL_TRUE を指定した光源の数のことです。

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 以外の値を設定したときの動作は不定です。

図 8-28. グローバルアンビエント設定レジスタ(0x01C0)のビットレイアウト

0x01C0 GlobalAmbient_Red GlobalAmbient_Green GlobalAmbient_Blue

ライティングが有効(dmp_FragmentLighting.enabledGL_TRUE が設定されている)、かつすべての光源が無効(dmp_FragmentLightSource[i].enabledGL_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.configGL_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].specular0dmp_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


設定するレジスタのビットレイアウトは以下のようになっています。

図 8-29. 光源色設定レジスタ(0x0140 ~ 0x0143 ほか)のビットレイアウト

light_top LightSpecular0_Red LightSpecular0_Green LightSpecular0_Blue LightSpecular1_Red LightSpecular1_Green LightSpecular1_Blue LightDiffuse_Red LightDiffuse_Green LightDiffuse_Blue LightAmbient_Red LightAmbient_Green LightAmbient_Blue

光源位置設定レジスタ(0x0144, 0x0145, 0x0149 ほか)

予約ユニフォーム dmp_FragmentLightSource[i].position で設定する光源位置の座標値のうち、xyz 成分については値を 16 ビット浮動小数点数に変換してレジスタに設定します。値の変換方法については「8.9.2. 16 ビット浮動小数点数への変換」を参照してください。w 成分については、光源が点光源か平行光源かをレジスタ(light_top + 9)のビット [ 0 : 0 ] に設定します。w 成分の値が 0.0 であれば 1 を、それ以外ならば 0 を設定することに注意してください。また、このレジスタのほかのビットには別の設定が行われることにも注意してください。

設定するレジスタのビットレイアウトは以下のようになっています。

図 8-30. 光源位置設定レジスタ(0x0144, 0x0145, 0x0149 ほか)のビットレイアウト

light_top LightPosition_y LightPosition_x LightPosition_z GeomFactor1 GeomFactor0 TwoSideDeiffuse LightPosition_w

スポットライト方向設定レジスタ(0x0146, 0x0147 ほか)

予約ユニフォーム dmp_FragmentLightSource[i].spotDirection で設定するスポットライト方向の座標値(xyz 成分)を、符号を反転させてから 小数部 11 ビットの符号つき 13 ビット固定小数点数(負の値は 2 の補数表現)に変換してレジスタに設定します。値の変換方法については「8.9.9. 小数部 11 ビットの符号つき 13 ビット固定小数点数への変換」を参照してください。

設定するレジスタのビットレイアウトは以下のようになっています。

図 8-31. スポットライト方向設定レジスタ(0x0146, 0x0147 ほか)のビットレイアウト

light_top SpotDirection_y SpotDirection_x SpotDirection_z

距離減衰設定レジスタ(0x014A, 0x014B ほか)

距離減衰の予約ユニフォーム dmp_FragmentLightSource[i].distanceAttenuationBiasdmp_FragmentLightSource[i].distanceAttenuationScale で設定する距離減衰のバイアスとスケールを、20 ビット浮動小数点数に変換してレジスタに設定します。値の変換方法については「8.9.4. 20 ビット浮動小数点数への変換」を参照してください。

設定するレジスタのビットレイアウトは以下のようになっています。

図 8-32. 距離減衰レジスタ設定(0x014A, 0x014B ほか)のビットレイアウト

light_top distanceAttenuationBias distanceAttenuationScale

そのほかの設定レジスタ(0x01C4, 0x0149 ほか)

光源ごとで設定する、そのほかの設定に対応するレジスタは以下のとおりです。

図 8-33. そのほかの設定レジスタ(0x01C4、0x0149 ほか)のビットレイアウト

表 8-22. そのほかの設定の予約ユニフォームとレジスタの対応(光源設定)
名前・レジスタ ビット数 説明

shadowed
0x01C4 のビット [ x : x ]
(x は光源番号)

1

dmp_FragmentLightSource[i].shadowed に設定する値です。
0x0 : GL_TRUE
0x1 : GL_FALSE

※ 設定する値に注意してください。

spotEnabled
0x01C4 のビット [ 8 + x : 8 + x ]
(x は光源番号)

1

dmp_FragmentLightSource[i].spotEnabled に設定する値です。
0x0 : GL_TRUE
0x1 : GL_FALSE

※ 設定する値に注意してください。

distanceAttenuationEnabled
0x01C4 のビット [ 24 + x : 24 + x ]
(x は光源番号)

1

dmp_FragmentLightSource[i].distanceAttenuationEnabled に設定する値です。
0x0 : GL_TRUE
0x1 : GL_FALSE

※ 設定する値に注意してください。

twoSideDiffuse
(light_top + 9)のビット [ 1 : 1 ]

1

dmp_FragmentLightSource[i].twoSideDiffuse に設定する値です。
0x0 : GL_FALSE
0x1 : GL_TRUE

geomFactor0
(light_top + 9)のビット [ 2 : 2 ]

1

dmp_FragmentLightSource[i].geomFactor0 に設定する値です。
0x0 : GL_FALSE
0x1 : GL_TRUE

geomFactor1
(light_top + 9)のビット [ 3 : 3 ]

1

dmp_FragmentLightSource[i].geomFactor1 に設定する値です。
0x0 : GL_FALSE
0x1 : GL_TRUE

8.8.5.4. 参照テーブル設定レジスタ(0x01C5, 0x01C8 ~ 0x01CF)

予約ユニフォーム dmp_FragmentMaterial.sampler{ RR, RG, RB, D0, D1, FR }dmp_FragmentLightSource[i].sampler{ SP, DA } で指定されるフラグメントライティングの参照テーブルは、256 個のデータと同数の差分値によって設定されます。

設定に使用するレジスタのビットレイアウトは以下のようになっています。

図 8-34. 参照テーブル設定レジスタ(0x01C5, 0x01C8 ~ 0x01CF)のビットレイアウト

0x01C5 0x01C8 0x01CF REf_Table Ref_Index Ref_Difference Ref_Value

レジスタ 0x01C5 には、対象とする参照テーブルを Ref_Table に、設定開始インデックスを Ref_Index に設定します。インデックスは 0 が最初のデータ、255 が最後のデータです。Ref_Table に設定する値と参照テーブルの対応は以下のようになっています。

表 8-23. 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)

参照テーブルの引数の範囲設定に対応するレジスタは以下のとおりです。

図 8-35. 参照テーブルの引数範囲設定レジスタ(0x01D0)のビットレイアウト

0x01D0 absLutInputD0 absLutInputD1 absLutInputSP absLutInputFR absLutInputRB absLutInputRG absLutInputRR

表 8-24. 参照テーブルの引数範囲設定の予約ユニフォームとレジスタの対応
名前・レジスタ ビット数 説明
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)

参照テーブルの入力値設定に対応するレジスタは以下のとおりです。

図 8-36. 参照テーブルの入力値設定レジスタ(0x01D1)のビットレイアウト

0x01D1 lutInputD0 lutInputD1 lutInputSP lutInputFR lutInputRB lutInputRG lutInputRR

表 8-25. 参照テーブルの入力値設定の予約ユニフォームとレジスタの対応
名前・レジスタ ビット数 説明
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)

参照テーブルの出力値に対するスケール値設定に対応するレジスタは以下のとおりです。

図 8-37. 参照テーブルの出力地に対するスケール値設定レジスタ(0x01D2)のビットレイアウト

0x01D1 lutInputD0 lutInputD1 lutInputSP lutInputFR lutInputRB lutInputRG lutInputRR

表 8-26. 参照テーブルの出力値に対するスケール値設定の予約ユニフォームとレジスタの対応
名前・レジスタ ビット数 説明
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)

シャドウ減衰設定に対応するレジスタは以下のとおりです。このレジスタのほかのビットには別の設定が行われることに注意してください。

図 8-38. シャドウ減衰設定レジスタ(0x01C3)のビットレイアウト

0x01C3 1 bumpRenorm bumpMode clampHighlights bumpSelector shadowSelector invertShadow shadowAlpha shadowSecondary shadowPrimary 0x4 config fresnelSelector shadowAttn

ビットレイアウト中の名前は以下のように予約ユニフォームに対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。

表 8-27. 名前と予約ユニフォームの対応(シャドウ減衰設定レジスタ)
名前 ビット数 説明
shadowSelector 2

dmp_LightEnv.shadowSelector に設定する値です。

0x0 : GL_TEXTURE0
0x1 : GL_TEXTURE1
0x2 : GL_TEXTURE2
0x3 : GL_TEXTURE3

shadowPrimary 1

dmp_LightEnv.shadowPrimary に設定する値です。

0x0 : GL_FALSE
0x1 : GL_TRUE

shadowSecondary 1

dmp_LightEnv.shadowSecondary に設定する値です。

0x0 : GL_FALSE
0x1 : GL_TRUE

invertShadow 1

dmp_LightEnv.invertShadow に設定する値です。

0x0 : GL_FALSE
0x1 : GL_TRUE

shadowAlpha 1

dmp_LightEnv.shadowAlpha に設定する値です。

0x0 : GL_FALSE
0x1 : GL_TRUE

shadowAttn 1

dmp_LightEnv.shadowPrimarydmp_LightEnv.shadowSecondarydmp_LightEnv.shadowAlpha のいずれかが GL_TRUE の場合は 1 を設定し、すべて GL_FALSE の場合は 0 を設定します。

8.8.5.9. そのほかの設定レジスタ(0x01C3, 0x01C4)

フラグメントライティングで設定する、そのほかの設定に対応するレジスタは以下のとおりです。このレジスタのほかのビットには別の設定が行われることに注意してください。

図 8-39. そのほかの設定レジスタ(0x01C3, 0x01C4)のビットレイアウト

0x01C3 0x01C4 1 bumpRenorm bumpMode clampHighlights bumpSelector shadowSelector shadowAlpha invertShadow shadowSecondary shadowPrimary 0x4 config fresnelSelector shadowAttn distanceAttenuationEnabled lutEnabledRefl enabledFresnelSelector lutEnabledD1 lutEnabledD0 spotEnabled shadowed

ビットレイアウト中の名前は以下のように予約ユニフォームに対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。

表 8-28. 名前と予約ユニフォームの対応(そのほかの設定レジスタ)
名前 ビット数 説明
config 4

dmp_LightEnv.config に設定する値です。

0x0 : GL_LIGHT_ENV_LAYER_CONFIG0_DMP
0x1 : GL_LIGHT_ENV_LAYER_CONFIG1_DMP
0x2 : GL_LIGHT_ENV_LAYER_CONFIG2_DMP
0x3 : GL_LIGHT_ENV_LAYER_CONFIG3_DMP
0x4 : GL_LIGHT_ENV_LAYER_CONFIG4_DMP
0x5 : GL_LIGHT_ENV_LAYER_CONFIG5_DMP
0x6 : GL_LIGHT_ENV_LAYER_CONFIG6_DMP
0x8 : GL_LIGHT_ENV_LAYER_CONFIG7_DMP

fresnelSelector 2

dmp_LightEnv.fresnelSelector に設定する値です。

0x0 : GL_LIGHT_ENV_NO_FRESNEL_DMP
0x1 : GL_LIGHT_ENV_PRI_ALPHA_FRESNEL_DMP
0x2 : GL_LIGHT_ENV_SEC_ALPHA_FRESNEL_DMP
0x3 : GL_LIGHT_ENV_PRI_SEC_ALPHA_FRESNEL_DMP

enabledFresnelSelector 1

dmp_LightEnv.fresnelSelector に設定する値によって変化します。

0x0 : GL_LIGHT_ENV_NO_FRESNEL_DMP 以外の設定
0x1 : GL_LIGHT_ENV_NO_FRESNEL_DMP

bumpSelector 2

dmp_LightEnv.bumpSelector に設定する値です。

0x0 : GL_TEXTURE0
0x1 : GL_TEXTURE1
0x2 : GL_TEXTURE2
0x3 : GL_TEXTURE3

bumpMode 2

dmp_LightEnv.bumpMode に設定する値です。

0x0 : GL_LIGHT_ENV_BUMP_NOT_USED_DMP
0x1 : GL_LIGHT_ENV_BUMP_AS_BUMP_DMP
0x2 : GL_LIGHT_ENV_BUMP_AS_TANG_DMP

bumpRenorm 1

dmp_LightEnv.bumpRenorm に設定する値です。

0x0 : GL_TRUE または dmp_LightEnv.bumpModeGL_LIGHT_ENV_BUMP_NOT_USED_DMP
0x1 : 上記以外

clampHighlights 1

dmp_LightEnv.clampHighlights に設定する値です。

0x0 : GL_FALSE
0x1 : GL_TRUE

lutEnabledD0 1

dmp_LightEnv.lutEnabledD0 に設定する値です。

0x0 : GL_TRUE
0x1 : GL_FALSE

※ 設定する値に注意してください。

lutEnabledD1 1

dmp_LightEnv.lutEnabledD1 に設定する値です。

0x0 : GL_TRUE
0x1 : GL_FALSE

※ 設定する値に注意してください。

lutEnabledRefl 3

dmp_LightEnv.lutEnabledRefl に設定する値です。

0x0 : GL_TRUE
0x7 : GL_FALSE

※ 設定する値に注意してください。

※ 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)

シャドウテクスチャ設定に対応するレジスタは以下のとおりです。

図 8-40. シャドウテクスチャ設定レジスタ(0x008B)のビットレイアウト

0x008B shadowZBias perspectiveShadow

ビットレイアウト中の名前は以下のように予約ユニフォームに対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。

表 8-29. 名前と予約ユニフォームの対応(シャドウテクスチャ設定レジスタ)
名前 ビット数 説明
perspectiveShadow 1

dmp_Texture[0].perspectiveShadow に設定する値です。

0x0 : GL_TRUE
0x1 : GL_FALSE

※ 設定する値に注意してください。

shadowZBias 23

dmp_Texture[0].shadowZBias に設定する値を 23 ビット符号なし固定小数点数に変換した値です。

24 ビット固定小数点数に変換した値の上位 23 ビットを使用します。値の変換方法については「8.9.14. 小数部 24 ビットの符号なし 24 ビット固定小数点数への変換」を参照してください。

8.8.6.2. テクスチャサンプラータイプ設定レジスタ(0x0080, 0x0083)

テクスチャのサンプラータイプ設定に対応するレジスタは以下のとおりです。これらのレジスタのほかのビットには別の設定が行われることに注意してください。

図 8-41. テクスチャサンプラータイプ設定レジスタ(0x0080, 0x0083)のビットレイアウト

0x0080 0x0083 0x00 texcoord2 samplerType3 texcoord3 samplerType2 samplerType1 samplerType0 samplerType0 TEXTURE0_MIN_FILTER2 TEXTURE0_SHADOW_FLAG TEXTURE0_WRAP_S TEXTURE0_WRAP_T 0x0 TEXTURE0_FORMAT_ETC1 TEXTURE0_MIN_FILTER1 TEXTURE0_MAG_FILTER

ビットレイアウト中の名前は以下のように予約ユニフォームに対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。

表 8-30. 名前と予約ユニフォームの対応(テクスチャサンプラータイプ設定レジスタ)
名前 ビット数 説明
samplerType0 1 + 3

dmp_Texture[0].samplerType に設定する値によって、レジスタ 0x0080 と 0x0083 の対応するビットに設定する値が変化します。

GL_FALSE のときは、レジスタ 0x0080 のビット [ 0 : 0 ] と 0x0083 のビット [ 30 : 28 ] には、それぞれ 0x0 と 0x0 を設定します。

GL_FALSE 以外のときは、レジスタ 0x0080 のビット [ 0 : 0 ] には 0x1 を設定し、0x0083 のビット [ 30 : 28 ] には以下の値を設定します。

0x0 : GL_TEXTURE_2D
0x1 : GL_TEXTURE_CUBE_MAP
0x2 : GL_TEXTURE_SHADOW_2D_DMP
0x3 : GL_TEXTURE_PROJECTION_DMP
0x4 : GL_TEXTURE_SHADOW_CUBE_DMP

samplerType1 1

dmp_Texture[1].samplerType に設定する値です。

0x0 : GL_FALSE
0x1 : GL_TEXTURE_2D

samplerType2 1

dmp_Texture[2].samplerType に設定する値です。

0x0 : GL_FALSE
0x1 : GL_TEXTURE_2D

samplerType3 1

dmp_Texture[3].samplerType に設定する値です。

0x0 : GL_FALSE
0x1 : GL_TEXTURE_PROCEDURAL_DMP

dmp_Texture[0].samplerTypedmp_Texture[1].samplerTypedmp_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)

テクスチャユニットに入力されるテクスチャ座標の選択設定に対応するレジスタは以下のとおりです。このレジスタのほかのビットには別の設定が行われることに注意してください。

図 8-42. テクスチャ座標の選択設定レジスタ(0x0080)のビットレイアウト

0x0080 0x00 texcoord2 samplerType3 texcoord3 samplerType2 samplerType1 samplerType0 1 0

ビットレイアウト中の名前は以下のように予約ユニフォームに対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。

表 8-31. 名前と予約ユニフォームの対応(テクスチャ座標の選択設定レジスタ)
名前 ビット数 説明
texcoord2 1

dmp_Texture[2].texcoord に設定する値です。

0x0 : GL_TEXTURE2
0x1 : GL_TEXTURE1

texcoord3 2

dmp_Texture[3].texcoord に設定する値です。

0x0 : GL_TEXTURE0
0x1 : GL_TEXTURE1
0x2 : GL_TEXTURE2

8.8.6.4. プロシージャルテクスチャ設定レジスタ(0x00A8 ~ 0x00AD)

プロシージャルテクスチャ設定の予約ユニフォームに値を設定するレジスタのビットレイアウトは以下のようになっています。

図 8-43. プロシージャルテクスチャ設定レジスタ(0x00A8 ~ 0x00AD)のビットレイアウト

0x00A8 0x00A9 0x00AA 0x00AB 0x00AC 0x00AD ptTexBias_low ptShiftV ptShiftU ptNoiseEnable ptAlphaSeparate ptAlphaMap ptRgbMap ptClampV ptClampU ptNoiseU (P-parameter) ptNoiseU (A-parameter) ptNoiseV (P-parameter) ptNoiseV (A-parameter) ptNoiseV (F-parameter) ptNoiseU (F-parameter) ptTexBias_high ptTexWidth 0x60 ptMinFilter 0xE0C080 ptTexOffset

ビットレイアウト中の名前は以下のように予約ユニフォームに対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。

表 8-32. 名前と予約ユニフォームの対応(プロシージャルテクスチャ設定レジスタ)
名前 ビット数 説明

ptRgbMap

ptAlphaMap

4

上から、dmp_Texture[3].ptRgbMapdmp_Texture[3].ptAlphaMap に設定する値です。

0x0 : GL_PROCTEX_U_DMP
0x1 : GL_PROCTEX_U2_DMP
0x2 : GL_PROCTEX_V_DMP
0x3 : GL_PROCTEX_V2_DMP
0x4 : GL_PROCTEX_ADD_DMP
0x5 : GL_PROCTEX_ADD2_DMP
0x6 : GL_PROCTEX_ADDSQRT2_DMP
0x7 : GL_PROCTEX_MIN_DMP
0x8 : GL_PROCTEX_MAX_DMP
0x9 : GL_PROCTEX_RMAX_DMP

ptAlphaSeparate 1

dmp_Texture[3].ptAlphaSeparate に設定する値です。

0x0 : GL_FALSE
0x1 : GL_TRUE

ptClampU

ptClampV

3

上から、dmp_Texture[3].ptClampUdmp_Texture[3].ptClampV に設定する値です。

0x0 : GL_CLAMP_TO_ZERO_DMP
0x1 : GL_CLAMP_TO_EDGE
0x2 : GL_SYMMETRICAL_REPEAT_DMP
0x3 : GL_MIRRORED_REPEAT
0x4 : GL_PULSE_DMP

ptShiftU

ptShiftV

2

上から、dmp_Texture[3].ptShiftUdmp_Texture[3].ptShiftV に設定する値です。

0x0 : GL_NONE_DMP
0x1 : GL_ODD_EDGE
0x2 : GL_EVEN_DMP

ptMinFilter 3

dmp_Texture[3].ptMinFilter に設定する値です。

0x0 : GL_NEAREST
0x1 : GL_LINEAR
0x2 : GL_NEAREST_MIPMAP_NEAREST
0x3 : GL_LINEAR_MIPMAP_NEAREST
0x4 : GL_NEAREST_MIPMAP_LINEAR
0x5 : GL_LINEAR_MIPMAP_LINEAR

ptTexOffset

ptTexWidth

8 上から、dmp_Texture[3].ptTexOffsetdmp_Texture[3].ptTexWidth に設定する値です。ユニフォームで設定した値そのままです。

ptTexBias_high

ptTexBias_low

8 dmp_Texture[3].ptTexBias に設定する値ですが、16 ビットの浮動小数点数に変換したものを、上位と下位 8 ビットずつに分割して設定します。値の変換方法については「8.9.2. 16 ビット浮動小数点数への変換」を参照してください。
ptNoiseEnable 1

dmp_Texture[3].ptNoiseEnable に設定する値です。

0x0 : GL_FALSE
0x1 : GL_TRUE

ptNoiseU (F-parameter)

ptNoiseU (P-parameter)

ptNoiseU (A-parameter)

16

上から、dmp_Texture[3].ptNoiseU に設定する値の第 1 ~第 3 要素です。

第 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

上から、dmp_Texture[3].ptNoiseV に設定する値の第 1 ~第 3 要素です。

第 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 } で指定されるプロシージャルテクスチャの参照テーブルは、RgbMapAlphaMapNoiseMap が 128 個のデータと同数の差分値によって設定され、R、G、B、A が 256 個のデータと同数の差分値によって設定されます。

設定に使用するレジスタはデータの個数にかかわらず同じで、そのビットレイアウトは以下のようになっています。

図 8-44. プロシージャルテクスチャの参照テーブル設定レジスタ(0x00AF ほか)のビットレイアウト

0x00AF 0x00B0 0x00B7 Proc_Table Proc_Index Proc_Difference Proc_Value Proc_A Proc_B Proc_G Proc_R

レジスタ 0x00AF には、対象とする参照テーブルを Proc_Table に、設定開始インデックスを Proc_Index に設定します。0 が最初のデータです。Proc_Table に設定する値と参照テーブルの対応は以下のようになっています。設定する値(3 ビット)に対して 4 ビット幅が用意されていますが、ビット [ 11 : 11 ] に 0 を設定しなければ正しい参照テーブルが設定されません。

表 8-33. Proc_Table の値と参照テーブルの対応
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 それぞれにロードされているテクスチャの解像度を設定するレジスタは以下のとおりです。

図 8-45. テクスチャ解像度設定レジスタ(0x0082, 0x0092, 0x009A)のビットレイアウト

0x0082 0x0092 0x009A TEXTUREn_WIDTH TEXTUREn_HEIGHT

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 それぞれにロードされているテクスチャのフォーマットを設定するレジスタは以下のとおりです。

図 8-46. テクスチャフォーマット設定レジスタ(0x0083, 0x008E ほか)のビットレイアウト

0x0083 0x0093 0x009B 0x008E 0x0096 0x009E samplerType0 TEXTUREn_MIN_FILTER2 TEXTURE0_SHADOW_FLAG TEXTUREn_WRAP_S TEXTUREn_WRAP_T 0x0 TEXTUREn_FORMAT_ETC1 TEXTUREn_MIN_FILTER1 TEXTUREn_MAG_FILTER TEXTUREn_FORMAT

ビットレイアウト中の名前は以下のようにテクスチャのフォーマット設定に対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。テクスチャユニット 0 の設定がレジスタ 0x0083 と 0x008E に対して、テクスチャユニット 1 の設定がレジスタ 0x0093 と 0x0096 に対して、テクスチャユニット 2 の設定がレジスタ 0x009B と 0x009E に対してそれぞれ行われます。下表にない名前はほかの設定で使用するビットです。

表 8-34. 名前と設定の対応(テクスチャフォーマット設定レジスタ)
名前 ビット数 説明
TEXTUREn_FORMAT_ETC1 2

テクスチャユニット n(n = 0 ~ 2)にロードされているテクスチャのフォーマットが GL_ETC1_RGB8_NATIVE_DMP であるかどうかのフラグです。

0x00 : GL_ETC1_RGB8_NATIVE_DMP 以外
0x02 : GL_ETC1_RGB8_NATIVE_DMP

TEXTURE0_SHADOW_FLAG 1

テクスチャユニット 0 にロードされているテクスチャのフォーマットが GL_SHADOW_DMPGL_SHADOW_NATIVE_DMP)であるかどうかのフラグです。(レジスタ 0x0083 のみ)

0x0 : GL_SHADOW_DMPGL_SHADOW_NATIVE_DMP)以外
0x1 : GL_SHADOW_DMPGL_SHADOW_NATIVE_DMP

TEXTUREn_FORMAT 4

テクスチャユニット n(n = 0 ~ 2)に対する glTexImage2D() の引数 formattype または glCompressedTexImage2D の引数 internalformat の設定です。

0x0 : GL_RGBA, GL_UNSIGNED_BYTE, GL_SHADOW_DMP, GL_UNSIGNED_INT, GL_GAS_DMP, GL_UNSIGNED_SHORT
0x1 : GL_RGB, GL_UNSIGNED_BYTE
0x2 : GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1
0x3 : GL_RGB, GL_UNSIGNED_SHORT_5_6_5
0x4 : GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4
0x5 : GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE
0x6 : GL_HILO8_DMP, GL_UNSIGNED_BYTE
0x7 : GL_LUMINANCE, GL_UNSIGNED_BYTE
0x8 : GL_ALPHA, GL_UNSIGNED_BYTE
0x9 : GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE_4_4_DMP
0xA : GL_LUMINANCE, GL_UNSIGNED_4BITS_DMP
0xB : GL_ALPHA, GL_UNSIGNED_4BITS_DMP
0xC : GL_ETC1_RGB8_NATIVE_DMP
0xD : GL_ETC1_ALPHA_RGB8_A4_NATIVE_DMP

※ ネイティブフォーマットは、上記の対応する非ネイティブフォーマットと同じ設定値を使用します。

GL_RGB, GL_UNSIGNED_BYTE(0x1)をキューブマップで使用することはできません。

8.8.6.8. テクスチャパラメータ設定レジスタ(0x0081, 0x0083, 0x0084 ほか)

ラッピングモードやフィルタなど、テクスチャユニット 0 ~ 2 のテクスチャパラメータを設定するレジスタは以下のとおりです。

図 8-47. テクスチャパラメータ設定レジスタ(0x0081, 0x0083, 0x0084 ほか)のビットレイアウト

0x0081 0x0091 0x0099 0x0083 0x0093 0x009B 0x0084 0x0094 0x009C TEXTUREn_BORDER_ALPHA TEXTUREn_BORDER_BLUE TEXTUREn_BORDER_GREEN TEXTUREn_BORDER_RED samplerType0 TEXTUREn_MIN_FILTER2 TEXTURE0_SHADOW_FLAG 0x0 TEXTUREn_WRAP_S TEXTUREn_WRAP_T TEXTUREn_FORMAT_ETC1 TEXTUREn_MIN_FILTER1 TEXTUREn_MAG_FILTER TEXTUREn_MIN_LOD TEXTUREn_MAX_LOD TEXTUREn_LOD_BIAS

ビットレイアウト中の名前は以下のようにそれぞれの設定に対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。テクスチャユニット 0 の設定はレジスタ 0x0081、0x0083、0x0084 に対して、テクスチャユニット 1 の設定はレジスタ 0x0091、0x0093、0x0094 に対して、テクスチャユニット 2 の設定はレジスタ 0x0099、0x009B、0x009C に対してそれぞれ行います。下表にない名前はほかの設定で使用するビットです。

表 8-35. 名前と設定の対応(テクスチャパラメータ設定レジスタ)
名前 ビット数 説明

TEXTUREn_BORDER_RED

TEXTUREn_BORDER_GREEN

TEXTUREn_BORDER_BLUE

TEXTUREn_BORDER_ALPHA

8

テクスチャユニット n(n = 0 ~ 2)のテクスチャボーダーカラー(GL_TEXTURE_BORDER_COLOR)の各成分値です。

成分ごとに 0.0 ~ 1.0 の範囲を 0 ~ 255 にマップしたときの符号なし 8 ビット整数に変換した値を設定します。値の変換方法については「8.9.17. 浮動小数点数(0 ~ 1)から符号なし 8 ビット整数への変換 2」を参照してください。

TEXTUREn_MAG_FILTER 1

テクスチャユニット n(n = 0 ~ 2)のテクスチャ拡大時のフィルタ設定(GL_TEXTURE_MAG_FILTER)です。

0x0 : GL_NEAREST
0x1 : GL_LINEAR

TEXTUREn_MIN_FILTER1

TEXTUREn_MIN_FILTER2

1

テクスチャユニット n(n = 0 ~ 2)のテクスチャ縮小時のフィルタ設定(GL_TEXTURE_MIN_FILTER)です。

2 つのビットの組み合わせ(FILTER1, FILTER2)は以下のとおりです。同じ組み合わせに複数のフィルタ設定がある場合は、最小・最大 LOD レベルの設定により決定されます。

(0x0, 0x0) : GL_NEAREST, GL_NEAREST_MIPMAP_NEAREST
(0x0, 0x1) : GL_NEAREST_MIPMAP_LINEAR
(0x1, 0x0) : GL_LINEAR, GL_LINEAR_MIPMAP_NEAREST
(0x1, 0x1) : GL_LINEAR_MIPMAP_LINEAR

TEXTUREn_WRAP_S

TEXTUREn_WRAP_T

3

テクスチャユニット n(n = 0 ~ 2)のラッピングモード設定(GL_TEXTURE_WRAP_S, GL_TEXTURE_WRAP_T)です。

0x0 : GL_CLAMP_TO_EDGE
0x1 : GL_CLAMP_TO_BORDER
0x2 : GL_REPEAT
0x3 : GL_MIRRORED_REPEAT

TEXTUREn_MIN_LOD 4

テクスチャユニット n(n = 0 ~ 2)の最小 LOD レベルの設定(GL_TEXTURE_MIN_LOD)です。

縮小時のフィルタ設定が GL_LINEARGL_NEAREST のように LOD を使用しない場合は 0 を設定します。LOD を使用する場合は GL_TEXTURE_MIN_LOD の値を設定します。ただし、0 以下の値は 0 を設定します。

TEXTUREn_MAX_LOD 4

テクスチャユニット n(n = 0 ~ 2)の最大 LOD レベルの設定です。

縮小時のフィルタ設定が GL_LINEARGL_NEAREST のように LOD を使用しない場合は 0 を設定します。LOD を使用する場合はテクスチャのロード時に指定されていたミップマップの段数 - 1 の値を設定します。

TEXTUREn_LOD_BIAS 13

テクスチャユニット n(n = 0 ~ 2)の LOD バイアス値(GL_TEXTURE_LOD_BIAS)です。

設定値を小数部が 8 ビットの符号つき 13 ビット固定小数点数(負の値は 2 の補数表現)に変換した値が設定されます。値の変換方法については「8.9.8. 小数部 8 ビットの符号つき 13 ビット固定小数点数への変換」を参照してください。

8.8.6.9. シャドウテクスチャ、ガステクスチャを使用する場合の設定

シャドウテクスチャ(GL_SHADOW_DMP または GL_SHADOW_NATIVE_DMP)を使用する場合は、GL_TEXTURE_WRAP_SGL_TEXTURE_WRAP_T には 2D テクスチャならば GL_CLAMP_TO_BORDER を、キューブマップテクスチャならば GL_CLAMP_TO_EDGE を設定します。2D テクスチャ、キューブマップテクスチャに関係なく、GL_TEXTURE_MAG_FILTERGL_TEXTURE_MIN_FILTER には GL_LINEAR を、レジスタ 0x0083 のビット [ 20 : 20 ](TEXTURE0_SHADOW_FLAG)には 1 を設定します。このビットはシャドウテクスチャ以外のフォーマットであるときには 0 を設定します。なお、シャドウテクスチャにはミップマップを適用することができません。

ガステクスチャ(GL_GAS_DMP または GL_GAS_NATIVE_DMP)を使用する場合は、GL_TEXTURE_WRAP_SGL_TEXTURE_WRAP_T には GL_CLAMP_TO_EDGE を、GL_TEXTURE_MAG_FILTERGL_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 の他のビットはフォグ設定などで使用されていることに注意してください。

図 8-48. ガス制御設定レジスタ(0x00E0, 0x00E4, 0x00E5, 0x0120 ~ 0x0122, 0x0126)のビットレイアウト

0x00E0 0x00E4 0x00E5 0x0120 0x0121 0x0122 0x0125 0x0126 0x0 zFlip bufferInput1 bufferInput0 shadingDensitySrc mode attenuation accMax lightXY(lightAtt) lightXY(lightMax) lightXY(lightMin) lightZ(scattAtt) lightZ(scattMax) lightZ(scattMin) lightZ(LZ) colorLutInput autoAcc(Initialize) func2 deltaZ

ビットレイアウト中の名前は以下のように予約ユニフォームに対応しています。下表では、それぞれのビットと設定値の対応についても説明しています。

表 8-36. 名前と予約ユニフォームの対応(ガス制御設定レジスタ)
名前 ビット数 説明

lightXY (lightMin)

lightXY (lightMax)

lightXY (lightAtt)

8

上から、dmp_Gas.lightXY に設定する値の第 1 ~第 3 要素です。

どの要素も、ユニフォームの値(0.0 ~ 1.0)を 0 ~ 255 にマップしたときの符号なし 8 ビット整数に変換した値です。値の変換方法については「8.9.16. 浮動小数点数(0 ~ 1)から符号なし 8 ビット整数への変換」を参照してください。

lightZ (scattMin)

lightZ (scattMax)

lightZ (scattAtt)

lightZ (LZ)

8

上から、dmp_Gas.lightZ に設定する値の第 1 ~第 4 要素です。

どの要素も、ユニフォームの値(0.0 ~ 1.0)を 0 ~ 255 にマップしたときの符号なし 8 ビット整数に変換した値です。値の変換方法については「8.9.16. 浮動小数点数(0 ~ 1)から符号なし 8 ビット整数への変換」を参照してください。

deltaZ 24

dmp_Gas.deltaZ に設定する値です。

ユニフォームの値を小数部 8 ビットの符号なし 24 ビット固定小数点数に変換したものです。値の変換方法については「8.9.15. 小数部 8 ビットの符号なし 24 ビット固定小数点数への変換」を参照してください。

accMax 16

dmp_Gas.accMax に設定する値です。

ユニフォームの値を 16 ビット浮動小数点数に変換したものです。値の変換方法については「8.9.2. 16 ビット浮動小数点数への変換」を参照してください。

autoAcc(Initialize) 16

dmp_Gas.autoAccGL_TRUE を設定し、密度の最大値の逆数を自動的に計算させている場合は以下の手順が必要となります。

密度情報描画の前に 0 でクリアし、密度情報の描画が終わったときに nngxSetGasAutoAccumulationUpdate() を呼び出す。

詳細については表外の説明を参照してください。

attenuation 16

dmp_Gas.attenuation に設定する値です。

ユニフォームの値を 16 ビット浮動小数点数に変換したものです。値の変換方法については「8.9.2. 16 ビット浮動小数点数への変換」を参照してください。

colorLutInput 1

dmp_Gas.colorLutInput に設定する値です。

0x0 : GL_GAS_DENSITY_DMP
0x1 : GL_GAS_LIGHT_FACTOR_DMP

shadingDensitySrc 1

dmp_Gas.shadingDensitySrc に設定する値です。

0x0 : GL_GAS_PLAIN_DENSITY_DMP
0x1 : GL_GAS_DEPTH_DENSITY_DMP

密度情報の最大値の逆数を自動的に計算する場合

dmp_Gas.autoAccGL_TRUE を設定した際の機能は、ガスの密度情報描画パスで描画を行い、自動的に計算された密度情報 D1 の最大値の逆数を accMax に設定することで実現されます。

D1 の最大値は密度情報描画パスの開始前に 0 でクリアしておきます。クリアは autoAcc(Initialize) に 0(0 以外の値でクリアするときは、最大値を 16 ビット小数点数に変換して書き込んでください。値の変換方法については「8.9.2. 16 ビット浮動小数点数への変換」を参照してください)を書き込むことで行われます。密度情報描画パスが完了したあとは、算出された D1 の最大値を accMax に反映するために、nngxSetGasAutoAccumulationUpdate() を呼び出してください。

コード 8-22. 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 個のデータと同数の差分値によって設定されます。

設定に使用するレジスタのビットレイアウトは以下のようになっています。

図 8-49. シェーディング参照テーブル設定レジスタ(0x0123, 0x0124)のビットレイアウト

0x0123 0x0124 Shading_Index Shading_B Shading_G Shading_R

レジスタ 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 の他のビットはガス設定などで使用されていることに注意してください。

図 8-50. フォグ制御設定レジスタ(0x00E0, 0x00E1)のビットレイアウト

0x00E0 0x00E1 0x0 zFlip bufferInput1 bufferInput0 shadingDensitySrc mode color(Blue) color(Green) color(Red)

ビットレイアウト中の名前は以下のように予約ユニフォームに対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。

表 8-37. 名前と予約ユニフォームの対応(フォグ制御設定レジスタ)
名前 ビット数 説明
mode 3

dmp_Fog.mode に設定する値です。

0x0 : GL_FALSE
0x5 : GL_FOG
0x7 : GL_GAS_DMP

zFlip 1

dmp_Fog.zFlip に設定する値です。

0x0 : GL_FALSE
0x1 : GL_TRUE

color (Red)

color (Green)

color (Blue)

8

上から、dmp_Fog.color に設定する値の第 1 ~第 3 要素です。

どの要素も、ユニフォームの値(0.0 ~ 1.0)を 0 ~ 255 にマップしたときの符号なし 8 ビット整数に変換した値です。値の変換方法については「8.9.16. 浮動小数点数(0 ~ 1)から符号なし 8 ビット整数への変換」を参照してください。

8.8.8.2. フォグ参照テーブル設定レジスタ(0x00E6, 0x00E8 ~ 0x00EF)

予約ユニフォーム dmp_Fog.sampler で指定されるフォグ係数の参照テーブルは、128 個のデータと同数の差分値によって設定されます。設定に使用するレジスタのビットレイアウトは以下のようになっています。

図 8-51. フォグ参照テーブル設定レジスタ(0x00E6, 0x00E8 ~ 0x00EF)のビットレイアウト

レジスタ 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)」の設定も変更しなければなりません。

図 8-52. フラグメントオペレーションモード設定レジスタ(0x0100)のビットレイアウト

0x0100 0x0E4 enable FragmentOperation

ビットレイアウト中の名前は以下のように予約ユニフォームに対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。

表 8-38. 名前と予約ユニフォームの対応(フラグメントオペレーションモード設定レジスタ)
名前 ビット数 説明
FragmentOperation 2

dmp_FragOperation.mode に設定する値です。

0x0 : GL_FRAGOP_MODE_GL_DMP
0x1 : GL_FRAGOP_MODE_GAS_ACC_DMP
0x3 : GL_FRAGOP_MODE_SHADOW_DMP

8.8.9.2. シャドウ減衰ファクタ設定レジスタ(0x0130)

シャドウ減衰ファクタの設定に対応するレジスタは以下のとおりです。

図 8-53. シャドウ減衰ファクタ設定レジスタ(0x0130)のビットレイアウト

0x0130 penumbraScale penumbraBias 16ビット浮動小数点数変換 符号反転

表 8-39. シャドウ減衰ファクタ設定の予約ユニフォームとレジスタの対応
レジスタ ビット数 説明
0x0130 の
ビット [ 31 : 16 ]
16

dmp_FragOperation.penumbraScale の設定値の符号を反転し、16 ビット浮動小数点数に変換した値を設定します。

値の変換方法については「8.9.2. 16 ビット浮動小数点数への変換」を参照してください。

0x0130 の
ビット [ 15 : 0 ]
16

dmp_FragOperation.penumbraScale の設定値と dmp_FragOperation.penumbraBias の設定値との加算結果を、16 ビット浮動小数点数に変換して設定します。

値の変換方法については「8.9.2. 16 ビット浮動小数点数への変換」を参照してください。

8.8.9.3. w バッファ設定レジスタ(0x004D, 0x004E, 0x006D)

w バッファの設定に対応するレジスタは以下のとおりです。

図 8-54. wバッファ設定レジスタ(0x004D、0x004E、0x006D)のビットレイアウト

0x004D 0x004E 0x006D wScale z値へのスケール値 z値へのバイアス値

表 8-40. 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() で指定した zNearzFar を使用して(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)

クリッピングの設定に対応するレジスタは以下のとおりです。

図 8-55. クリッピング設定レジスタ(0x0047 ~ 0x004B)のビットレイアウト

0x0047 0x0048 0x004B enableClippingPlane clippingPlane1 ~ clippingPlane4

ビットレイアウト中の名前は以下のように予約ユニフォームに対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。

表 8-41. 名前と予約ユニフォームの対応(クリッピング設定レジスタ)
名前 ビット数 説明
enableClippingPlane 1

dmp_FragOperation.enableClippingPlane に設定する値です。

0x0 : GL_FALSE
0x1 : GL_TRUE

clippingPlane1

clippingPlane4

24

dmp_FragOperation.clippingPlane に設定する値の第 1 ~第 4 要素のそれぞれを、符号つき 24 ビット浮動小数点数に変換した値です。

値の変換方法については「8.9.1. 24 ビット浮動小数点数への変換」を参照してください。

8.8.9.5. アルファテスト設定レジスタ(0x0104)

アルファテストの設定に対応するレジスタは以下のとおりです。

図 8-56. アルファテスト設定レジスタ(0x0104)のビットレイアウト

0x0104 alphaRefValue alphaTestFunc enableAlphaTest

ビットレイアウト中の名前は以下のように予約ユニフォームに対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。

表 8-42. 名前と予約ユニフォームの対応(アルファテスト設定レジスタ)
名前 ビット数 説明
enableAlphaTest 1

dmp_FragOperation.enableAlphaTest に設定する値です。

0x0 : GL_FALSE
0x1 : GL_TRUE

alphaTestFunc 3

dmp_FragOperation.alphaTestFunc に設定する値です。

0x0 : GL_NEVER
0x1 : GL_ALWAYS
0x2 : GL_EQUAL
0x3 : GL_NOTEQUAL
0x4 : GL_LESS
0x5 : GL_LEQUAL
0x6 : GL_GREATER
0x7 : GL_GEQUAL

alphaRefValue 8

dmp_FragOperation.alphaRefValue に設定する値(0.0 ~ 1.0)を 0 ~ 255 にマップしたときの符号なし 8 ビット整数に変換した値です。

値の変換方法については「8.9.16. 浮動小数点数(0 ~ 1)から符号なし 8 ビット整数への変換」を参照してください。

8.8.9.6. フレームバッファアクセス制御設定レジスタ(0x0112 ~ 0x0115)

フレームバッファアクセスの制御設定に対応するレジスタは以下のとおりです。これらのレジスタは、いくつかの関数の呼び出しや予約ユニフォームの設定値変更を行ったときに、併せて変更しなければならない場合があります。

図 8-57. フレームバッファアクセス制御設定レジスタ(0x0112 ~ 0x0115)のビットレイアウト

0x0112 0x0113 0x0114 0x0115 colorRead colorWrite depthRead depthWrite

表 8-43. フレームバッファアクセス制御設定の予約ユニフォームとレジスタの対応
レジスタ ビット数 説明

colorRead

0x0112 の
ビット [ 3 : 0 ]

4

カラーバッファのリードが必要な場合には 0x0F を設定し、不要な場合には 0 を設定します。

 

以下のいずれかの条件に合致する場合、カラーバッファのリードが必要となります。

  • 予約ユニフォーム dmp_FragOperation.modeGL_FRAGOP_MODE_GL_DMP 以外の値が設定されている。
  • glColorMask() により、1 つ以上の成分が書き込み許可になっており、かつ glEnable() によって GL_BLEND が有効になっている。さらに、ブレンド時に DST カラーを参照するブレンドファクターが glBlendFunc() または glBlendFuncSeparate() で選択されている。
  • glColorMask() により、1 つ以上の成分が書き込み許可になっており、かつ glEnable() によって GL_COLOR_LOGIC_OP が有効になっている。さらに、DST カラーを参照する論理演算が glLogicOp() で選択されている。
  • glColorMask() により、1 つ以上の成分が書き込み許可になっており、かつ 1 つ以上の成分が書き込み禁止になっている。

colorWrite

0x0113 の
ビット [ 3 : 0 ]

4

カラーバッファのライトが必要な場合には 0x0F を設定し、不要な場合には 0 を設定します。

 

以下のいずれかの条件に合致する場合、カラーバッファのライトが必要となります。

  • 予約ユニフォーム dmp_FragOperation.modeGL_FRAGOP_MODE_GL_DMP 以外の値が設定されている。
  • glColorMask() により、1 つ以上の成分が書き込み許可になっている。

depthRead

0x0114 の
ビット [ 1 : 0 ]

2

デプスバッファのリードが必要な場合にはビット [ 1 : 1 ] に 1 を設定し、ステンシルバッファのリードが必要な場合にはビット [ 0 : 0 ] に 1 を設定します。不要な場合には 0 を設定します。

 

以下のいずれかの条件に合致する場合、デプスバッファのリードが必要となります。

  • 予約ユニフォーム dmp_FragOperation.modeGL_FRAGOP_MODE_GAS_ACC_DMP が設定されている。
  • 予約ユニフォーム dmp_FragOperation.modeGL_FRAGOP_MODE_GL_DMP が設定されており、かつ glEnable() により GL_DEPTH_TEST が有効、かつ glDepthMask()GL_TRUE が設定されている。
  • 予約ユニフォーム dmp_FragOperation.modeGL_FRAGOP_MODE_GL_DMP が設定されており、かつ glEnable() により GL_DEPTH_TEST が有効、かつ glColorMask() により 1 つ以上の成分が書き込み許可になっている。

 

以下のいずれかの条件に合致する場合、ステンシルバッファのリードが必要となります。

  • 予約ユニフォーム dmp_FragOperation.modeGL_FRAGOP_MODE_GAS_ACC_DMP が設定されている。
  • 予約ユニフォーム dmp_FragOperation.modeGL_FRAGOP_MODE_GL_DMP が設定されており、かつ glEnable() により GL_STENCIL_TEST が有効、かつ glStencilMask() に 0 以外の値が設定されている。
  • 予約ユニフォーム dmp_FragOperation.modeGL_FRAGOP_MODE_GL_DMP が設定されており、かつ glEnable() により GL_STENCIL_TEST が有効、かつ glColorMask() により 1 つ以上の成分が書き込み許可になっている。

depthWrite

0x0115 の
ビット [ 1 : 0 ]

2

デプスバッファのライトが必要な場合にはビット [ 1 : 1 ] に 1 を設定し、ステンシルバッファのライトが必要な場合にはビット [ 0 : 0 ] に 1 を設定します。不要な場合には 0 を設定します。

 

以下の条件を満たす場合、デプスバッファのライトが必要となります。

  • 予約ユニフォーム dmp_FragOperation.modeGL_FRAGOP_MODE_GL_DMP が設定されており、かつ glEnable() により GL_DEPTH_TEST が有効、かつ glDepthMask()GL_TRUE が設定されている。

 

以下の条件を満たす場合、ステンシルバッファのライトが必要となります。

  • 予約ユニフォーム dmp_FragOperation.modeGL_FRAGOP_MODE_GL_DMP が設定されており、かつ glEnable() により GL_STENCIL_TEST が有効、かつ glStencilMask() に 0 以外の値が設定されている。

カラーバッファ、デプスバッファ、ステンシルバッファのリードおよびライトの有無の組み合わせの中には、ハードウェアでサポートされていない組み合わせがあります。サポートされていない組み合わせで設定された場合の動作は不定です。サポートされている組み合わせについては下記の表を参照してください。

表 8-44. ハードウェアでサポートされている組み合わせ
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.modeGL_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.modeGL_FRAGOP_MODE_GL_DMP が設定されている。
  • カラーマスク設定レジスタ(0x0107)のビット [ 11 : 8 ] が 0x0 に設定されている。

 

デプスバッファのリードアクセスをオフに設定することができるのは、

  • 予約ユニフォーム dmp_FragOperation.modeGL_FRAGOP_MODE_GL_DMP が設定されている。
  • デプステストが無効、もしくは有効であっても比較方法にデプスバッファの値を必要としない。

上記の条件をすべて満たすか、下記の条件を満たす場合です。

  • 予約ユニフォーム dmp_FragOperation.modeGL_FRAGOP_MODE_SHADOW_DMP が設定されている。

 

デプスバッファのライトアクセスをオフに設定することができるのは、下記の条件のいずれかを満たす場合です。

  • デプステスト(レジスタ 0x0107 のビット [ 0 : 0 ])が無効(0x0)に設定されている。
  • デプスバッファのマスキング設定(レジスタ 0x0107 のビット [ 12 : 12 ])が GL_FALSE(0x0)に設定されている。
  • 予約ユニフォーム dmp_FragOperation.modeGL_FRAGOP_MODE_GL_DMP 以外が設定されている。

 

ステンシルバッファのリードアクセスをオフに設定することができるのは、

  • 予約ユニフォーム dmp_FragOperation.modeGL_FRAGOP_MODE_SHADOW_DMP が設定されている。

上記の条件を満たすか、予約ユニフォーム dmp_FragOperation.modeGL_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.modeGL_FRAGOP_MODE_GL_DMP 以外が設定されている。

 

8.8.10. ビューポート設定レジスタ(0x0041 ~ 0x0044, 0x0068)

glViewport() で行われるビューポートの設定に対応するレジスタは以下のとおりです。これらのレジスタを設定したときは、「8.8.16. シザーテスト設定レジスタ(0x0065 ~ 0x0067)」も併せて変更しなければならない場合があります。

図 8-58. ビューポート設定レジスタ(0x0041 ~ 0x0044, 0x0068)のビットレイアウト

0x0041 0x042 0x0043 0x0044 0x0068 VIEWPORT_WIDTH VIEWPORT_WIDTH_INV VIEWPORT_HEIGHT VIEWPORT_HEIGHT_INV VIEWPORT_Y VIEWPORT_X

ビットレイアウト中の名前は以下のようにビューポートの設定に対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。

表 8-45. 名前と設定の対応(ビューポート設定レジスタ)
名前 ビット数 説明
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)」も併せて変更しなければならない場合があります。

図 8-59. デプステスト設定レジスタ(0x0107)のビットレイアウト

0x0107 0x0126 alpha flag blue green red enable func func2 deltaZ

ビットレイアウト中の名前は以下のようにデプステストの設定に対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。表中にない名前は、ほかの設定で使用するビットです。

表 8-46. 名前と設定の対応(デプステスト設定レジスタ)
名前 ビット数 説明
enable 1

glEnable / glDisableGL_DEPTH_TEST を渡して変更した、デプステストの有効・無効を設定します。

0x0 : デプステスト無効
0x1 : デプステスト有効

func 3

glDepthFunc() で変更した、デプステストの比較方法の設定です。

0x0 : GL_NEVER
0x1 : GL_ALWAYS
0x2 : GL_EQUAL
0x3 : GL_NOTEQUAL
0x4 : GL_LESS
0x5 : GL_LEQUAL
0x6 : GL_GREATER
0x7 : GL_GEQUAL

flag 1

glDepthMask() で変更した、デプスバッファへのマスキング設定です。

0x0 : GL_FALSE
0x1 : GL_TRUE

func2 2

glDepthFunc() で変更した、デプステストの比較方法の設定です。ただし、この設定は通常のデプステストには影響せず、ガスレンダリングの密度情報描画パスにおける密度情報 D2 の計算に影響を与えます。

0x0 : GL_NEVER
0x1 : GL_ALWAYS
0x2 : GL_GREATER または GL_GEQUAL
0x3 : 上記以外

8.8.12. 論理演算とブレンディング設定レジスタ(0x0100 ~ 0x0103)

論理演算とブレンディングの設定に対応するレジスタは以下のとおりです。これらのレジスタを設定したときは、「8.8.9.6. フレームバッファアクセス制御設定レジスタ(0x0112 ~ 0x0115)」も併せて変更しなければならない場合があります。

図 8-60. 論理演算とブレンディング設定レジスタ(0x0100 ~ 0x0103)のビットレイアウト

0x0100 0x0101 0x0102 0x0103 0x0E4 enable FragmentOperation dstAlpha srcAlpha dstRGB srcRGB modeAlpha modeRGB opcode alpha blue green red

ビットレイアウト中の名前は以下のように論理演算とブレンディングの設定に対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。

表 8-47. 名前と設定の対応(論理演算とブレンディング設定レジスタ)
名前 ビット数 説明
enable 1

glEnable() / glDisable()GL_BLEND または GL_LOGIC_OP を渡して変更した結果、論理演算またはブレンディングのどちらが有効になっているかを設定します。両方が有効に設定されている場合は論理演算が優先され、両方が無効に設定されている場合はブレンディングが優先されます。

0x0 : 論理演算が有効
0x1 : ブレンディングが有効

srcRGB

dstRGB

srcAlpha

dstAlpha

4

glBlendFunc()glBlendFuncSeparate() で変更した、ソースとディスティネーションの重み係数の設定です。

ブレンディングが無効である場合、srcRGB と srcAlpha には 0x1 を、dstRGB と dstAlpha には 0x0 を設定します。

ブレンディングが有効である場合は以下の値を設定します。

0x0 : GL_ZERO
0x1 : GL_ONE
0x2 : GL_SRC_COLOR
0x3 : GL_ONE_MINUS_SRC_COLOR
0x4 : GL_DST_COLOR
0x5 : GL_ONE_MINUS_DST_COLOR
0x6 : GL_SRC_ALPHA
0x7 : GL_ONE_MINUS_SRC_ALPHA
0x8 : GL_DST_ALPHA
0x9 : GL_ONE_MINUS_DST_ALPHA
0xA : GL_CONSTANT_COLOR
0xB : GL_ONE_MINUS_CONSTANT_COLOR
0xC : GL_CONSTANT_ALPHA
0xD : GL_ONE_MINUS_CONSTANT_ALPHA
0xE : GL_SRC_ALPHA_SATURATE

modeRGB

modeAlpha

3

glBlendEquation()glBlendEquationSeparate() で変更した、ブレンディングの計算式の設定です。

ブレンディングが無効である場合、0x0 を設定します。

ブレンディングが有効である場合は以下の値を設定します。

0x0 : GL_FUNC_ADD
0x1 : GL_FUNC_SUBTRACT
0x2 : GL_FUNC_REVERSE_SUBTRACT
0x3 : GL_MIN
0x4 : GL_MAX

red

green

blue

alpha

8

上から、glBlendColor() で設定した定数カラーの赤、緑、青、アルファの成分です。

どの成分も、値(0.0 ~ 1.0)を 0 ~ 255 にマップしたときの符号なし 8 ビット整数に変換した値です。値の変換方法については「8.9.16. 浮動小数点数(0 ~ 1)から符号なし 8 ビット整数への変換」を参照してください。

opcode 4

glLogicOp() で変更した、論理演算の演算方法の設定です。

0x0 : GL_CLEAR
0x1 : GL_AND
0x2 : GL_AND_REVERSE
0x3 : GL_COPY
0x4 : GL_SET
0x5 : GL_COPY_INVERTED
0x6 : GL_NOOP
0x7 : GL_INVERT
0x8 : GL_NAND
0x9 : GL_OR
0xA : GL_NOR
0xB : GL_XOR
0xC : GL_EQUIV
0xD : GL_AND_INVERTED
0xE : GL_OR_REVERSE
0xF : GL_OR_INVERTED

論理演算が有効になっている場合は、レジスタ 0x0101 の設定(srcXXX、dstXXX、modeXXX)は無視されます。

8.8.13. アーリーデプステスト設定レジスタ(0x0061 ~ 0x0063, 0x006A, 0x0118)

アーリーデプステストの設定に対応するレジスタは以下のとおりです。これらのレジスタを設定したときは、「8.8.9.6. フレームバッファアクセス制御設定レジスタ(0x0112 ~ 0x0115)」と「8.8.11. デプステスト設定レジスタ(0x0107, 0x0126)」も併せて変更しなければならない場合があります。

図 8-61. アーリーデプステスト設定レジスタ(0x0061 ~ 0x0063, 0x006A, 0x0118)のビットレイアウト

0x0061 0x0062 0x0063 0x006A 0x0118 EarlyDepthFunc EnableEarlyDepthTest0 ClearEarlyDepthBit ClearEarlyDepthValue EnableEarlyDepthTest1

ビットレイアウト中の名前は以下のように論理演算とブレンディングの設定に対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。

表 8-48. 名前と設定の対応(アーリーデプステスト設定レジスタ)
設定する関数 ビット数 説明

EnableEarlyDepthTest0

EnableEarlyDepthTest1

1

1

glEnable() / glDisable()GL_EARLY_DEPTH_TEST_DMP を渡して変更した、アーリーデプステストの有効・無効を設定します。

0x0 : アーリーデプステストが無効
0x1 : アーリーデプステストが有効

EarlyDepthFunc 2

glEarlyDepthFuncDMP() の引数 func で指定した、比較方法の設定です。

0x0 : GL_GEQUAL
0x1 : GL_GREATOR
0x2 : GL_LEQUAL
0x3 : GL_LESS

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)」も併せて変更しなければならない場合があります。

図 8-62. ステンシルテスト設定レジスタ(0x0105, 0x0106)のビットレイアウト

0x0105 0x0106 mask ref fb_mask func enable zpass zfail fail

ビットレイアウト中の名前は以下のようにステンシルテストの設定に対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。

表 8-49. 名前と設定の対応(ステンシルテスト設定レジスタ)
名前 ビット数 説明
enable 1

glEnable() / glDisable()GL_STENCIL_TEST を渡して変更した、ステンシルテストの有効・無効を設定します。

0x0 : ステンシルテストが無効
0x1 : ステンシルテストが有効

fb_mask 8 glStencilMask() の引数 mask で指定した、ステンシルバッファのマスキング値です。引数に渡す値の下位 8 ビットを設定します。
func 3

glStencilFunc() の引数 func で変更した、比較方法の設定です。

0x0 : GL_NEVER
0x1 : GL_ALWAYS
0x2 : GL_EQUAL
0x3 : GL_NOTEQUAL
0x4 : GL_LESS
0x5 : GL_LEQUAL
0x6 : GL_GREATER
0x7 : GL_GEQUAL

ref 8 glStencilFunc() の引数 ref で指定した、ステンシルテストの参照値です。引数に渡す値そのままを設定します。
mask 8 glStencilFunc() の引数 mask で指定した、ステンシルテストのマスキング値です。引数に渡す値そのままを設定します。
fail 3

glStencilOp() の引数 fail で変更した、ステンシルテストでフラグメントが棄却された際のステンシルバッファの変更内容の設定です。

0x0 : GL_KEEP
0x1 : GL_ZERO
0x2 : GL_REPLACE
0x3 : GL_INCR
0x4 : GL_DECR
0x5 : GL_INVERT
0x6 : GL_INCR_WRAP
0x7 : GL_DECR_WRAP

zfail 3 glStencilOp() の引数 zfail で変更した、デプステストでフラグメントが棄却された際のステンシルバッファの変更内容の設定です。設定値は fail と同じです。
zpass 3 glStencilOp() の引数 zpass で変更した、デプステストでフラグメントが通過した際のステンシルバッファの変更内容の設定です。設定値は fail と同じです。

8.8.15. カリング設定レジスタ(0x0040)

カリングの設定に対応するレジスタは以下のとおりです。

図 8-63. カリング設定レジスタ(0x0040)のビットレイアウト

0x0040 Culling

ビットレイアウト中の名前は以下のようにステンシルテストの設定に対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。

表 8-50. 名前と設定の対応(カリング設定レジスタ)
名前 ビット数 説明
Culling 2

glDisable(GL_CULL_FACE) によってカリングが無効になっている場合は 0x0 を設定します。

glEnable(GL_CULL_FACE) によってカリングが有効になっている場合は、glCullFace()glFrontFace() に渡した引数の組み合わせで設定する値を以下のように変化させます。

glCullFace()GL_FRONT かつ glFrontFace()GL_CW、または glCullFace()GL_BACK かつ glFrontFace()GL_CCW ならば 0x2 を設定します。

上記以外の場合は 0x1 を設定します。

8.8.16. シザーテスト設定レジスタ(0x0065 ~ 0x0067)

シザーテストの設定に対応するレジスタは以下のとおりです。

図 8-64. シザーテスト設定レジスタ(0x0065 ~ 0x0067)のビットレイアウト

0x0065 0x0066 0x0067 enable x y width height

ビットレイアウト中の名前は以下のようにシザーテストの設定に対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。

表 8-51. 前と設定の対応(シザーテスト設定レジスタ)
名前 ビット数 説明
enable 2

glEnable() / glDisable()GL_SCISSOR_TEST を渡して変更した、シザーテストの有効・無効の設定です。

0x0 : シザーテストが無効
0x3 : シザーテストが有効

x 10

glScissor() の引数 x で指定した、シザーボックスの始点座標(x 方向)です。

シザーテストが無効である場合は 0 を設定します。

シザーテストが有効である場合は引数 x の値そのままを設定しますが、x がカレントのカラーバッファの幅以上ならば(カレントのカラーバッファの幅 - 1)が、x が負の値ならば 0 を設定します。

y 10

glScissor() の引数 y で指定した、シザーボックスの始点座標(y 方向)です。

シザーテストが無効である場合は 0 を設定します。

シザーテストが有効である場合は引数 y の値そのままを設定しますが、y がカレントのカラーバッファの高さ以上ならば(カレントのカラーバッファの高さ - 1)が、y が負の値ならば 0 を設定します。

width 10

glScissor() の引数 width で指定した、シザーボックスの幅です。

シザーテストが無効である場合は(カレントのカラーバッファの幅 - 1)を設定します。

シザーテストが有効である場合は(x + width - 1)の計算結果を設定しますが、計算結果がカレントのカラーバッファの幅以上ならば(カレントのカラーバッファの幅 - 1)が、計算結果が負の値ならば 0 を設定します。

height 10

glScissor() の引数 height で指定した、シザーボックスの高さです。

シザーテストが無効である場合は(カレントのカラーバッファの高さ - 1)を設定します。

シザーテストが有効である場合は(y + height - 1)の計算結果を設定しますが、計算結果がカレントのカラーバッファの高さ以上ならば(カレントのカラーバッファの高さ - 1)が、計算結果が負の値ならば 0 を設定します。

8.8.17. カラーマスク設定レジスタ(0x0107)

glColorMask() で行われるカラーマスク設定に対応するレジスタは以下のとおりです。これらのレジスタを設定したときは、「8.8.9.6. フレームバッファアクセス制御設定レジスタ(0x0112 ~ 0x0115)」も併せて変更しなければならない場合があります。

図 8-65. カラーマスク設定レジスタ(0x0107)のビットレイアウト

0x0107 flag alpha blue green red enable func

ビットレイアウト中の名前は以下のようにカラーマスクの設定に対応しています。下表では、それぞれのビット数と設定値の対応についても説明しています。表中にない名前は、「8.8.11. デプステスト設定レジスタ(0x0107, 0x0126)」で使用するビットです。

表 8-52. 名前と設定の対応(カラーマスク設定レジスタ)
名前 ビット数 説明
red 1

glColorMask() の引数 red で指定した、カラーマスクの赤成分の設定です。

0x0 : GL_FALSE
0x1 : GL_TRUE

green 1

glColorMask() の引数 green で指定した、カラーマスクの緑成分の設定です。

0x0 : GL_FALSE
0x1 : GL_TRUE

blue 1

glColorMask() の引数 blue で指定した、カラーマスクの青成分の設定です。

0x0 : GL_FALSE
0x1 : GL_TRUE

alpha 1

glColorMask() の引数 alpha で指定した、カラーマスクのアルファ成分の設定です。

0x0 : GL_FALSE
0x1 : GL_TRUE

8.8.18. ブロックフォーマット設定レジスタ(0x011B)

ブロックフォーマットの設定に対応するレジスタは以下のとおりです。

表 8-53. ブロックフォーマット設定とレジスタの対応
設定する関数 レジスタ 説明
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. 頂点バッファを使用する場合の設定

頂点バッファを使用して描画を行う場合、以下のレジスタに対して設定を行います。コマンドの設定順序についての断りがない場合、各コマンドは描画開始コマンドより前に設定されていなければなりません。

図 8-66. 描画に頂点バッファを使用した場合の設定レジスタのビットレイアウト

0x0227 0x0228 0x0229 0x022A 0x022E 0x022F 0x0231 0x0245 0x0253 0x025E 0x025F INDEX_ARRAY_TYPE INDEX_ARRAY_OFFSET VERTEX_NUM USE_SUBDIVISION DRAW_TRIANGLES1 USE_GEOM_SHADER FIRST_OFFSET KICK_COMMAND1 KICK_COMMAND2 CLEAR_POST_VTX 0x00 DRAW_START DRAW_TRIANGLES2 CALL_DRAWARRAYS DUMMY_CMD DRAW_MODE 0x00000000 RESET_VTX_INFO

ビットレイアウト中の名前は以下のようにそれぞれの設定に対応しています。

表 8-54. 名前と設定の対応(描画に頂点バッファを使用した場合の設定レジスタ)
名前 ビット数 説明

DRAW_MODE

DRAW_TRIANGLES1

DRAW_TRIANGLES2

2

1

1

glDrawElements() または glDrawArrays() の引数 mode で指定された描画モードの設定です。設定が変更にならない限り、再設定は必要ありません。

0x0 : GL_TRIANGLESglDrawArrays() のみ)
0x1 : GL_TRIANGLE_STRIP
0x2 : GL_TRIANGLE_FAN
0x3 : GL_GEOMETRY_PRIMITIVE_DMP(ただし、glDrawElements() では、DRAW_TRIANGLES1DRAW_TRIANGLES2 に 1 がセットされている場合は GL_TRIANGLES が指定されます)

CALL_DRAWARRAYS 1

glDrawElements() であれば常に 0 を、glDrawArrays() であれば 1 を設定します。ただし、ライブラリの初期化時に 0 が設定されますので、glDrawArrays() の呼び出し時には 1 を設定し、関数の終了時に 0 を設定します。

1 に設定した場合、レジスタ 0x0200~0x0254 と 0x0280~0x02DF 以外のレジスタへの設定が正しく実行されない可能性があります。

INDEX_ARRAY_OFFSET 28

頂点インデックスアレイのアドレスオフセットの設定です。レジスタ 0x0200 のビット [ 28 : 1 ] に設定されている、頂点アレイ共通のベースアドレスからのオフセット値です。ベースアドレス× 16 に、このオフセット値を加算した結果が、glBufferData() で確保された頂点バッファの先頭アドレスと glDrawElements() の引数 indices を加算した値と等しくなるようにします。

glDrawArrays() の場合、以下の条件を満たす場合には 0x20 を、それ以外の場合には 0 を設定します。

  • VERTEX_NUM が 0x10 より大きい場合:
    ((VERTEX_NUM – 0x10)×2 + (ARRAY_BASE_ADDR << 4 )) & 0xFFF >= 0xFE0
  • VERTEX_NUM が 0x10 以下の場合:
    (ARRAY_BASE_ADDR << 4 ) & 0xFFF >= 0xFE0

VERTEX_NUM はレジスタ 0x0228 の [ 31 : 0 ] の設定、ARRAY_BASE_ADDR はレジスタ 0x0200 の [ 28 : 1 ] の設定です。

設定が変更にならない限り、再設定は必要ありません。

INDEX_ARRAY_TYPE 1

頂点インデックスの型の設定です、glDrawElements() の引数 typeGL_UNSIGNED_SHORT の場合は 1 を、GL_UNSIGNED_BYTE の場合は 0 を設定します。

glDrawArrays() の場合は常に 1 を設定します。設定が変更にならない限り、再設定は必要ありません。

VERTEX_NUM 32 描画する頂点数の設定です。設定が変更にならない限り、再設定は必要ありません。0 を設定した場合の動作は不定ですので、0 を設定しないでください。
FIRST_OFFSET 32 glDrawArrays() を描画する場合の引数 first の値です。設定が変更にならない限り、再設定は必要ありません。
RESET_VTX_INFO 1

このビットに 1 を書き込むと、三角形を構成するインデックス 0、1、2 の頂点の情報がリセットされます。

描画モードの引数を GL_GEOMETRY_PRIMITIVE_DMP にしている場合や、GL_TRIANGLES を引数に glDrawElements() で描画する場合は、設定する必要ありません。

GL_TRIANGLES を引数に glDrawArrays() で描画する際は、頂点数が 3 の倍数であれば、同じモードで連続して呼び出す(その間に glDrawElements() を呼び出さない)場合に限り、2 回目以降の呼び出し時にリセットする必要はありません。ほかのモードで描画したあとや glDrawElements() のあと、ライブラリの初期化後に初めて呼び出すときにはリセットしなければなりません。

GL_TRIANGLE_STRIP または GL_TRIANGLE_FAN を引数にした場合は、どちらの関数でも、描画開始コマンドごとにリセットする必要があります。

KICK_COMMAND1

KICK_COMMAND2

特殊

描画を開始するときに、任意のビットに 1 を書き込みます。

KICK_COMMAND1(0x022E)が glDrawArrays()、KICK_COMMAND2(0x022F)が glDrawElements() です。

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 の範囲の設定コマンドが正しく反映されません。

glDrawElements()glDrawArrays() では、描画開始コマンドの直前で 0 に設定し、直後に 1 に戻すようにコマンドが生成されます。

描画開始コマンド後も、レジスタ 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 と同じです。以下にビットレイアウト中の名前と設定との対応を示します。頂点属性データコマンドが描画開始コマンドと同じように扱われます。コマンドの設定順序についての断りがない場合、各コマンドは描画開始コマンドより前に設定されていなければなりません。

表 8-55. 名前と設定の対応(描画に頂点バッファを使用しない場合の設定レジスタ)
名前 ビット数 説明

DRAW_MODE

DRAW_TRIANGLES1

DRAW_TRIANGLES2

2

1

1

glDrawElements() または glDrawArrays() の引数 mode で指定された描画モードの設定です。設定が変更にならない限り、再設定は必要ありません。

0x0 : GL_TRIANGLES
0x1 : GL_TRIANGLE_STRIP
0x2 : GL_TRIANGLE_FAN
0x3 : GL_GEOMETRY_PRIMITIVE_DMP

DRAW_TRIANGLES1DRAW_TRIANGLES2 には 0 を設定します。

CALL_DRAWARRAYS 1

glDrawElements()glDrawArrays()  のどちらを呼び出しても同じです。ライブラリの初期化時に 0 が設定されますので、関数の呼び出し時には 1 を設定し、関数の終了時に 0 を設定します。

1 に設定されている場合、レジスタ 0x0200~0x0254 と 0x0280~0x02DF 以外のレジスタへの設定が正しく実行されない可能性があります。

INDEX_ARRAY_OFFSET 28 使用しません。
INDEX_ARRAY_TYPE 1 使用しません。
VERTEX_NUM 32 使用しません。処理される頂点数は、入力される頂点属性データの個数で決まります。
FIRST_OFFSET 32 使用しません。
RESET_VTX_INFO 1

GL_TRIANGLES を引数に glDrawElements() または glDrawArrays() で描画する際は、頂点数が 3 の倍数であれば、頂点バッファを使用しない glDrawElements() または glDrawArrays() を同じモードで連続して呼び出す場合に限り、2 回目以降の呼び出し時にリセットする必要はありません。ほかのモードで描画したあとや、頂点バッファを使用した glDrawElements() のあと、ライブラリの初期化後に初めて呼び出すときにはリセットしなければなりません。

そのほかの描画モード(GL_GEOMETRY_PRIMITIVE_DMPGL_TRIANGLE_STRIPGL_TRIANGLE_FAN)では、頂点バッファを使用する場合と違いはありません。

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-67. 浮動小数点定数レジスタのインデックス指定(0x0290)のビットレイアウト

0x0290 MODE INDEX

8.8.20.2. ブールレジスタ(0x0280)

設定に使用するレジスタのアドレスが異なるだけで、レジスタに設定する値は「8.8.1.2. ブールレジスタ(0x02B0)」と同じです。

レジスタ 0x0280 がレジスタ 0x02B0 に対応しています。

図 8-68. ブールレジスタ(0x0280)のビットレイアウト

0x0280 0x7FFF b15 b0

8.8.20.3. 整数レジスタ(0x0281 ~ 0x0284)

設定に使用するレジスタのアドレスが異なるだけで、レジスタに設定する値は「8.8.1.3. 整数レジスタ(0x02B1 ~ 0x02B4)」と同じです。

レジスタ 0x0281 ~ 0x0284 がレジスタ 0x02B1 ~ 0x02B4 に対応しています。

図 8-69. 整数レジスタ(0x0281 ~ 0x0284)のビットレイアウト

0x0281 0x284 x y z

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-70. プログラムコードのロードレジスタ(0x029B ~ 0x02A3)のビットレイアウト

0x29B 0x029C 0x02A3 ADDR DATA

図 8-71. Swizzle パターンのロードレジスタ(0x02A5 ~ 0x02AD)のビットレイアウト

0x02A5 0x02A6 0x02AD ADDR DATA

8.8.20.5. 開始アドレス設定レジスタ(0x028A)

設定に使用するレジスタのアドレスが異なるだけで、レジスタに設定する値は「8.8.1.5. 開始アドレス設定レジスタ(0x02BA)」と同じです。

レジスタ 0x028A がレジスタ 0x02BA に対応しています。

図 8-72. 開始アドレス設定レジスタ(0x028A)のビットレイアウト

0x028A 0x7FFF addr

8.8.20.6. 頂点属性入力数設定レジスタ(0x0289)

ジオメトリシェーダに入力する頂点属性数を設定するレジスタを以下に示します。

図 8-73. 頂点属性入力数設定レジスタ(0x0289)のビットレイアウト

0x0289 useGeometryShader useSubdivisionShader count

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-74. 入力レジスタのマッピング設定レジスタ(0x028B, 0x028C)のビットレイアウト

0x028B 0x028C attrib_0 attrib_1 attrib_2 attrib_3 attrib_4 attrib_5 attrib_6 attrib_7 attrib_8 attrib_9 attrib_10 attrib_11 attrib_12 attrib_13 attrib_14 attrib_15

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-75. 出力レジスタのマスク設定レジスタ(0x028D)のビットレイアウト

0x028D 0x0000 o15 o0

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)

ジオメトリシェーダを使用する際に設定する、そのほかのレジスタは以下のとおりです。

表 8-56. そのほかのレジスタ(ジオメトリシェーダ)
レジスタ 説明
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)

フレームバッファキャッシュクリアの設定に対応するレジスタは以下のとおりです。

図 8-76. フレームバッファキャッシュクリアの設定レジスタ(0x0110, 0x0111)のビットアウト

0x0110 0x0111 0x00000000 clearFrameBufferCacheTag clearFrameBufferCacheData

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 の割り込み処理を発生させることなく別のコマンドバッファを実行することができます。

図 8-77. コマンドバッファ実行レジスタ(0x0238 ~ 0x023D)

0x0238 0x0239 0x023A 0x023B 0x023C 0x023D BUFFER_SIZE_CHANNEL0 BUFFER_SIZE_CHANNEL1 BUFFER_ADDR_CHANNEL0 BUFFER_ADDR_CHANNEL1 KICK_CHANNEL0 KICK_CHANNEL1

コマンドバッファ実行インターフェースには 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 個のコマンドバッファを実行させることができます。

図 8-78. コマンドバッファの連続実行

描画が開始されるとチャンネル0でコマンドバッファ1が実行される コマンドバッファ1 コマンドバッファ2のサイズ(0x0238) コマンドバッファ2のアドレス(0x023A) チャンネル0を実行(0x023C) チャンネル0でコマンドバッファ2が続けて実行される コマンドバッファ2 コマンドバッファ3のサイズ(0x0238) コマンドバッファ3のアドレス(0x023A) チャンネル0でコマンドバッファ3が続けて実行される コマンドバッファN-1 コマンドバッファNのサイズ(0x0238) コマンドバッファNのアドレス(0x023A) コマンドバッファN 区切りコマンド(0x0010)

通常、コマンドバッファの最後には上図のコマンドバッファ N のように区切りコマンドを格納します。そこで区切りコマンドの代わりに、次に実行するコマンドバッファのサイズとアドレスの設定コマンドとキックコマンドの組み合わせを格納すれば、GPU の割り込みを発生させることなく複数のコマンドバッファを実行することができ、CPU 負荷の軽減に繋がります。ただし、最後のコマンドバッファで実行される最後のコマンドは区切りコマンドでなければなりません。

最初のコマンドバッファを実行するには、nngxAdd3DCommand() の引数 bufferaddrbuffersize にそのコマンドバッファの先頭アドレスとサイズ、copycmdGL_FALSE を渡して呼び出してください。

8.8.23.2. 同じコマンドバッファの繰り返し実行

先の例では、同じ内容を繰り返し実行する場合でも別のコマンドバッファとして用意しなければなりませんが、2 つあるチャンネルを利用することで同じコマンドバッファを繰り返し実行させることができます。

例えば、以下の組み合わせであれば、連続するレジスタへの書き込みコマンド 1 つでジャンプ用のコマンドを構成することができます。ただし、ジャンプ先のコマンドバッファの最後がチャンネル 1 のキックコマンドである必要があります。

表 8-57. ジャンプ用コマンドの構成
レジスタ 設定する値
BUFFER_SIZE_CHANNEL0 ジャンプ先のコマンドバッファのサイズ
BUFFER_SIZE_CHANNEL1 戻り先のコマンドバッファのサイズ(次のジャンプ用コマンドまたは区切りコマンドまで)
BUFFER_ADDR_CHANNEL0 ジャンプ先のコマンドバッファのアドレス
BUFFER_ADDR_CHANNEL1 戻り先のコマンドバッファのアドレス(このジャンプ用コマンドの直後)
KICK_CHANNEL0 任意(キックコマンドを実行する)
図 8-79. ジャンプ用コマンドの構成

この方法では、ジャンプ元のコマンドバッファで予め戻り先のアドレス情報を設定しておくため、ジャンプ先のコマンドバッファにアドレス情報を含める必要がありません。

上図では、コマンドバッファ 1 でジャンプ先をチャンネル 0 側に、戻り先をチャンネル 1 側に設定したあと、チャンネル 0 のキックコマンドでコマンドバッファ A を実行し、コマンドバッファ A の最後にあるチャンネル 1 のキックコマンドでコマンドバッファ 1 に実行を戻しています。実行中にジャンプ先のコマンドバッファ A の内容を変更することはできませんので、ジャンプ先から戻る際に使用するチャンネルを固定にする必要があることに注意してください。

戻り先の最後に再度ジャンプ用コマンドを格納すれば、同じコマンドバッファを繰り返し実行させることができます。最初のコマンドバッファを実行するには、nngxAdd3DCommand()bufferaddrbuffersize にそのコマンドバッファの先頭アドレスと最初のキックコマンドまでのサイズ、copycmdGL_FALSE を渡して呼び出してください。各ジャンプ用コマンドに含まれるチャンネル 1 のコマンドサイズには、ジャンプ元への戻り先アドレスから次のキックコマンドまでのサイズを設定してください。

図 8-80. 同じコマンドバッファの繰り返し実行

描画が開始されるとチャンネル0でコマンドバッファ1が実行される コマンドバッファ1 ジャンプ用コマンド この区間はチャンネル1で実行される 区切りコマンド(0x0010) チャンネル0のキックコマンドでコマンドバッファAにジャンプ コマンドバッファA チャンネル1のキックコマンドでコマンドバッファ1に戻る

この方法を用いれば、以下のような処理を行うことができます。

  • 特定の描画処理を繰り返し実行
  • ジャンプ先の情報を編集して描画処理を分岐
  • 描画処理をモジュール化し、ジャンプ用コマンドのみでシーンを構成

8.8.24. 未記載のビットに対する設定について

これまでに説明したレジスタのうち、情報が記載されていないビットの設定には、バイトイネーブルに 0 を設定することによりアクセスを行わないものや、固定値を設定しているものがあります。それらのビットへのアクセスに関する情報を記載します。記載のないビットに関しては、GPU に影響がないものとして任意の値を設定することができますが、なるべくバイトイネーブルに 0 を設定することを推奨します。また、レジスタそのものの情報が記載されていない場合は、設定を行わないでください。

固定値を設定するように記載されているレジスタは、nngxInitialize() の実行時に各固定値で初期化されますので、アプリケーションで初期化するためのコマンドを発行する必要はありません。固定値を設定するビットと、値の変更が可能なビットが同じレジスタの同じバイト存在する場合は、変更する値と固定値とを同時に書き込む必要があります。

表 8-58. 未記載ビットの設定情報
レジスタ 説明
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. ポイントシェーダ

ポイントシェーダの使用時に設定するレジスタの値を以下に示します。

表 8-59. ポイントシェーダ使用時のレジスタ設定値
レジスタ 説明
0x004F のビット [ 2 : 0 ] リンクした頂点シェーダで定義されている出力レジスタの個数を設定します。generic 属性は個数に含みません。
0x0050 ~ 0x0056

リンクした頂点シェーダで定義した出力レジスタの属性を 0x0050 から詰めて設定します。

0x0050 には 0x03020100 を設定します。generic 属性としてポイントサイズが出力されますが、本レジスタには影響しません。続けて、小さいインデックスの出力レジスタから順に、定義した属性を 0x0051 から詰めて設定します。

例えば、ポイントスプライトであれば、頂点座標の次にテクスチャ座標が設定されるはずなので、#pragma output_map(texture0, o2.xy) と定義されていれば、0x0051 には 0x1F1F0D0C と設定します。

未使用属性の部分は 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 }に以下の値の組み合わせを設定します。

{0x0000004C, 0x00000000, 0x00003F00, 0x00000000}

ポイントシェーダで設定する予約ユニフォームは特定のレジスタに割り当てられていますので、使用時には以下のレジスタに対しても設定を行わなければなりません。

表 8-60. ポイントシェーダの予約ユニフォームに割り当てられているレジスタ
予約ユニフォーム 割り当てられているレジスタ
dmp_Point.viewport c67.xy
dmp_Point.distanceAttenuation b0

8.8.25.2. ラインシェーダ

ラインシェーダの使用時に設定するレジスタの値を以下に示します。

表 8-61. ラインシェーダ使用時のレジスタ設定値
レジスタ 説明
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 }に以下の値の組み合わせを設定します。

{0x0000004C, 0x40800040, 0x00003F00, 0x00000000}

ラインシェーダで設定する予約ユニフォームは特定のレジスタに割り当てられていますので、使用時には以下のレジスタに対しても設定を行わなければなりません。

表 8-62. ラインシェーダの予約ユニフォームに割り当てられているレジスタ
予約ユニフォーム 割り当てられているレジスタ
dmp_Line.width c67.xyzw

8.8.25.3. シルエットシェーダ

シルエットシェーダの使用時に設定するレジスタの値を以下に示します。

表 8-63. シルエットシェーダ使用時のレジスタ設定値
レジスタ 説明
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 }に以下の値の組み合わせを設定します。

{0x0000004C, 0x40800040, 0x00003F00, 0x00000000}
{0x0000004D, 0x00000000, 0x00004140, 0x00410000}

シルエットシェーダで設定する予約ユニフォームは特定のレジスタに割り当てられていますので、使用時には以下のレジスタに対しても設定を行わなければなりません。

表 8-64. シルエットシェーダの予約ユニフォームに割り当てられているレジスタ
予約ユニフォーム 割り当てられているレジスタ
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 サブディビジョンシェーダの使用時に設定するレジスタの値を以下に示します。

表 8-65. 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 を設定します。
DMP_subdivision2.obj ならば 0x0216FF を設定します。
DMP_subdivision3.obj ならば 0x021AFF を設定します。
DMP_subdivision4.obj ならば 0x021EFF を設定します。
DMP_subdivision5.obj ならば 0x0222FF を設定します。
DMP_subdivision6.obj ならば 0x0226FF を設定します。

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 }に以下の値の組み合わせを設定します。

{0x0000004C, 0x3C80003B, 0x00003C80, 0x003E2000}
{0x0000004D, 0x0000003E, 0x00003C00, 0x003D8000}
{0x0000004E, 0x4300003D, 0x00003E80, 0x00420000}
{0x0000004F, 0x3C60003C, 0xC8003780, 0x00390000}
{0x00000050, 0x3D0C0039, 0x80003700, 0x003B8000}
{0x00000051, 0x3CC0003C, 0x70003A60, 0x003C2800}
{0x00000052, 0x3D16003B, 0x0C003500, 0x003D8000}
{0x00000053, 0x3DAAAA39, 0xC71C3C55, 0x55BE2AAA}
{0x00000054, 0x3D871C3A, 0x425E3C55, 0x55BE3C71}
{0x00000055, 0x3E200039, 0x00003B80, 0x00BDC000}
{0x00000056, 0x3D940039, 0x8FFF3C04, 0x00BE3600}
{0x00000057, 0x0000003F, 0x00004180, 0x00C0C000}
{0x00000058, 0x00000040, 0x00004230, 0x00C17000}
{0x00000059, 0x000000C0, 0xC000C350, 0x00428800}

さらに、
DMP_subdivision1.obj の場合のみ
{0x0000004B, 0x42000041, 0x80004100, 0x00400000}

DMP_subdivision2.obj の場合のみ
{0x0000004B, 0x42800042, 0x20004180, 0x00408000}

DMP_subdivision3.obj の場合のみ
{0x0000004B, 0x43000042, 0x80004200, 0x00410000}

DMP_subdivision4.obj の場合のみ
{0x0000004B, 0x43400042, 0xE0004240, 0x00414000}

DMP_subdivision5.obj の場合のみ
{0x0000004B, 0x43800043, 0x20004280, 0x00418000}

DMP_subdivision6.obj の場合のみ
{0x0000004B, 0x43C00043, 0x500042C0, 0x0041C000}

Catmull-Clark サブディビジョンシェーダで設定する予約ユニフォームは特定のレジスタに割り当てられていますので、使用時には以下のレジスタに対しても設定を行わなければなりません。

表 8-66. Catmull-Clark サブディビジョンシェーダの予約ユニフォームに割り当てられているレジスタ
予約ユニフォーム 割り当てられているレジスタ
dmp_Subdivision.Level c74.x
dmp_Subdivision.fragmentLightingEnabled b2

8.8.25.5. ループサブディビジョンシェーダ

ループサブディビジョンシェーダの使用時に設定するレジスタの値を以下に示します。

表 8-67. ループサブディビジョンシェーダ使用時のレジスタ設定値
レジスタ 説明
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 }に以下の値の組み合わせを設定します。

{0x00000057, 0x40800040, 0x00003F00, 0x00000000}
{0x00000058, 0x3D00003E, 0x000056FF, 0xFF3C0000}
{0x00000059, 0x3800003D, 0x00003E80, 0x003D3000}
{0x0000005A, 0x3CE0003B, 0x00003D80, 0x00390000}
{0x0000005B, 0x3C60003A, 0x80003B80, 0x00000000}
{0x0000005C, 0x3C98003D, 0x9C003C80, 0x003DC000}
{0x0000005D, 0x3DE0003E, 0x10003D80, 0x003E4000}

ループサブディビジョンシェーダで設定する予約ユニフォームは特定のレジスタに割り当てられていますので、使用時には以下のレジスタに対しても設定を行わなければなりません。

表 8-68. ループサブディビジョンシェーダの予約ユニフォームに割り当てられているレジスタ
予約ユニフォーム 割り当てられているレジスタ
dmp_Subdivision.Level c86.x
dmp_Subdivision.fragmentLightingEnabled b0

8.8.25.6. パーティクルシステムシェーダ

パーティクルシステムシェーダの使用時に設定するレジスタの値を以下に示します。

表 8-69. パーティクルシステムシェーダ使用時のレジスタ設定値
レジスタ 説明
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 }に以下の値の組み合わせを設定します。

{0x0000004C, 0x3F0000BF, 0x00003F00, 0x00000000}
{0x0000004D, 0x40921F3C, 0x45F34192, 0x1F3E0000}
{0x0000005D, 0x3F00003F, 0x0000BC55, 0x55BE0000}
{0x0000005E, 0x3811113A, 0x5555B2A0, 0x1AB56C16}
{0x0000005F, 0x2C71DE2F, 0xA01AA5AE, 0x64A927E4}

パーティクルシステムシェーダで設定する予約ユニフォームは特定のレジスタに割り当てられていますので、使用時には以下のレジスタに対しても設定を行わなければなりません。

表 8-70. パーティクルシステムシェーダの予約ユニフォームに割り当てられているレジスタ
予約ユニフォーム 割り当てられているレジスタ
dmp_PartSys.color c26.xyzwc29.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.xyzwc37.xyzw
dmp_PartSys.randomCore c38.xyzw

8.9. レジスタに設定する値へのフォーマット変換

レジスタに設定する値のいくつかは、アプリケーションで設定した値から内部フォーマットに変換されて設定されています。そのほとんどは 32 ビット浮動小数点数から変換された値となっています。

8.9.1. 24 ビット浮動小数点数への変換

32 ビット浮動小数点数から 24 ビット浮動小数点数(符号部 1 ビット、指数部 7 ビット、仮数部 16 ビット)への変換コードを以下に示します。_inarg に 32 ビット浮動小数点数を渡すと、_outargunsigned int 型変数に 24 ビット浮動小数点数が格納されます。

コード 8-23. 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 ビット浮動小数点数を渡すと、_outargunsigned int 型変数に 16 ビット浮動小数点数が格納されます。

コード 8-24. 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 ビット浮動小数点数を渡すと、_outargunsigned int 型変数に 31 ビット浮動小数点数が格納されます。

コード 8-25. 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 ビット浮動小数点数を渡すと、_outargunsigned int 型変数に 20 ビット浮動小数点数が格納されます。

コード 8-26. 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 ビット固定小数点数が格納されます。

コード 8-27. 小数部 7 ビットの符号つき 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 ビット固定小数点数が格納されます。

コード 8-28. 小数部 11 ビットの符号つき 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 ビット固定小数点数が格納されます。

コード 8-29. 小数部 11 ビットの符号つき 12 ビット固定小数点数への変換コード 2
#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 ビット固定小数点数が格納されます。

コード 8-30. 小数部 8 ビットの符号つき 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 ビット固定小数点数が格納されます。

コード 8-31. 小数部 11 ビットの符号つき 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 ビット固定小数点数が格納されます。

コード 8-32. 小数部 12 ビットの符号つき 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 ビット固定小数点数が格納されます。

コード 8-33. 小数部 0 ビットの符号なし 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 ビット固定小数点数が格納されます。

コード 8-34. 小数部 11 ビットの符号なし 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 ビット固定小数点数が格納されます。

コード 8-35. 小数部 12 ビットの符号なし 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 ビット固定小数点数が格納されます。

コード 8-36. 小数部 24 ビットの符号なし 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 ビット固定小数点数が格納されます。

コード 8-37. 小数部 8 ビットの符号なし 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 ビット整数が返ります。

コード 8-38. 浮動小数点数(0 ~ 1)から符号なし 8 ビット整数への変換コード
((unsigned)(0.5f + (f) * (float)((1 << 8) - 1)))

8.9.17. 浮動小数点数(0 ~ 1)から符号なし 8 ビット整数への変換 2

0 ~ 1 の範囲の 32 ビット浮動小数点数から符号なし 8 ビット整数への変換コードを以下に示します。f に 32 ビット浮動小数点数を渡すと、符号なし 8 ビット整数が返ります。

コード 8-39. 浮動小数点数(0 ~ 1)から符号なし 8 ビット整数への変換コード 2
((unsigned)((f) * (float)((1 << 8) - 1)))

8.9.18. 浮動小数点数(-1 ~ 1)から符号つき 8 ビット整数への変換

-1 ~ 1 の範囲の 32 ビット浮動小数点数から符号つき 8 ビット整数への変換コードを以下に示します。f に 32 ビット浮動小数点数を渡すと、符号つき 8 ビット整数が返ります。

コード 8-40. 浮動小数点数(-1 ~ 1)から符号つき 8 ビット整数への変換コード
(((unsigned int)(fabs(127.f * (f))) & 0x7f)|(f < 0 ? 0x80 : 0))

8.9.19. 16 ビット浮動小数点数から 32 ビット浮動小数点数への変換

16 ビット浮動小数点数(符号部 1 ビット、指数部 5 ビット、仮数部 10 ビット)から 32 ビット浮動小数点数への変換コードを以下に示します。_inargunsigned int 型変数に格納された 16 ビット浮動小数点数を渡すと、_outargfloat 型変数に 32 ビット浮動小数点数が格納されます。

コード 8-41. 16 ビット浮動小数点数から 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 のレジスタマップ

表 8-71. レジスタマップ(アドレス 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.wScaleglDepthRangef()glDisable(GL_POLYGON_OFFSET_FILL)glEnable(GL_POLYGON_OFFSET_FILL)glPolygonOffset()

FSUNIFORM

TRIOFFSET

0x004E
0x004F

8.8.1.10

8.8.20.8

出力レジスタの使用数設定 SHADERPROGRAM
0x0050~0x0056

8.8.1.12

8.8.20.10

出力レジスタの属性設定 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.1.12

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

8.8.1.13

8.8.20.11

出力属性のクロック制御 SHADERPROGRAM
0x0080 8.8.6.2 dmp_Texture[i].samplerType (i=0,1,2) TEXTURE
8.8.6.3 dmp_Texture[2].texcoorddmp_Texture[3].texcoorddmp_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].perspectiveShadowdmp_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].ptClampUdmp_Texture[3].ptClampVdmp_Texture[3].ptRgbMapdmp_Texture[3].ptAlphaMapdmp_Texture[3].ptAlphaSeparatedmp_Texture[3].ptNoiseEnabledmp_Texture[3].ptShiftUdmp_Texture[3].ptShiftVdmp_Texture[3].ptTexBias FSUNIFORM
0x00A9~0x00AB dmp_Texture[3].ptNoiseUdmp_Texture[3].ptNoiseV FSUNIFORM
0x00AC dmp_Texture[3].ptMinFilterdmp_Texture[3].ptTexWidthdmp_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].srcRgbdmp_TexEnv[0].srcAlpha FSUNIFORM
0x00C1 dmp_TexEnv[0].operandRgbdmp_TexEnv[0].operandAlpha FSUNIFORM
0x00C2 dmp_TexEnv[0].combineRgbdmp_TexEnv[0].combineAlpha FSUNIFORM
0x00C3 dmp_TexEnv[0].constRgba FSUNIFORM
0x00C4 dmp_TexEnv[0].scaleRgbdmp_TexEnv[0].scaleAlpha FSUNIFORM
0x00C8 8.8.4 dmp_TexEnv[1].srcRgbdmp_TexEnv[1].srcAlpha FSUNIFORM
0x00C9 dmp_TexEnv[1].operandRgbdmp_TexEnv[1].operandAlpha FSUNIFORM
0x00CA dmp_TexEnv[1].combineRgbdmp_TexEnv[1].combineAlpha FSUNIFORM
0x00CB dmp_TexEnv[1].constRgba FSUNIFORM
0x00CC dmp_TexEnv[1].scaleRgbdmp_TexEnv[1].scaleAlpha FSUNIFORM
0x00D0 8.8.4 dmp_TexEnv[2].srcRgbdmp_TexEnv[2].srcAlpha FSUNIFORM
0x00D1 dmp_TexEnv[2].operandRgbdmp_TexEnv[2].operandAlpha FSUNIFORM
0x00D2 dmp_TexEnv[1].combineRgbdmp_TexEnv[1].combineAlpha FSUNIFORM
0x00D3 dmp_TexEnv[2].constRgba FSUNIFORM
0x00D4 dmp_TexEnv[2].scaleRgbdmp_TexEnv[2].scaleAlpha FSUNIFORM
0x00D8 8.8.4 dmp_TexEnv[3].srcRgbdmp_TexEnv[3].srcAlpha FSUNIFORM
0x00D9 dmp_TexEnv[3].operandRgbdmp_TexEnv[3].operandAlpha FSUNIFORM
0x00DA dmp_TexEnv[3].combineRgbdmp_TexEnv[3].combineAlpha FSUNIFORM
0x00DB dmp_TexEnv[3].constRgba FSUNIFORM
0x00DC dmp_TexEnv[3].scaleRgbdmp_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.modedmp_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].srcRgbdmp_TexEnv[4].srcAlpha FSUNIFORM
0x00F1 dmp_TexEnv[4].operandRgbdmp_TexEnv[4].operandAlpha FSUNIFORM
0x00F2 dmp_TexEnv[4].combineRgbdmp_TexEnv[4].combineAlpha FSUNIFORM
0x00F3 dmp_TexEnv[4].constRgba FSUNIFORM
0x00F4 dmp_TexEnv[4].scaleRgbdmp_TexEnv[4].scaleAlpha FSUNIFORM
0x00F8 8.8.4 dmp_TexEnv[5].srcRgbdmp_TexEnv[5].srcAlpha FSUNIFORM
0x00F9 dmp_TexEnv[5].operandRgbdmp_TexEnv[5].operandAlpha FSUNIFORM
0x00FA dmp_TexEnv[5].combineRgbdmp_TexEnv[5].combineAlpha FSUNIFORM
0x00FB dmp_TexEnv[5].constRgba FSUNIFORM
0x00FC dmp_TexEnv[5].scaleRgbdmp_TexEnv[5].scaleAlpha FSUNIFORM
0x00FD 8.8.4.1 dmp_TexEnv[0].bufferColor FSUNIFORM

8.10.2. レジスタ 0x0100 ~ 0x01FF のレジスタマップ

表 8-72. レジスタマップ(アドレス 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.enableAlphaTestdmp_FragOperation.alphaTestFuncdmp_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.modeglDisable(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.penumbraScaledmp_FragOperation.penumbraBias FSUNIFORM
0x0140 8.8.5.3 dmp_FragmentMaterial.specular0dmp_FragmentLightSource[0].specular0 FSUNIFORM
0x0141 dmp_LightEnv.lutEnabledRefldmp_FragmentMaterial.specular1dmp_FragmentLightSource[0].specular1 FSUNIFORM
0x0142 dmp_FragmentMaterial.diffusedmp_FragmentLightSource[0].diffuse FSUNIFORM
0x0143 dmp_FragmentMaterial.ambientdmp_FragmentLightSource[0].ambient FSUNIFORM
0x0144 dmp_FragmentLightSource[0].position FSUNIFORM
0x0145
0x0146 dmp_FragmentLightSource[0].spotDirection FSUNIFORM
0x0147
0x0149 dmp_FragmentLightSource[0].positiondmp_FragmentLightSource[0].twoSideDiffusedmp_FragmentLightSource[0].geomFactor0dmp_FragmentLightSource[0].geomFactor1 FSUNIFORM
0x014A dmp_FragmentLightSource[0].distanceAttenuationBias FSUNIFORM
0x014B dmp_FragmentLightSource[0].distanceAttenuationScale FSUNIFORM
0x0150 8.8.5.3 dmp_FragmentMaterial.specular0dmp_FragmentLightSource[1].specular0 FSUNIFORM
0x0151 dmp_LightEnv.lutEnabledRefldmp_FragmentMaterial.specular1dmp_FragmentLightSource[1].specular1 FSUNIFORM
0x0152 dmp_FragmentMaterial.diffusedmp_FragmentLightSource[1].diffuse FSUNIFORM
0x0153 dmp_FragmentMaterial.ambientdmp_FragmentLightSource[1].ambient FSUNIFORM
0x0154 dmp_FragmentLightSource[1].position FSUNIFORM
0x0155
0x0156 dmp_FragmentLightSource[1].spotDirection FSUNIFORM
0x0157
0x0159 dmp_FragmentLightSource[1].positiondmp_FragmentLightSource[1].twoSideDiffusedmp_FragmentLightSource[1].geomFactor0dmp_FragmentLightSource[1].geomFactor1 FSUNIFORM
0x015A dmp_FragmentLightSource[1].distanceAttenuationBias FSUNIFORM
0x015B dmp_FragmentLightSource[1].distanceAttenuationScale FSUNIFORM
0x0160 8.8.5.3 dmp_FragmentMaterial.specular0dmp_FragmentLightSource[2].specular0 FSUNIFORM
0x0161 dmp_LightEnv.lutEnabledRefldmp_FragmentMaterial.specular1dmp_FragmentLightSource[2].specular1 FSUNIFORM
0x0162 dmp_FragmentMaterial.diffusedmp_FragmentLightSource[2].diffuse FSUNIFORM
0x0163 dmp_FragmentMaterial.ambientdmp_FragmentLightSource[2].ambient FSUNIFORM
0x0164 dmp_FragmentLightSource[2].position FSUNIFORM
0x0165
0x0166 dmp_FragmentLightSource[2].spotDirection FSUNIFORM
0x0167
0x0169 dmp_FragmentLightSource[2].positiondmp_FragmentLightSource[2].twoSideDiffusedmp_FragmentLightSource[2].geomFactor0dmp_FragmentLightSource[2].geomFactor1 FSUNIFORM
0x016A dmp_FragmentLightSource[2].distanceAttenuationBias FSUNIFORM
0x016B dmp_FragmentLightSource[2].distanceAttenuationScale FSUNIFORM
0x0170 8.8.5.3 dmp_FragmentMaterial.specular0dmp_FragmentLightSource[3].specular0 FSUNIFORM
0x0171 dmp_LightEnv.lutEnabledRefldmp_FragmentMaterial.specular1dmp_FragmentLightSource[3].specular1 FSUNIFORM
0x0172 dmp_FragmentMaterial.diffusedmp_FragmentLightSource[3].diffuse FSUNIFORM
0x0173 dmp_FragmentMaterial.ambientdmp_FragmentLightSource[3].ambient FSUNIFORM
0x0174 dmp_FragmentLightSource[3].position FSUNIFORM
0x0175
0x0176 dmp_FragmentLightSource[3].spotDirection FSUNIFORM
0x0177
0x0179 dmp_FragmentLightSource[3].positiondmp_FragmentLightSource[3].twoSideDiffusedmp_FragmentLightSource[3].geomFactor0dmp_FragmentLightSource[3].geomFactor1 FSUNIFORM
0x017A dmp_FragmentLightSource[3].distanceAttenuationBias FSUNIFORM
0x017B dmp_FragmentLightSource[3].distanceAttenuationScale FSUNIFORM
0x0180 8.8.5.3 dmp_FragmentMaterial.specular0dmp_FragmentLightSource[4].specular0 FSUNIFORM
0x0181 dmp_LightEnv.lutEnabledRefldmp_FragmentMaterial.specular1dmp_FragmentLightSource[4].specular1 FSUNIFORM
0x0182 dmp_FragmentMaterial.diffusedmp_FragmentLightSource[4].diffuse FSUNIFORM
0x0183 dmp_FragmentMaterial.ambientdmp_FragmentLightSource[4].ambient FSUNIFORM
0x0184 dmp_FragmentLightSource[4].position FSUNIFORM
0x0185
0x0186 dmp_FragmentLightSource[4].spotDirection FSUNIFORM
0x0187
0x0189 dmp_FragmentLightSource[4].positiondmp_FragmentLightSource[4].twoSideDiffusedmp_FragmentLightSource[4].geomFactor0dmp_FragmentLightSource[4].geomFactor1 FSUNIFORM
0x018A dmp_FragmentLightSource[4].distanceAttenuationBias FSUNIFORM
0x018B dmp_FragmentLightSource[4].distanceAttenuationScale FSUNIFORM
0x0190 8.8.5.3 dmp_FragmentMaterial.specular0dmp_FragmentLightSource[5].specular0 FSUNIFORM
0x0191 dmp_LightEnv.lutEnabledRefldmp_FragmentMaterial.specular1dmp_FragmentLightSource[5].specular1 FSUNIFORM
0x0192 dmp_FragmentMaterial.diffusedmp_FragmentLightSource[5].diffuse FSUNIFORM
0x0193 dmp_FragmentMaterial.ambientdmp_FragmentLightSource[5].ambient FSUNIFORM
0x0194 dmp_FragmentLightSource[5].position FSUNIFORM
0x0195
0x0196 dmp_FragmentLightSource[5].spotDirection FSUNIFORM
0x0197
0x0199 dmp_FragmentLightSource[5].positiondmp_FragmentLightSource[5].twoSideDiffusedmp_FragmentLightSource[5].geomFactor0dmp_FragmentLightSource[5].geomFactor1 FSUNIFORM
0x019A dmp_FragmentLightSource[5].distanceAttenuationBias FSUNIFORM
0x019B dmp_FragmentLightSource[5].distanceAttenuationScale FSUNIFORM
0x01A0 8.8.5.3 dmp_FragmentMaterial.specular0dmp_FragmentLightSource[6].specular0 FSUNIFORM
0x01A1 dmp_LightEnv.lutEnabledRefldmp_FragmentMaterial.specular1dmp_FragmentLightSource[6].specular1 FSUNIFORM
0x01A2 dmp_FragmentMaterial.diffusedmp_FragmentLightSource[6].diffuse FSUNIFORM
0x01A3 dmp_FragmentMaterial.ambientdmp_FragmentLightSource[6].ambient FSUNIFORM
0x01A4 dmp_FragmentLightSource[6].position FSUNIFORM
0x01A5
0x01A6 dmp_FragmentLightSource[6].spotDirection FSUNIFORM
0x01A7
0x01A9 dmp_FragmentLightSource[6].positiondmp_FragmentLightSource[6].twoSideDiffusedmp_FragmentLightSource[6].geomFactor0dmp_FragmentLightSource[6].geomFactor1 FSUNIFORM
0x01AA dmp_FragmentLightSource[6].distanceAttenuationBias FSUNIFORM
0x01AB dmp_FragmentLightSource[6].distanceAttenuationScale FSUNIFORM
0x01B0 8.8.5.3 dmp_FragmentMaterial.specular0dmp_FragmentLightSource[7].specular0 FSUNIFORM
0x01B1 dmp_LightEnv.lutEnabledRefldmp_FragmentMaterial.specular1dmp_FragmentLightSource[7].specular1 FSUNIFORM
0x01B2 dmp_FragmentMaterial.diffusedmp_FragmentLightSource[7].diffuse FSUNIFORM
0x01B3 dmp_FragmentMaterial.ambientdmp_FragmentLightSource[7].ambient FSUNIFORM
0x01B4 dmp_FragmentLightSource[7].position FSUNIFORM
0x01B5
0x01B6 dmp_FragmentLightSource[7].spotDirection FSUNIFORM
0x01B7
0x01B9 dmp_FragmentLightSource[7].positiondmp_FragmentLightSource[7].twoSideDiffusedmp_FragmentLightSource[7].geomFactor0dmp_FragmentLightSource[7].geomFactor1 FSUNIFORM
0x01BA dmp_FragmentLightSource[7].distanceAttenuationBias FSUNIFORM
0x01BB dmp_FragmentLightSource[7].distanceAttenuationScale FSUNIFORM
0x01C0 8.8.5.2 dmp_FragmentLighting.ambientdmp_FragmentMaterial.ambientdmp_FragmentMaterial.emission FSUNIFORM
0x01C2 8.8.5.1 dmp_FragmentLightSource[i].enabledi=0~7) FSUNIFORM
0x01C3 8.8.5.8 dmp_LightEnv.invertShadowdmp_LightEnv.shadowAlphadmp_LightEnv.shadowPrimarydmp_LightEnv.shadowSecondarydmp_LightEnv.shadowSelector FSUNIFORM
8.8.5.9 dmp_LightEnv.bumpModedmp_LightEnv.bumpRenormdmp_LightEnv.bumpSelectordmp_LightEnv.clampHighlightsdmp_LightEnv.configdmp_LightEnv.fresnelSelector FSUNIFORM
0x01C4 8.8.5.3 dmp_FragmentLightSource[i].distanceAttenuationEnabled(i=0~7)、dmp_FragmentLightSource[i].shadoweddmp_FragmentLightSource[i].spotEnabled FSUNIFORM
8.8.5.9 dmp_LightEnv.fresnelSelectordmp_LightEnv.lutEnabledD0dmp_LightEnv.lutEnabledD1dmp_LightEnv.lutEnabledRefl FSUNIFORM
0x01C5 8.8.5.4

dmp_FragmentMaterial.sampler {D0,D1,FR,RB,RG,RR}

dmp_FragmentLightSource[i].sampler{SP,DA}

LUT
0x01C6 8.8.5.1 dmp_FragmentLighting.enabled FSUNIFORM
0x01C8~0x01CF 8.8.5.4 参照テーブルへのデータ設定 LUT
0x01D0 8.8.5.5 dmp_LightEnv.absLutInputD0dmp_LightEnv.absLutInputD1dmp_LightEnv.absLutInputSPdmp_LightEnv.absLutInputFRdmp_LightEnv.absLutInputRBdmp_LightEnv.absLutInputRGdmp_LightEnv.absLutInputRR FSUNIFORM
0x01D1 8.8.5.6 dmp_LightEnv.lutInputD0dmp_LightEnv.lutInputD1dmp_LightEnv.lutInputSPdmp_LightEnv.lutInputFRdmp_LightEnv.lutInputRBdmp_LightEnv.lutInputRGdmp_LightEnv.lutInputRR FSUNIFORM
0x01D2 8.8.5.7 dmp_LightEnv.lutScaleD0dmp_LightEnv.lutScaleD1dmp_LightEnv.lutScaleSPdmp_LightEnv.lutScaleFRdmp_LightEnv.lutScaleRBdmp_LightEnv.lutScaleRGdmp_LightEnv.lutScaleRR FSUNIFORM
0x01D9 8.8.5.1 dmp_FragmentLightSource[i].enabledi=0~7) FSUNIFORM

8.10.3. レジスタ 0x0200 ~ 0x02FF のレジスタマップ

表 8-73. レジスタマップ(アドレス 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

コマンドバッファの実行

nngxAddJumpCommand()nngxAddSubroutineCommand()

-
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 glDrawElements()glDrawArrays() -
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 パターンのロード