1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SDF Editorのソースコードが公開されたので、レイマーチングがより身近になった!

1
Last updated at Posted at 2021-06-09

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を表示できる。

スクリーンショット 2021-06-05 203205.jpg

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のテンプレートコードに挿入して
セーブすると、そのコードが実行し、表示できる。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?