SDF Editorのソースコードが公開された!
プロトタイプとして公開されたSDF Editorの出力をPythonでGLSLにコンバートするコードを書いていたら、
なんと、5月30日にSDF Editorのソースコードが公開された。
https://joetech.itch.io/sdf-editor
これによって、外部のPythonプログラムを使うことなく、直接GLSLコードを出力するようにソースコードを修正すればいいと考え、作業を開始したら一日ほどで動作するようになった。
これで、SDF Editorでモデリングし、プロジェクトをセーブしたら、<ファイル名>.fragを出力し、
それをVisualStudio Codeで読み込んだら、すぐに表示できるようになり、また、
htmlとしてセーブするとそのまま、WEBに置けば3DCGを表示できる。
SDF Editorでデザインし出力したコードをShadertoy.comで公開->https://www.shadertoy.com/view/Nts3W2
SDF EditorのソースコードはGODOT Engine
SDF EditorのソースコードはGODOT Engineで書かれている。その本質はC++だが、Pythonライクなコーディング
ができる。(ただし、Pyhtonとフルコンパチではない。)Pythonライクなので、今までPythonで書いたコンバータ
がほぼそのまま使えて楽だろうと思ったら、件のPythonのコードはほとんど使わずに書けたので拍子抜けした。
今回は、改変したソースコードはデバッグ中なのでそのすべてを示さないが、いくつかポイントを紹介するので
誰でも独自にソースコードを変更することができるだろう。
大まかな方針は以下の通りである。
step1 SDFモデルや、tranformやrotateなどのmodifireの変数値をShadertoyのコードに取り込む
step2 SDF関数をShadertoyのコードに取り込む
SDF EditorのソースコードのプロジェクトをGODOTに読み込み、
シーン -> Saveのスクリプトをを表示し、以下のようにjson_saver.save(path)の下に
emit_signal("my_signal",path)を追加する。
func _on_file_selected(path):
json_saver.save(path)
emit_signal("my_signal",path)
次に、右端ペインのノードタブをタップし、my_signa()をマウス右ボタンクリックで、接続を選択し、
Scene -> Addに接続する。
sdf関数のための変数とコードを取得する
また、SceneAdd.gdの先頭を次の二行をつけ加える。
var compiler = preload("res://SDF Scripts/Compilers/ShaderCompiler.gd").new()
var uniforms = []
変数の具体的数値を得る
ここで、func _on_Save_my_signal(path): で、
var result = compiler.compile()
var shdercode = result[0]
uniforms = result[1]
# sdf関数を書き込む
var stemp = shdercode
とすると、stempにuniformの変数名と、sdf関数の本体を文字列として取り込むことができる。
たとえば、球を一つ追加すると stempは下記のような内容になる。
uniform float SpRa_1;
float sdf(vec3 p0)
{
float d1;
d1 = pSphere(SpRa_1, p0);
return d1;
}
ここで、SpRa_1を具体的数値に置き換え(球の半径)、このコードをShadertoyのテンプレートに読み込むと、
そのコードはShadertoyに投稿しても、VisiualStuido Code上からでも結果を表示できる。
変数の具体的数値は、以下のように取得できる。
var sdffnc = ''
var j = 0
for u in uniforms:
var value
if u[0].has_method(u[1]):
value = u[0].call(u[1])
else:
value = u[0].get(u[1])
#
var temp = lines[j].replace('uniform ','')
このようにして取得した数値を変数名のところに置き換え、たとえば、
球を一個追加する例では、
float SpRa_1 =1.0と書き換える。
float sdf(vec3 p0)
{
float d1;
d1 = pSphere(SpRa_1, p0);
return d1;
}
この方針で、すべての変数を具体的数値に変更し、Shadertoyのテンプレートコードに挿入して
セーブすると、そのコードが実行し、表示できる。
