CG関連

【GLSL(シェーダー)】『レイマーチング』入門その1 距離関数とレイとカメラの設定

かっこいい『3Dプログラミング』をつくりたいと
ググって見つけた『レイマーチング(Ray Marching)』という手法。

参考記事

いろいろググるとなかなか難しいようなので、

まずは先輩方のソースコードを真似てみることからやってみることにしました。

早速Youtubeでぴったりな動画を発見。

アオキ
ありがたやありがたや。

りやちゃんというVtuber?女性キャラクターなのに、
コード書いている人は思いっきり男性という謎な世界観を完全スルーし、

ただひたすらに『レイマーチング(Ray Marching)』のコードの書き方を真似てみました。

Sponsored link

『レイマーチング』入門〜まずは2D設定

動画冒頭から、2Dのコードが記載されていて、
別の動画で解説されてはいるものの、
ハズキルーペよろしく、

アオキ
コードの文字サイズが小さすぎて読めないっ!

っとなってしまったので、とりあえずコピペしてスタートすることにしました。

2D初期のコードはこちら。

このコードをGLSLオンラインエディタにコピペすればOKです。

GLSL Sandbox

『レイマーチング』入門〜距離関数

『レイマーチング(Ray Marching)』は、
各オブジェクトまでの距離を測って描画するという仕組みで、
図形ごとに『距離関数』なるものが決まっています。

球の場合はこれ。

アオキ
なぜにこれで球が表示できるの?

っと思ってしまいますが、
きっと証明するには時間がかかりそうなので、

走りながら考えるスタイルで、今回はスルーする事にします。

他にもたくさんの距離関数があって、組み合わせることもできます。(こちらも別記事で書く予定です)

距離関数のサイト

Sponsored link

『レイマーチング』入門〜始点の位置 (カメラの位置)

つぎに『カメラ』の位置と向き。

2次元の時は全く意識しないのですが、

3次元の場合、奥行きが存在するので、

『カメラ』の位置も考える必要がでてきます。

  • 手前で撮るか
  • 奥から撮るか
  • 斜め上から撮るか
  • 右側から撮るかなど

現実世界と同じように、カメラの位置を自由に変えることができます。

今回の動画で紹介されていたコードはこちら。

vec3というのは文字通り、3次元ベクトルです。

3次元なのでX軸、Y軸、Z軸の3つの値を持ちます。

アオキ
ベクトルは、矢印というよりただの数字の組み合わせと思った方が使いやすいと思います。

参考記事

カメラの横向きベクトルは、
上向きベクトルと前向きベクトルの『外積(がいせき)』で求まるそうで、

アオキ
『外積』・・ってなんだったっけ・・

と思いつつも、走りながら後でリサーチする事にします。

『レイマーチング』入門〜レイの定義 構造体

続いて、光源という意味の『レイ(Ray)』の設定。

コードはこちら。

structなので『構造体』でつくっています。

構造体は、名前は難しそうですが、要は変数の組み合わせです。

今回は 『レイの位置』『レイの向き』をそれぞれ『3次元ベクトル』で定義しています。

要は、
『レイの位置』と『レイの向き』それぞれ、

X, Y, Z の3つの値を持つという事になります。

Sponsored link

『レイマーチング』入門〜レイの設定

先ほど作成した『レイ』の構造体を実体化しつつ、

『レイの位置』と『レイの向き』の値を設定します。

X・・レイのX軸 × カメラの横向き
Y・・レイのY軸 × カメラの上向き
Z・・カメラの前向き

としているようです。

アオキ
なぜにX、Y、Zとも足し算するんだろう(内積(ないせき?)

と思いつつ、とりあえず次へ。

『レイマーチング』入門〜レイの衝突判定

『レイマーチング(Ray Marching)』は、
『距離関数』で『オブジェクト(物体)』までの距離を測定しながら前に進み、
『オブジェクト(物体)』との距離がほぼゼロになったら描画するという仕組みになっています。

コードはこちら。

まず t (時間)をゼロにして、
『距離関数』でオブジェクト(物体)との『距離』を求めて、

『距離』が限りなくゼロに近づいたら衝突したという判定にして、

そうでなければ『レイ』を前に進めています。

アオキ
こちらもまずはこんなもんかで先に進みます。
Sponsored link

『レイマーチング』入門〜レイが物体に衝突したら

最後に、『レイ』が当たったら、白に色を変えます。

gl_FragColorは色つけの組み込み関数です。

vec4として、RGBA 4つの値を持つことができます。

RGBAだと普通 0〜255の範囲になりますが、

GLSLは0 〜 1 の範囲設定になるので、

『正規化』などの手順が必要になります。

アオキ
『正規化』の解説もいずれ・・

今回のコードをまとめるとこうなります。

GLSL Sandboxに貼り付けて、白い円が表示されたらOKです。

GLSL Sandbox

アオキ
こんな感じで表示されたらOK。

『レイマーチング』入門 その1 まとめ

『レイマーチング(Ray Marching)』の手法自体が独特なこともあり、

まだまだ細かいところまで調べきれていないのですが、

アオキ
とりあえず動けばOK、後で調べる=3

のスタンスで、ガリガリ書いていこうかなと思います。

created by Rinker
¥2,160 (2019/09/22 11:44:07時点 Amazon調べ-詳細)

『GLSL(シェーディング)』関係ではこんな記事も読まれています。

1. 【GLSL】プログラムでかっこいい映像をつくりたい! 〜『TouchDesigner』を見据えて

2. 【WebGL】入門 わかりやすく【図解】してみた

3. 【OpenGL】と【DirectX】のバージョンをまとめてみた【シェーダーメイン】【初心者向け】

4. 【GLSL(シェーディング)】でよく使う関数とユーザー関数のまとめ※随時更新

5. 【GLSL】プログラムでかっこいい映像をつくるには『レイマーチング』なるものを覚えればいいらしい

6. 【GLSL】『レイマーチング』入門その1 距離関数とレイとカメラの設定

7. 【GLSL】『レイマーチング』入門(2) 立体的に見せる方法〜光の反射は『内積』で〜

8. 【GLSL】『レイマーチング』入門(3) 距離関数を使ってみる・回転・合成・量産

9. 【TouchDesigner】で『GLSL』を使う方法まとめ【画像あり】

10. 【TouchDesigner】『GLSL MAT』の使い方 3次元でぐりぐり動かしてみる

11. 【GLSL】波のつくり方簡易まとめ。波もプログラムでつくれます【コピペスタイル】

 

アオキ
ツイッターでも記事ネタ含めちょろちょろ書いていくので、よろしければぜひフォローお願いしますm(_ _ )m

アオキのツイッターアカウント


関連記事一覧 (一部広告あり)

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

CAPTCHA


最近の記事

  1. CG関連

    【P5.js】遊ぶようにプログラムできるクリエイティブコーディング〜はじめのいっ…
  2. 音楽

    コードの転回形の練習方法をまとめてみた【大人のピアノ】
  3. 数学

    【三角関数】とは わかりやすくまとめてみた【動画あり】
  4. IoT関連

    【Arduino】ラジコンをつくってみた 〜今ドキのプログラムの覚え方
  5. バックエンド

    【Python】手軽に試す方法2つとwebフレームワークについて【初心者向け】
PAGE TOP