1. 背景
前回、筆者は以下の記事で DaVinci Color Transform Language (DCTL) を試し、得られた知見を記事にまとめた。
その中で筆者は「コンソール出力が無いので printf デバッグすらできない」という旨を書いた。
すると、記事を読んでくださった有識者の方から、少々トリッキーではあるが、printfデバッグの方法を教わることができた。 また非常にありがたいことに、その方からは DCTL のサンプルコードも頂いた(本当にありがとうございます🙏)。
ただ、サンプルコードの内容は難解であり、筆者は処理内容を理解することができなかった。 そこで、自己の理解を深めるためにスクラッチから printf デバッグ用の DCTL ファイルを作成することに決めた。
2. 目的
printf デバッグ用の DCTL ファイルを作成する。
3. 結論
指定した座標の RGB値を画面表示する DCTL ファイルの作成に成功した (本記事ではこの画面表示が printf デバッグを意味する)。 その様子を 図1 および 動画 1 に示す。
4. やり方
やり方はシンプルである。 図1 を見れば分かるようにデバッグ情報(数値)を画面に描画することで実現している。
どのようにして図1 の描画に至ったのか、順を追って説明する。
4.1. DCTL を使った図形の描画
DCTL では画面出力の RGB データに直接アクセスできるため、任意の図形をプロットすることが可能である。 例えば以下のコードを書くと、画面左上に黄色の矩形を描画できる。
__DEVICE__ float3 transform(int p_Width, int p_Height, int p_X, int p_Y, float p_R, float p_G, float p_B) { float3 out = make_float3(p_R, p_G, p_B); float3 rectangle_color = make_float3(1.0, 1.0, 0.0); float2 st_pos = make_float2(200, 100); float2 ed_pos = make_float2(1200, 300); if((st_pos.x <= p_X) && (p_X < ed_pos.x)){ if((st_pos.y <= p_Y) && (p_Y < ed_pos.y)){ out.x = rectangle_color.x; out.y = rectangle_color.y; out.z = rectangle_color.z; } } return out; }
4.2. 矩形を組み合わせた数値の描画
矩形が書けてしまえば、矩形の組み合わせで任意の数字の描画が可能である。 筆者は下図のように A~H の 8個の矩形を用いて数値と小数点を描画することにした。
4.3. 表示用の数値の取得および描画
DCTL では _tex2D
関数を使う事で任意の座標の RGB 値を float型で取得できる。
取得値は float 型であるため、本来であれば 1.2345E-5
のような指数表記で描画するのが好ましかったのだが、
実装が面倒だったので、今回は固定小数点ライクな表示仕様とした。
その結果、正の数は6桁、負の数は5桁での表示となった。表示の様子を図4 に示す
表現可能な数値の範囲は以下の通りである (0を除く)。
- 正の数: 0.00001 ~ 999999
- 負の数: -0.0001 ~ -99999
5. ソースコード
一応、以下に置いときます。例によってコメントを全然書いて無いですが…。
printf デバッグに必要なのは 私のリポジトリ にある以下の2ファイルです。
6. 感想
この DCTLコードの実装は想像よりずっと楽しかった。満足したので元の作業に戻る。