HandyGraphic で本格的なシェーディングがしたい…!
自分のピクセルシェーダーをC++に移植してデバッグしたい…!
HGShaderはそんなニッチで意味不明な需要を満たすプログラムです
毎フレーム画面上に大量の四角い図形を並べています
初期状態の50x50ピクセルで2500個のHgBoxFillが表示されます
FPS数(FramePerSecond)を稼ぐためにいくつかの軽量化も行っています
HGShader.mp4
サンプルをコンパイル後、HandyGraphicを起動させた状態で、実行ファイル(build/app
)を実行します
Makefileを導入した状態でmake
を実行します
なお、スマホ接続時のJson解析にRapidJsonを使用しているので、その導入が必要です
基本の操作
- 上下の方向キー : 解像度を上げ下げする
- 左右の方向キー : 別のシェーダーに切り替える
- スペースキー : 情報の表示/非表示を切り替える
その他の操作
- カンマキー( , ) : 再生速度を上げる
- ドットキー( . ) : 再生速度を下げる
- r キー : 時間をリセットする
- f キー : FPS数制限を設定/解除する
- q キー : HandyGraphicを終了する
0.mp4
ZIGSIM(無料版でも可)を使用し、スマホと接続することができます
接続すると、センサー情報を使用してシェーダーを動かすことができるようになります
サンプルではPhoneShader
のみ対応しています
このシェーダーではスマホの回転情報を受け取り、オブジェクトを回転させます
- FPS : FPS数
- FPSLimit : FPS数制限を設定しているかどうか
- Time : 起動してからの経過時間
- ShaderSpeed : シェーダーの再生速度
- SleepTime : 余計なフレームを生成しないためにThreadを止めた時間
- DeltaTime : 1フレーム生成するのにかかった時間
- Window : 現在のWindowSize
- PixCount : 現在表示されているピクセルの数
- InputKeys : 入力のビットフラグ
- グラフ :
UP : シェーダーの計算時間
RT : ピクセルのレンダリング時間
DT : DeltaTime
ST : SleepTime
(目盛りは10ms)
Main.cpp
内のShaderDisplayerの引数にシェーダーを登録すると表示されるようになります
登録できるピクセルシェーダーは、
引数にUV座標と経過時間を取り、返り値でそのピクセルの色を返すvec3(*)(vec3, float)
型の関数のみです
なお、シェーダーはGLSLと似た形式で書くことができます
少しでも処理を軽くするために、色を更新する領域が多いシェーダーは避けてください
前フレームのピクセルと同じ色であれば、HGShaderはそのピクセルの描画をスキップし、レンダリングを早めます
また、Library/Defines.hpp
の COLOR_CONT
を下げ、表示する色数を減らす検討もしてください
低解像度であれば、ほとんどのシェーダーは安定して動作します
様々な環境で動作させるために、低解像度でも楽しめるシェーダーを書くことが重要です
C++では小数点を含む数字はdoubleに解釈されるのでtemplate関数でエラーが発生します
数字の後の f を癖付けてください
GLSLのatan関数は、math.hのatan関数(挙動が異なる)と名前が被っているのでatan2関数として実装しています
また、GLSLのnot関数は、C++のnotキーワードと名前が被っているので_not関数として実装しています
CODEMANUAL をご覧ください
HGKNOWLEDGE をご覧ください
半年前の3Dの図形描画より滑らかになって楽しかった
この形式で初期のウィザードリィとかDoomとか移植できそう
けどもう絶対にやらない
後輩の方に任せます
疑似乱数に関して
W.J.J. Rey, 22nd European Meeting of Statisticians and the 7th Vilnius Conference on Probability Theory and Mathematical Statistics, August 1998
グラデーションノイズに関して
Inigo Quilez - iq/2013
https://www.shadertoy.com/view/XdXGW8
MIT License
何か変更したい点などあればご連絡ください