Archives

14 July 2007 の記事

先日のファームアップデートは安定度の向上が中心で、特にこれが変わった!
という目だったものも無いし問題も無いので、なかなか新しくなったという
実感がわきません。
EM・ONE 新ファームウエア v1.01
アップデータを起動したあとに「しまった」と思ったのは、
ついうっかり RealVGA(WVGA) 化したまま実行してしまったこと。
だけどアップデート作業も順調で、更新も何のトラブルもなく終わりました。
至って順調なので、ReavlVGA 化は気にしなくても良かったみたいです。

アップデート後、確かにワンセグの安定度が増したように感じます。


以前(v1.00時)はワンセグの電波状況も良くて放送が入るのに、
音声だけ時たま途切れがちになることがありました。
何らかの負荷が高くなって一瞬処理落ちしているような感じです。

同一の条件でも、携帯 V905SH の方ではスムーズで途切れることもなく
ワンセグの視聴ができました。


ファームウエアを v1.01a に更新した後は EM・ONE でも音声が安定して
途切れることがなく、大画面で放送を楽しむことができるようになりました。
EM・ONE は画面が大きく液晶も明るいので、机の上に置いても見やすいですね。

画質については、デジタル放送といいつつ結構機種によって違いがあるようです。

SHARP V905SH ワンセグ
 比較的シャープで、文字なども輪郭がくっきりしてきれいです。
 色は EM・ONE とくらべて浅目の落ち着いた感じです。

SHARP EM・ONE ワンセグ
 液晶のドット比率のせいもあるかもしれませんが、強いアンチエリアスが
 かかったような感じ。文字は V905SH に比べると細部がぼやけて見えます。
 色は強く、コントラストが高い濃い画面です。

ちなみに一番きれいなのは、外部アンテナを繋いで条件が良いときの
V905SH のアナログ放送です。ノイズは多少乗るけど滑らかです。
ただ外部アンテナが無く条件が悪いときはノイズだらけで全く見えません。

悪条件の下、単体でもきちんと絵が出て十分な視聴レベルであるワンセグは
やっぱりすごいのですね。


相変わらず Effect 管理と Reflection まわりを触っています。
ID3D10Effect から ID3D10ShaderReflection を取り出すには、
D3D10/DX10 Effect Interface内情報
に書いた手順の通りです。
取り出した Reflection を使って、描画のために Shader の Setup を
行うためには BindingDesc を調べる必要があります。


ID3D10ShaderReflection* iReflection; // input
D3D10_SHADER_DESC shdesc;
iReflection->GetDesc( &shdesc );
for( DWORD i= 0 ; i< shdesc.BoundResources ; i++ ){
 D3D10_SHADER_INPUT_BIND_DESC binddesc;
 iReflection->GetResourceBindingDesc( i, &binddesc );
  // :
}

これで binddesc.Name に対応する HLSL の変数名が、
bdesc.Type に Resource の種類が、
bdesc.BindPoint に Resource を割り付けるスロット番号が入ります。

bdesc.Type は D3D10_SHADER_INPUT_TYPE で定義されています。

--------------------------------------------------------
enum D3D10_SHADER_INPUT_TYPE
{
D3D10_SIT_CBUFFER,
D3D10_SIT_TBUFFER,
D3D10_SIT_TEXTURE,
D3D10_SIT_SAMPLER,
};
--------------------------------------------------------

上記の通り 4種類に分類されていることがわかります。

CBUFFER, SAMPLER は特に問題ありません。それぞれ
GSSetConstantBuffers(), GSSetSamplers() (VS~, PS~) 等の
API でシェーダーに割り当てるので、独自に BindPoint (Slot番号) が
割り当てられます。

TBUFFER と TEXTURE はどちらも Texture なので、シェーダーに
割り当てるための API は GSSetShaderResources() (VS~, PS~)
しかありません。
というのは、どちらも ID3D10ShaderResourceView で扱いは一緒なのです。
そのため Type は別でも BindPoint は両方合わせてカウントされます。

では TBUFFER と TEXTURE の違いは何かというと、
D3D10_SHADER_INPUT_BIND_DESC の ReturnType や Dimension が違います。
結局は Buffer と Texture の違いであって、Sampler を使えるかどうかの
違いといえるかもしれません。

なお ID3D10Effect 等は全部やってくれていますが、BindPoint は
GS, PS, VS それぞれ参照状況に応じて異なっている可能性があり、
さらに Effect 内に複数の Pass や Technique が存在する場合はその数だけ
区別しておく必要があります。
セットアップも必要に応じて GS, PS, VS 全部に対して実行しなければならず、
自前でやろうとすると思ったよりも手間がかかります。
やっぱり完全に ID3D10Effect 任せにした方が簡単ではあります。