質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
GLSL

GLSL (OpenGL Shading Language) はC言語をベースとしたシェーディング言語です。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

解決済

1回答

2691閲覧

Processing + GLSLでボロノイを実装したい

nodudon

総合スコア21

GLSL

GLSL (OpenGL Shading Language) はC言語をベースとしたシェーディング言語です。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

0グッド

0クリップ

投稿2019/05/09 04:29

Processingと頂点シェーダー、フラグメントシェーダーを用いて、
Processing側で読み込んだ画像の明度情報に沿って、輪郭線をとるようなボロノイを実装したいと思っております。

Processing単体で完結するようなプログラムのヒントとなるような作例は、検索するといくつか出てくるのですが、
(http://beautifl.net/?id=764 など)
シェーダーを用いたものになると、フラグメントシェーダー単体で書いたものしか見つけることができませんでした。
今回シェーダーを用いたいと思っているのは、Processing単体で完結させるよりも処理が速くなるのでは、と考えたためです。

実装する際の流れとしては、Processingで画像の読み込みと、画像の明度情報からボロノイの元となる点を抽出し、シェーダーに渡してボロノイを描画という流れを想定しているのですが、そもそもこの流れで描画することは可能なのでしょうか?
また、この場合、頂点シェーダーへ頂点情報を送り、そこからフラグメントシェーダーに情報を送ることになるのでしょうか。

シェーダーを勉強し始めたばかりで、特に、頂点シェーダーをどう使うのかいまいちわかっておりません。
Processingの公式リファレンスのshaderページや、the book of shader等を参照して勉強しております。
的外れな質問となっていたら恐縮なのですが、お力添えいただければ幸いです。
また、参考となる資料も添えていただけると大変助かります。
どうぞよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

https://qiita.com/mizumasa/items/887c4e85c688a2b0d5f1

このページをみながらこんな簡単にできるものなのかな・・・と思いつつやってみたのですが、あっけないほどあっさり動きました。

上のページにはほとんど何も説明がなく簡単なサンプルのみが載ってますがそれを見ると

(1) GLSLでシェーダーを記述しておき、それをスケッチの下のdataフォルダーに入れておく
(2) Processing側でloadShaderとするとシェーダーインスタンスができる。
(3) GLSLシェーダーの入力パラメータはuniformで宣言しておき(GLSL言語の仕様)
(4) Processing側からシェーダーインスタンスのsetメソッドでGLSL側のuniform変数へ値を渡す
(5) Processing側でshader(シェーダーインスタンス)とやれば1フレーム分が描画される

シンプルです...

自分はGLSL言語をほぼ知らないので

・vec2同士の距離を求めるには?
・頂点の座標を表すuniform変数をvec2配列にしたとして、Processingでどう渡す?
・繰り返し文はC言語と同じでいいのかな

といった不明点をProcessingのリファレンスとgoogleを頼りに調べ、以下のようなものを書いてみました。なんとなくボロノイっぽいものが描けてるような気がします。

残念ながら任意の長さのvec2配列を渡すという方法がわからず配列長を固定にしてます。

processing

1PShader sd; 2float[] pts; 3 4void setup() { 5 size(600, 600, P2D); 6 sd = loadShader("FragmentShader.glsl"); 7 // 適当に定義した頂点座標 8 pts = new float[] { 9 10, 30, 10 50, 10, 11 100, 50, 12 50, 150 13 }; 14} 15 16void draw() { 17 // sd.set("time", millis() / 1E3); 18 // sd.set("resolution", width, height); 19 sd.set("pts", pts, 2); 20 shader(sd); 21 rect(0, 0, width, height); 22}

data/FragmentShader.glsl

glsl

1// uniform vec2 resolution; // 今回は不要 2// uniform float time; // 今回は不要 3uniform vec2 pts[4]; // ボロノイ図を描くための頂点座標(配列長は固定) 4 5void main() { 6 int n = pts.length(); 7 int min_idx = -1; 8 float min_dist = 0.; 9 for (int i = 0; i < n; i++) { 10 float dist = distance(gl_FragCoord.xy, pts[i]); 11 if (i == 0 || dist < min_dist) { 12 min_dist = dist; 13 min_idx = i; 14 } 15 } 16 float h = float(min_idx) / n; 17 float s = 1.; 18 float v = 1.; 19 vec3 rgb = ((clamp(abs(fract(h + vec3(0, 2, 1) / 3.) * 6. - 3.) - 1., 0., 1.) -1.) * s + 1.) * v; 20 gl_FragColor = vec4(rgb.r, rgb.g, rgb.b, 1.); 21}

(上の実装はテキトーなので参考程度にご覧ください)

Windows 10 64bit
Processing (64bit) 3.5.3
GPU NVIDIA GeForce

投稿2019/05/09 06:03

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nodudon

2019/05/09 12:01

ご回答ありがとうございます。てっきり頂点シェーダーが必要と思っていたのですが、直接フラグメントシェーダーに送れるのですね。どうやら難しく考えすぎていたようです。 いただいたご回答をもとに、勉強してみます。ありがとうございました。
KSwordOfHaste

2019/05/09 13:13 編集

回答に書いたような「3Dモデルを用いず2D的な抽象模様を描く」分にはFragmentShaderのみで充分でしょうが、ProcessingにあるVertexShader的機能(多分それはOpenGL/GLSLを用いて実装されている気がします)を超えたものを作ろうとするならVertexShaderを使うこともできるようです。 PShaderやloadShaderのリファレンスをみるとFragmentShaderのみでもFragmentShader + VertexShaderの両方使うこともできるように見えますので。
nodudon

2019/05/10 03:28

補足ありがとうございます。 ご回答の中にいただいたコードについて1点質問があるのですが、 processing側からshaderへptsという名前の配列を渡していますが、「sd.set("pts", pts, 2);」で第二引数として2を渡しているのはどういう意図でしょうか?
KSwordOfHaste

2019/05/10 03:42

setのリファレンスを見てそういう使い方をすると解釈したためです。 vec2はfloat要素2つからなる構造で、それを4つ並べた配列として表現する際にこういう書き方ができるのかなと解釈しました。本当ならProcessingにvec2相当のクラスがあって、 pts = new Vec2[] { new Vec2(10, 20), new Vec2(30, 40), ... } のように書けたら自然と思いますがGLSLのvec2に相当するProcessing側のクラスがあるのかないのかはっきりわかりませんでした。
nodudon

2019/05/10 03:59

processingのリファレンスに記載がありましたね。大変失礼しました。 重ね重ね、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問