GLSL/WebGL

【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/07/17 11:39:36時点 Amazon調べ-詳細)

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

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

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

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

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

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

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

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

 

コメント

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

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

CAPTCHA


関連記事

  1. GLSL/WebGL

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

    プログラミングでかっこいい映像をつくる方法の一つに、『レイマーチン…

  2. GLSL/WebGL

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

    手や身体の動きに合わせて映像が変わっていく『インタラクティブ』な映像を…

  3. GLSL/WebGL

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

    最近いろんなところで目にする『プロジェクションマッピング』や『インタラ…

  4. GLSL/WebGL

    【TouchDesigner】で『GLSL』を使う方法を動画で学んでみる その1と2

    前回の記事で『TouchDesigner』と『GLSL』を連携させる方…

  5. GLSL/WebGL

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

    『プログラミング』を使ってかっこよく、インタラクティブな映像をつくり…

  6. GLSL/WebGL

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

    プログラミングでかっこいい映像をつくりたいと始めた『GLSL』。関…

Sponsored link

最近の記事

  1. HTML/CSS

    【厳選8冊】ホームページを作れるようになるためのおすすめ本【初心者向け】
  2. Laravel

    【Laravel(PHP)】初心者向け アプリのつくり方 をリリースしました【t…
  3. 数学

    【微分】わかりやすくプログラミング目線で整理してみる【初心者向け】
  4. P5.js (Processing)

    【P5.js】遊ぶようにプログラミングできるクリエイティブコーディング〜はじめの…
  5. Laravel

    【Laravel(PHP)】でできる事をわかりやすく(ざっくりと)まとめてみた【…
PAGE TOP