あまり実用性が無いサンプルですが、Shader で HELLO WORLD を
作ってみました。
ポイントは直接 Buffer に strcpy で文字列を書き込んでいるところ。
つまり Shader で文字列をそのまま表示しています。
描画文字列の書き込み
const char* Message= "HELLO WORLD!"; g_iStringBuffer->Map( D3D10_MAP_WRITE_DISCARD, 0, &ptr ); strcpy( ptr, Message ); // ←ここ g_iStringBuffer->Unmap();
描画文字列の表示も、Draw() に strlen() した文字列長をそのまま
渡しているだけです。
g_iDevice->Draw( strlen( Message ), 0 ); // ←ここ
StringBuffer は Shader の IA に渡しています。つまり Vertex 相当です。
1文字が 1頂点で、書き込まれているのはアスキーコードのみ。
stride size (1頂点のサイズ) はわずか 1byte です。
UINT vSize= sizeof(char); // ←ここ UINT vOffset= 0; g_iDevice->IASetVertexBuffers( 0, 1, &g_iStringBuffer, &vSize, &vOffset )
InputLayout も DXGI_FORMAT_R8_UINT の1つだけ。
static const D3D10_INPUT_ELEMENT_DESC _inputDesc[]= { { "CODE", 0, DXGI_FORMAT_R8_UINT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0, }, };
もちろん Message は任意の文字列にできます。
が、付属の適当フォントがだめだめなので小文字とか はみ出します。
もう少し実用的にするなら D3D10_MAP_WRITE_DISCARD でなく
D3D10_MAP_WRITE_NO_OVERWRITE にして、バッファ管理
してあげる必要があるでしょう。
あとシェーダーでごまかしていますが、ステート周りなども未設定です。
(終了も手抜き)
詳しくは下記ソースをご覧ください。
・wheelhandle_ss02t.zip
D3D10/DX10 の ジオメトリシェーダーに頼りまくってます。