「リアルタイムグラフィックスの数学」勉強ログ - 第3章値ノイズ

「リアルタイムグラフィックスの数学」勉強ログ - 第3章値ノイズ

目次

はじめに#

「リアルタイムグラフィックスの数学」の第 3 章の値ノイズについての勉強ログです。

値ノイズの構成法#

まずは 2 次元の値ノイズの構成法について見てみましょう。

平面上の正方形の4つの頂点(格子点)
平面上の正方形の4つの頂点(格子点)

平面上の正方形の 4 つの頂点(格子点)を用いて、値ノイズを構成します。各格子点での乱数値、または乱数ベクトルを使って生成されるノイズを格子ノイズと呼びます。格子点の成分は整数になるようにします。点(x,y)(x, y)に対して床値[][]を使って、(x,y)(x, y)を取り囲むマスの格子点は次の 4 つのベクトルで表します。

e00=([x],[y]), e10=([x]+1,[y])e_{00} = ([x], [y]), e_{10} = ([x] + 1, [y]) e01=([x],[y]+1), e11=([x]+1,[y]+1)e_{01} = ([x], [y] + 1), e_{11} = ([x] + 1, [y] + 1)

この格子点のハッシュ値を取得して、第 1 章でみた双線形補間を使用して(x,y)(x, y)での値をつくります。このようにしてつくられたノイズ関数を値ノイズと呼びます。

2 次元の値ノイズの関数は次のようになります。

2次元の値ノイズ
float vnoise21(vec2 p){
  vec2 n = floor(p);
  float[4] v;
  for (int j = 0; j < 2; j ++){
    for (int i = 0; i < 2; i++){
      v[i+2*j] = hash21(n + vec2(i, j));
    }
  }
  vec2 f = fract(p);
  return mix(mix(v[0], v[1], f[0]), mix(v[2], v[3], f[0]), f[1]);
}

for文で回している箇所は複雑なので、マスの 4 頂点のハッシュ値のv[]をそれぞれ見てみましょう。

vec2 n = floor(p);
 
v[0] = hash21(n);
v[1] = hash21(n + vec2(1.0, 0.0));
v[2] = hash21(n + vec2(0.0, 1.0));
v[3] = hash21(n + vec2(1.0, 1.0));

先ほどの 4 つのベクトルと同様になっているのが確認できるかと思います。この格子点のハッシュ値を双線形補間して返してます。

return mix(mix(v[0], v[1], f[0]), mix(v[2], v[3], f[0]), f[1]);

サンプルコードでは双線形補間とエルミート補間を比較しています。エルミート補間はsmoothstep(0, 1, x)と同じ関数であり、コードで表すと次のようになります。

エルミート補間
f = f * f * (3.0 - 2.0 * f);

比較してみると、エルミート補間の方がグラデーションが滑らかであることが分かるかと思います。

双線形補間とエルミート補間の比較
双線形補間とエルミート補間の比較

値ノイズを RGB カラーで色付け#

問題 3.1 の値ノイズを RGB カラーで色付けしてみましょう。先ほど作成したvnoise21関数の引数に RGB の値を渡せるようにし、ハッシュ関数の中に加えます。

float vnoise21(vec2 p, float l) {
  // ...
  for (int j = 0; j < 2; j++) {
    for (int i = 0; i < 2; i++) {
      v[i + 2 * j] = hash21(n + l + vec2(i, j));
    }
  }
}

新たに 3 次ベクトルを返すvnoise23関数を作成し、RGB を適当な値でvnoise21の引数に入れてみましょう。

vec3 vnoise23(vec2 p) {
  return vec3(vnoise21(p, 14.0), vnoise21(p, 34.0), vnoise21(p, 64.0));
}

このvnoise23関数を main 関数で使用すれば、値ノイズを RGB カラーで色付けすることができます。下図では、2 変数と 3 変数の値ノイズをエルミート補間した例になります。

値ノイズを RGB カラーで色付け
値ノイズを RGB カラーで色付け

グラデーションの滑らかさと微分#

先ほど見たように双線形補間よりもエルミート補間の方が滑らかです。この節では微分を用いてなぜエルミート補間の方が滑らかであるかを確認します。

例として、3 つの数値 0.3,0.9,0.6 が与えられたときに、[−1,1][-1, 1]区画上で線形補間する関数l(x)l(x)とエルミート補間する関数h(x)h(x)を比較します。c(x)=x2(3−2x)c(x) = x^2(3 - 2x)とすれば次のようになります。長くなるのでh(x)h(x)は途中式を省略しています。

l(x)={mix(0.3,0.9,x+1)=−0.3x+0.9(x+1)=0.9+0.6x(−1≤x≤0)mix(0.9,0.6,x)=0.9(1−x)+0.6x=0.9−0.3x(0≤x≤1)l(x) = \begin{cases} \mathrm{mix}(0.3, 0.9, x + 1) = -0.3x + 0.9(x + 1) = 0.9 + 0.6x & (-1 \le x \le 0)\\ \mathrm{mix}(0.9, 0.6, x) = 0.9(1 - x) + 0.6x = 0.9 - 0.3x & (0 \le x \le 1) \end{cases} h(x)={mix(0.3,0.9,c(x+1))=0.9−1.8x2−1.2x3(−1≤x≤0)mix(0.9,0.6,c(x))=0.9−0.9x2+0.63(0≤x≤1)h(x) = \begin{cases} \mathrm{mix}(0.3, 0.9, c(x + 1)) = 0.9 - 1.8x^2 - 1.2x^3 & (-1 \le x \le 0)\\ \mathrm{mix}(0.9, 0.6, c(x)) = 0.9 - 0.9x^2 + 0.6^3 & (0 \le x \le 1) \end{cases}

これをグラフにすると下図になります。l(x)l(x)が赤でh(x)h(x)が青で表示されています。

l(x),h(x)のグラフ
l(x),h(x)のグラフ

このグラフよりl(x)l(x)はx=0x=0で折れ曲がっているのに対し、h(x)h(x)は滑らかにつながっていることが分かります。

この微分可能性について計算すると、l(x)l(x)はx=0x=0で傾きが変わり、左微分係数は 0.60.6、右微分係数は−0.3-0.3 なので、x=0x=0では微分可能ではありません。h(x)h(x)の場合の左微分係数と右微分係数は次のように計算すると、

h(−ε)−h(0)ε=−1.8ε2+1.2ε3ε→0\dfrac{h(-\varepsilon) - h(0)}{\varepsilon} = \dfrac{-1.8\varepsilon^2 + 1.2\varepsilon^3}{\varepsilon} \to 0 h(ε)−h(0)ε=−0.9ε2+0.6ε3ε→0\dfrac{h(\varepsilon) - h(0)}{\varepsilon} = \dfrac{-0.9\varepsilon^2 + 0.6\varepsilon^3}{\varepsilon} \to 0

のため左微分係数と右微分係数が一致するため微分可能であり、微分係数は 0 になります。エルミート補間関数は、微分係数が 0 となるように補間するので、つなぎ目は常に平らになります。

導関数#

ある区間上の関数f(x)f(x)に対し、区間上のすべての点が微分可能であるとき、微分係数を対応させる関数は導関数と呼ばれf′(x)f'(x)と表記されます。導関数が存在し、それが連続となる関数は$C^1 級関数と呼ばれます。

エルミート補間関数h(x)h(x)で考えると、

h′(x)={−3.6x(1+x)1.8x(−1+x)h'(x) = \begin{cases} -3.6x(1 + x) \\ 1.8x(-1 +x) \end{cases}

となり、h′(x)h'(x)はx=0x = 0でも連続であるので、h(x)h(x)は[−1,1][-1, 1]区画上のC1C^1級関数であることが分かります。

5 次エルミート補間#

f′(x)f'(x)に導関数f′′(x)f''(x)が存在し、それが連続となる場合、f(x)f(x)はC2C^2級関数と呼ばれます。h′(x)h'(x)を微分すると、

h′′(x)={−3.6−7.2x−1.8+3.6xh''(x) = \begin{cases} -3.6 -7.2x \\ -1.8 +3.6x \end{cases}

となり、x=0x = 0でつながらないので、h(x)h(x)はC2C^2級関数ではありません。

ここでc(x)c(x)を 3 次式のx2(3−2x)x^2(3 - 2x)から、5 次式のx3(10−15x+6x2)x^3(10 - 15x + 6x^2)に変更してみましょう。h(x)h(x)は次のようになります。

h(x)={mix(0.3,0.9,c(x+1))=0.9+6x3+9x4+3.6x5(−1≤x≤0)mix(0.9,0.6,c(x))=0.9−3x3+4.5x4−1.8x5(0≤x≤1)h(x) = \begin{cases} \mathrm{mix}(0.3, 0.9, c(x + 1)) = 0.9 + 6x^3 + 9x^4 + 3.6x^5 & (-1 \le x \le 0)\\ \mathrm{mix}(0.9, 0.6, c(x)) = 0.9 - 3x^3 + 4.5x^4 - 1.8x^5 & (0 \le x \le 1) \end{cases}

h′(x)h'(x)とh′′(x)h''(x)の計算は次のようになります。

h′(x)={18x2+36x3+18x4=18x2(1+2x+x2)−9x2+18x3−9x4=−9x2(1−2x+x2)h'(x) = \begin{cases} 18x^2 + 36x^3 + 18x^4 = 18x^2(1 + 2x + x^2) \\ -9x^2 + 18x^3 - 9x^4 = -9x^2(1 - 2x + x^2) \end{cases} h′′(x)={36x+108x2+72x3=36x(1+3x+2x2)−18x+54x2−36x3=−18x(1−3x+2x2)h''(x) = \begin{cases} 36x + 108x^2 + 72x^3 = 36x(1 + 3x + 2x^2) \\ -18x + 54x^2 - 36x^3 = -18x(1 - 3x + 2x^2) \end{cases}

h′(x)h'(x)とh′′(x)h''(x)はx=0x=0でつながっているので、h(x)h(x)をC2C^2級にすることができたのを確認できました。

このc(x)c(x)の滑らかさの異なるエルミート補間を、それぞれ3 次と5 次のエルミート補間と呼ぶことにします。

勾配の可視化#

サンプルコード 3.3 では、この 3 次エルミート補間と 5 次エルミート補間の違いを数値微分を使って勾配を計算し、定数ベクトルとの内積を取ることで可視化しています。

まずは、数値微分による勾配を取得しているgrad関数のコードを見てみましょう。

grad
// 数値微分による勾配の取得
vec2 grad(vec2 p) {
  float eps = 0.001; // 微小な増分
  return 0.5 * (vec2(
    vnoise21(p + vec2(eps, 0.0)) - vnoise21(p - vec2(eps, 0.0)),
    vnoise21(p + vec2(0.0, eps)) - vnoise21(p - vec2(0.0, eps))
  )) / eps;
}

微分係数の近似値は、コンピュータを使えば導関数を求めずとも直接計算することができます。
f(x)f(x)がC1C^1級であるのなら、微分の定義より十分小さいε\varepsilonをとれば、f′(x)f'(x)の近似値が得られます。

f′(x)≒f(x+ε)−f(x)εf'(x) \fallingdotseq \frac{f(x + \varepsilon) - f(x)}{\varepsilon}

これを使って微分係数の近似値を求めることを数値微分と呼びます。上記の式は前方差分と呼び、後方差分は次の式になります。

f′(x)≒f(x)−f(x−ε)εf'(x) \fallingdotseq \frac{f(x) - f(x - \varepsilon)}{\varepsilon}

さらに、前方差分と後方差分の平均値を中央差分と呼び、式は次のように定義されます。

中央差分=(前方差分+後方差分)2=f(x+ε)−f(x−ε)2ε中央差分 = \frac{(前方差分 + 後方差分)}{2} = \frac{f(x + \varepsilon) - f(x - \varepsilon)}{2\varepsilon}

grad関数では、x 方向は y 方向を固定してf(p+eps, p) - f(p-eps, p)を計算しています。y 方向も同様に x 方向を固定してf(p, p+eps) - f(p, p-eps)を計算しています。この値を微小な増分epsの 2 倍で割ることで、数値微分による勾配を取得しています。

最後に計算した勾配と、定数ベクトルとの内積を取ることで、勾配の可視化を行っています。

void main() {
  // ...
  fragColor.rgb = vec3(dot(vec2(1.0), grad(pos))); // 定数ベクトルとの内積
}

内積(dot)の計算は下記のようになります。

dot(vec2(1.0), grad(pos))
= grad(pos).x * 1.0 + grad(pos).y * 1.0
= grad(pos).x + grad(pos).y

このように定数ベクトルとの内積をとることで、「勾配ベクトルを(1,1)(1, 1)方向に射影」しています。


3 次エルミート補間と 5 次エルミート補間はvnoise21関数で使っています。下図はそれぞれの比較になり、C2C^2級の 5 次エルミート補間の方が滑らかになるでしょう。

3 次と 5 次のエルミート補間の比較
3 次と 5 次のエルミート補間の比較


注意事項

数値微分は一般に計算コストが高いので、高校で習うような普通の微分(解析微分)を使って導関数を求めたほうが描画を高速にできるでしょう。実装としては、問題 3.4 の解答のこちらを参考にして実装したい

次回リンク#

後で詳しく調べるものリスト#

参考書籍#

Related Post
17の平面繰り返しパターンをGLSLで実装してみる - その1

はじめに

平面の繰り返しパターンは17種に分類することが、数学的に証明されています。それも4つの基本移動(並進・鏡映・回転・映進)の組み合わせで17パターンを作成できます。

詳しくは以下のWikipediaのリンクと参考書籍を参照ください。

<WikipediaEmbed title="文様群" />

このシリーズでは、GLSLで17の平面繰り返しパターンを実装してみます。 紹介するパターンはp1~pmgまでの9パターンになります。残りのパターンは次回に紹介します。

基本的なコードの説明

このシリーズでは、対称性が分かりやすいように三角形を4つの基本移動をさせることでパターンを作成します。まずは基本的なmainのコードを説明します。

Meta Data
公開日:2026-03-15
Tags:
#GLSL
#勉強ログ
#装飾パターン
WebGLで使う行列演算の備忘録

はじめに

ライブラリを使用せず素の WebGL で書けるようになりたいと思い、最近はいろいろ勉強してます。WebGL を触るうえで行列演算は避けては通れません。WebGL 用の行列演算の既存のライブラリだと glMatrix がありますが、今回は線形代数の勉強も兼ねて自作で作ってみました。(自作といっても、ほぼほぼ OGL の数学演算系をもって来ているだけですが)

足し算などの簡単なのは飛ばして、何をやってるか忘れそうな処理について備忘録的に書いていきます。長くなるので、主に 3x3 行列をみていきます。

数学演算系のコードは以下に置いてます。

https://github.com/nono-k/webgl-study-note/tree/main/src/lib/webgl/math

3x3 行列(Mat3)

3x3 (Mat3)行列のクラスは次のようにしてます。 演算系の関数はMat3Funcで書いています。

import * as Mat3Func from "./functions/Mat3Func";

export class Mat3 extends Array<number> {
  constructor(
    m00 = 1,
    m01 = 0,
    m02 = 0,
    m10 = 0,
    m11 = 1,
    m12 = 0,
    m20 = 0,
    m21 = 0,
    m22 = 1
  ) {
    super(m00, m01, m02, m10, m11, m12, m20, m21, m22);
  }
  // ...
}

数式で書くと次のような行列表記になります。

Meta Data
公開日:2025-12-20
Tags:
#数学
「リアルタイムグラフィックスの数学」勉強ログ - 第8章 3Dレンダリング
image

はじめに

「リアルタイムグラフィックスの数学」の第 8 章の 3D レンダリングについての勉強ログです。

<AmazonLink imageId="61CP8Asy52L.SY522" linkId="3Iy0agT" title="リアルタイムグラフィックスの数学 ― GLSLではじめるシェーダプログラミング" author="巴山竜来" />

テクスチャマッピング

地面とレイの交点を計算し、地面に市松模様をテクスチャとしてマッピングします。市松模様のテクスチャは次のようになります。

float text(vec2 st) {
  return mod(floor(st.s) + floor(st.t), 2.0);
}

ここで 3D 空間のカメラの設定をします。カメラの向きを$\bm{x} = (0, 0, -1)$とし、カメラの上方向を$\bm{y} = (0, 1, 0)$とします。この値に対して外積をとることで、撮影する向きに対する水平方向$(1, 0, 0)$を得ることができます。実際の計算は次のようになります。

Meta Data
公開日:2025-10-11
Tags:
#GLSL
#数学
#勉強ログ
「リアルタイムグラフィックスの数学」勉強ログ - 第7章 距離とSDF
image

はじめに

「リアルタイムグラフィックスの数学」の第 7 章の距離と SDF についての勉強ログです。

<AmazonLink imageId="61CP8Asy52L.SY522" linkId="3Iy0agT" title="リアルタイムグラフィックスの数学 ― GLSLではじめるシェーダプログラミング" author="巴山竜来" />

2 次元 SDF

胞体ノイズでは近傍点との距離を返す関数でしたが、近くの「点」ではなく「図形」との距離を返す関数を考えます。ここでは図形との負の値もありうる距離を返す関数を導入します。これがSDF(Signed Distance Function, 符号付き距離関数)となります。

円の SDF

円の SDF について考えてみます。円は中心点 C と半径 r から決まりますが、C からの距離が r より小さければ円の「内部」、r より大きければ円の「外部」となり、r と等しい場合は円の「境界」です。平面上の点 P に対して、円の外部では値は正、内部では値が負とします。これが円の SDF を定めます。

円のSDF

Meta Data
公開日:2025-10-05
Tags:
#GLSL
#数学
#勉強ログ
「リアルタイムグラフィックスの数学」勉強ログ - 第6章 胞体ノイズ
image

はじめに

「リアルタイムグラフィックスの数学」の第 6 章の胞体ノイズについての勉強ログです。

<AmazonLink imageId="61CP8Asy52L.SY522" linkId="3Iy0agT" title="リアルタイムグラフィックスの数学 ― GLSLではじめるシェーダプログラミング" author="巴山竜来" />

胞体ノイズとは?

値ノイズと勾配ノイズは格子点でのランダムな値を使ったノイズ関数でした。一方この章で学ぶ胞体ノイズは距離を使ってつくられます。胞体(セル)とは生物の細胞などのことで、胞体ノイズは「近さ」によって空間をバラバラに分割します。

第 1 近傍距離とボロノイ分割

胞体ノイズは空間内に点をバラまいて、各点への距離を測ることで得られますが、バラまかれたこれらの点は特徴点と呼ばれます。ここで特徴点を$A_1,...,A_n$とします。空間内の点 P を定めたとき、P から特徴点$A_i$への距離を$d(P, A_i)$で表すと、すべての特徴点までの距離の最小値は次のように求まります。

$$ \mathrm{min}(d(P, A_1), ... , d(P, A_n)) $$

Meta Data
公開日:2025-09-30
Tags:
#GLSL
#数学
#勉強ログ
「リアルタイムグラフィックスの数学」勉強ログ - 第5章ノイズの調理法
image

はじめに

「リアルタイムグラフィックスの数学」の第 5 章のノイズの調理法についての勉強ログです。

<AmazonLink imageId="61CP8Asy52L.SY522" linkId="3Iy0agT" title="リアルタイムグラフィックスの数学 ― GLSLではじめるシェーダプログラミング" author="巴山竜来" />

再帰

再帰関数とは、関数の中で自分自身の関数を呼び出すような関数のことです。GLSL では再帰関数は使えませんが、for 文を使って再帰的な処理を行うことができます。

非整数ブラウン運動(fBM)

1 以下の定数 G に対し、1 変数ノイズ関数 noise(x)の周波数を 2 倍するごとに値を G 倍して、それを足し合わせてみましょう。式にすると次のようになります。

$$ noise(x) + Gnoise(2x) + G^2noise(4x) + ... + G^knoise(2^kx) $$

ここで素材となるノイズ関数 noise(x)はどのような関数でもいいですが、値の範囲を$[-0.5, 0.5]$区画にずらしておきます。このように加工されたノイズ関数は非整数ブラウン運動(fractional Brownian motion, fBM)と呼ばれます。

Meta Data
公開日:2025-09-24
Tags:
#GLSL
#数学
#勉強ログ
「リアルタイムグラフィックスの数学」勉強ログ - 第4章勾配ノイズ
image

はじめに

「リアルタイムグラフィックスの数学」の第 4 章の勾配ノイズについての勉強ログです。

<AmazonLink imageId="61CP8Asy52L.SY522" linkId="3Iy0agT" title="リアルタイムグラフィックスの数学 ― GLSLではじめるシェーダプログラミング" author="巴山竜来" />

勾配ノイズとは?

前回は値ノイズについて見てきました。値ノイズは計算量も少なく、簡単につくれるノイズですが、格子で区切っているのでブロック状に見えてしまいますし、ムラが現れやすいです。値ノイズを改善したノイズが勾配ノイズになります。

値ノイズの場合は、格子点での乱数の「値」を使うのに対し、勾配ノイズは乱数のベクトル値を「勾配」として使用します。ノイズ関数でよく使用されるパーリンノイズは、この勾配ノイズの一種であります。この章では、勾配ノイズと 2002 年の Perlin による改良版勾配ノイズ(パーリンノイズ)について見ていきます。

勾配ノイズの構成法

1 変数

値ノイズは乱数値をエルミート補間してつくりました。ここで別の見方として、$h(0) = 0$,$h(1) = 1$,$h'(0) = h'(1) = 0$ を満たすエルミート補間関数$h(x)$に対して、$w(x)$を次のように定義します。

Meta Data
公開日:2025-09-20
Tags:
#GLSL
#数学
#勉強ログ
「リアルタイムグラフィックスの数学」勉強ログ - 第2章疑似乱数
image

はじめに

「リアルタイムグラフィックスの数学」の第 2 章の疑似乱数についての勉強ログです。

<AmazonLink imageId="61CP8Asy52L.SY522" linkId="3Iy0agT" title="リアルタイムグラフィックスの数学 ― GLSLではじめるシェーダプログラミング" author="巴山竜来" />

レガシー乱数

GLSL ES 1.0 ではビット演算が使えないため、ハッシュ関数ではなくサイン関数を使用した乱数生成が行われていました。The Book of Shaders ではサイン関数を使用した乱数生成の方法が紹介されています。

https://thebookofshaders.com/10/?lan=jp

サイン関数自体には乱数性はないですが、サイン関数の値に大きい値をかけて桁を上げ、fractで小数部分を取り出すことで乱数のように見えることができます。

レガシー乱数の 1 変数と 2 変数のコードは次のようになります。

// 1変数のレガシー乱数
float fractSin11(float x) {
  return fract(1000.0 * sin(x));
}

// 2変数のレガシー乱数
float fractSin21(vec2 xy) {
  return fract(sin(dot(xy, vec2(12.9898, 78.233))) * 43758.5453123);
}
Meta Data
公開日:2025-09-10
Tags:
#GLSL
#数学
#勉強ログ
「リアルタイムグラフィックスの数学」勉強ログ - 第1章補間
image

はじめに

「リアルタイムグラフィックスの数学」の第 1 章の補間についての勉強ログです。

<AmazonLink imageId="61CP8Asy52L.SY522" linkId="3Iy0agT" title="リアルタイムグラフィックスの数学 ― GLSLではじめるシェーダプログラミング" author="巴山竜来" />

線形補間とグラデーション

mix 関数について

GLSL における mix 関数は以下のような数式になります。

$$ \bm{a} + x\overrightarrow{AB} = \bm{a} + x(\bm{b} - \bm{a}) = (1 - x)\bm{a} + x\bm{b} $$

これは、線分 AB があり、その線分上を動く 0 以上 1 以下の x に対して、線分 AB を x: (1 - x)に内分する点の位置ベクトルを表しています。上記の式のベクトルをmix(a, b, x)として定義しています。このように 2 点間をつなぐことを補間と呼び、上記の式は線形補間(Linear Interpolation)の公式です。

コード 1.1 のように、赤(1, 0, 0)と青(0, 0, 1)を mix 関数でつなぐことで 2 色のグラデーションを作ることができます。

vec2 RED = vec3(1.0, 0.0, 0.0);
vec3 BLUE = vec3(0.0, 0.0, 1.0);
vec3 col = mix(RED, BLUE, pos.x);

赤と青のグラデーション

Meta Data
公開日:2025-09-07
Tags:
#GLSL
#数学
#勉強ログ
勉強のために「リアルタイムグラフィックスの数学」のGLSLコードを確認できるサイトを作った

はじめに

シェーダに再挑戦したいと思い、「リアルタイムグラフィックスの数学」の本をまた読み直してます。

<AmazonLink imageId="61CP8Asy52L.SY522" linkId="3Iy0agT" title="リアルタイムグラフィックスの数学 ― GLSLではじめるシェーダプログラミング" author="巴山竜来" />

勉強する際に、本に書いているサンプルコードを Web サイトですぐに確認できるように、Astro と Three.js を使用して GLSL コードを表示するサイトを作成しました。サイトはこちらになります。

リポジトリはこちらになります!

https://github.com/nono-k/book-of-realtime-graphics-math

勉強方法の方針

いったん、本を読みながらローカルの VSCode 上で GLSL コードを書いて確認して、Web サイトに GLSL のコードと実行結果のサムネをアップしていきたいと思います。

また、このブログで勉強した内容を章ごとに残していきたいと思います。以下はリンクになります。

Meta Data
公開日:2025-09-06
Tags:
#GLSL
#数学
読んだ本リスト
セックスはなぜ楽しいか
セックスはなぜ楽しいか
セックスはなぜ楽しいか
著者
ジャレド ダイアモンド
発売日
1999年3月31日

タイトルにある「セックスはなぜ楽しいか」ばかりが書かれているわけではなく、本書では、人間の性がどのようにして進化・淘汰されて現在のようなものになったのかを考察するものである。

本書で随所に書かれていることが、人間の性的特徴を理解するには、まず人間を中心とした偏った考え方を捨てるべきだという主張だろう。人間は他の動物と比べても、奇妙な性生活を送っているのだという。

例えば、人間の女性は排卵が自分自身でほとんど確認できないが、これは動物の世界ではごく少数派という。ヒヒのメスなどは、排卵時期には膣のまわりの皮膚が膨張して真っ赤になることで、遠くからでもひと目で分かりオスに知らせる役割をもつ。他の動物のメスでも、自分の排卵を知っていて、目に見えるサインや匂いや行動で、排卵をはっきりとオスに知らせる。

なぜ人間は他の動物と同じように進化しなかったのかを、様々な説の紹介とともに考察していく。男性が授乳しない理由なんて考えたこともなかったし、理論的には可能であるらしい。進化理論を基軸に科学的発見を織り交ぜながら解説している。

1997年に書かれた本ではあるので、この説は現在は本当なのか?と思うこともあったが、タイトルとは裏腹に真面目なサイエンス本であり読んでいて面白かった。

ヒトのセクシャリティにかかわる大きな謎は、究極要因にかかわる進化論的な問いであり、生理学的な直接のメカニズムを詮索することではない。 なぜそのように進化しなかったのかの理由をどう理解するかが大切なのだ。

関連サイト(外部サイト)
「セックスはなぜ楽しいか」の参考文献一覧

Meta Data
公開日:2026-11-10
Tags:
レプリカ---文化と進化の複製博物館
レプリカ---文化と進化の複製博物館
レプリカ---文化と進化の複製博物館
サイエンス
著者
武村政春
発売日
2012年11月25日

タイトルから美術関係の複製の話だと思ったが、それだけでなく、著者の専門でもある生物学、DNAの複製の話が後半はメインで書かれている。

本書では「複製」という言葉を次のように扱っている。

「それは「複製されたもの」に代表される「産物」の意味を持つ言葉ではなく、「複製する物質」などの言い方に代表される、いわゆる「行為」を表す言葉としてである。

事例として前半は「身のまわりの複製」を、後半は「生物の世界の複製」から考察していく。専門ではないとのことだが、妖怪・怪談からの複製の考察は面白い。

本書の特徴としては、今までは文化の視点からみた複製文化論が多くの論客によってなされていたが、われわれ生命世界を含めたこの世のすべての複製について書かれているのが特徴だろう。

様々な話題で複製について考察されているので、気になるトピックから読んでいくこともできるだろう。

関連サイト(外部サイト)
「レプリカ---文化と進化の複製博物館」の参考文献一覧

Meta Data
公開日:2026-11-08
Tags:
#サイエンス
肉体美大全
肉体美大全
肉体美大全
文化論
著者
ジュリアン ロビンソン
発売日
2005年9月30日

以前、近代の裸体画から抜け落ちてしまった日本の裸体芸術としての刺青についてや、日本人の裸体観について書かれた「刺青とヌードの美術史 - 宮下 規久朗」という本を読んだが、本書は世界の肉体美、身体装飾について膨大な資料を掲載し、紹介してくれる一冊である。

著者は、ロンドン生まれで元々はファッションデザイナーであったが、その傍ら世界中で弄放なフィールドワークを行っていた。表紙にもあるように世界中の広告であったりや、現地の痛みを伴う身体装飾、性的魅力を高めるものであったりが、全ページに渡って載っているので、眺めるだけでも楽しめる。刺青、ピアス、ボディ・アートの数々に人種も肌の色も関係なくただただ圧倒される。

著者の現地の体験からも、美的・性的に魅力的だとされる形態の概念は地域によって異なっており、どれが一番魅力的な肉体なのかという点で、意見を同じくする社会はほとんどない。土地によって美的基準が変わっているので、ここまでの多様な美的装飾が生まれるのであろう。

だが、エピローグで書かれているように、現代の「グローバル・ヴィレッジの拡大」により、身体装飾における民族的な「多様性」の排除と画一化に警鐘を鳴らしている。はたして全世界と繋がることができることが良いことなのか、考えさせられる。

著者の基本理念通り、「身体装飾は人間存在の根源的なところにある強い衝動・快楽で、何者にもそれを規制したり排除したりする権利はない」のだ。

決して体系的にまとめられている本ではないが、西欧、非西欧の区別なく膨大な資料が載っているのは貴重であるだろう。これらの資料を眺めるだけでも十分元は取れるでしょう。

関連サイト(外部サイト)
「肉体美大全」の参考文献一覧

Meta Data
公開日:2026-11-05
Tags:
#文化論
「愛」と「性」の文化史
「愛」と「性」の文化史
「愛」と「性」の文化史
人文・思想・社会
著者
佐伯 順子
発売日
2008年11月9日

「愛」や「性」という言葉は、昔から現在と同じような意味で存在していたのではない。これらの言葉は、日本の歴史の過程で誕生したものであり、私たちの恋愛観や性愛観も、こうした歴史の過程抜きでは語れないことを著者は述べる。

本書では、「愛」や「性」という言葉が、現在の私たちになじみのあるような意味で使われる以前の男女関係のあり方を、文学作品や絵画といった様々な表現のなかから考察する。

例えば、江戸時代の春画の話では、スピリチュアルの視点で考察される。当時は「笑い絵」と呼ばれていたものだが、交合も笑いも、ともに神の力によって幸いを得る宗教的パワーを持つものと信じられてきたのではという。それゆえに、春画では遊女が少ないとのこと。それはスピリチュアルなパワーが期待できないからなのだと。

このことからも、春画というメディアが西洋的「ポルノグラフィー」の枠組みでは捉えられないことが知れる。明治の文明開化後に西洋からの「愛」や「性」といった、概念が入ってくるのだ。

その他にも、与謝野晶子の「貞操」と「処女」論、谷崎潤一郎の夫婦恋愛小説家としての面や、御伽草子の夫婦の「情」、心中の変容、高齢化社会における恋愛の将来などについて考察される。

文学作品からの考察なので、実態はどうだったのかが述べられてないのが気になったが、日本における「愛」や「性」の変容について知れる一冊となります。

関連サイト(外部サイト)
「「愛」と「性」の文化史」の参考文献一覧

Meta Data
公開日:2026-11-04
Tags:
#人文・思想・社会
タタール人の砂漠
タタール人の砂漠
タタール人の砂漠
小説
著者
ディーノ・ブッツァーティ
発売日
2013年4月16日

イタリアの著者ディーノ・ブッツァーティの長編三作目に当たる「タタール人の砂漠」
訳者解説でも書かれているが、「幻想小説」の世界的古典として知られるが、ここにはいつの時代の人々にも当てはまるものが含まれているだろう。

主人公ジョヴァンニ・ドローゴは将校で、俗世から隔離された娯楽ひとつない砦での勤務に当たる。若さを自覚する主人公は、理想的な未来を想像するが、時の流れは残酷だ。

一度は故郷に戻るが、再び砦に戻ってしまうのはなぜか。先輩中佐が先に退官する場面、反対のことを願いながら敵が来ることを話す。ほぼ三十年というものの、同じ砦で過ごし、同じ敵を待ち続けていたが、ふたりの道は分かれるのだ。

はたして敵は来るのだが、そのころにはドローゴは年を取りすぎていた。読者は主人公を青年時代から見てきたが、役立たずな老人として他の若い兵士に見られながら砦を去るドローゴを見る。

まさに不条理といってもいい小説なのだ。
だが人生もそんなものかもしれない。

Meta Data
公開日:2026-11-03
Tags:
#小説
レストランの誕生 ――パリと現代グルメ文化
レストランの誕生 ――パリと現代グルメ文化
レストランの誕生 ――パリと現代グルメ文化
文化論
人文・思想・社会
著者
レベッカ・L・スパング
発売日
2021年10月10日

レストランが食べる場所を意味するようになるまでは、数世紀にわたって、レストランといえば食べる物、すなわち元気を回復させるだし汁のことであった

本書では、小さなカップ一杯のブイヨンから、現代の意味での場所としてのレストランが出現する過程を辿っていきます。

初期のレストランが食を提供したのは、食欲を失い疲れ果てた口と虚弱な胸に悩む衰弱した者たちに対してでした。その起源から見ても、レストランは必ずしも豪華な食事とは無縁だったことが知れます。

しばしばレストランはフランス革命により貴族などに雇われていたシェフが開業したとの言説がありますが、革命前から自分の事業に身を投じているのでその言説は間違いであると著者は述べます。こうした飽食の時代としてのレストランではなく、本書では空間・場所としてのレストランを見ていくことができるでしょう。

ヨーロッパの食文化としては、イギリスではカフェがありますが、パリのレストランの文化とは何でしょう。レストランをすでに存在していた他の公共食堂の類と区別していたのは、ブイヨンとライスクリームの載ったメニューであったと同時に、そのサービス様式であったといいます。例えば、定食用のテーブルであったり、密会の場にもなった個室、料理のメニューのリストの必要性などです。

メニューの存在により、レストランは初めて、実際に料理を分け合うことなく他人と食事をともにすることを可能にしました。カフェの客は新聞を読み、身の回りの世界について考えますが、レストランの顧客はメニューを読み、自分自身の体調を考えたのでした。

本書を読むことで、「レストラン」という概念を違った視点で見ていくことができるでしょう。著者自身が述べているように「レストランについて本を書くとは、ほとんどすべてについて本を書くようなもの」なのだから。

関連サイト(外部サイト)
「レストランの誕生 ――パリと現代グルメ文化」の参考文献一覧

Meta Data
公開日:2026-10-30
Tags:
#文化論
#人文・思想・社会
レタースペーシング タイポグラフィにおける文字間調整の考え方
レタースペーシング タイポグラフィにおける文字間調整の考え方
レタースペーシング タイポグラフィにおける文字間調整の考え方
フォント
デザイン
著者
今市達也
発売日
2021年7月20日

意外にも類書がないレタースペーシングについて書かれた本。

レタースペーシングとは、文字の間隔を視覚的に均等に見えるように調整する作業のことです。デザインにおいて、文字の詰め方で読みやすさや見た目の印象が大きく変化します。デザイン初学者にとっては、文字間を意識することは少ないかと思われますが、プロのデザイナーにとっては、この文字間に常に気を配って文字組みを行っています。

そもそものレタースペーシングの歴史では、金属活字の時代では、正方形に収められている活字の影響で活字同士がぶつかって文字詰めをすることが技術的にできませんでした。しかし、写植に以降したことで文字が詰められるようになります。その時代(1960年代)以降の日本の雑誌では、見出しの字間を極端に狭くするレタースペーシングが流行していたみたいです。

このことを踏まえると、時代や技術が変化すると文字の組み方が変わり、それに合わせてスペーシングに対する価値観も変わっていくと著者は述べます。また、和文と欧文でも文字の形状やボディ、ベースラインの考え方が違うでしょう。本書のようなレタースペーシングについての入門書を読むことで、文字に対しての基礎知識を得ることで、なぜそのスペーシングなのかを感覚ではなく言語化して説明できるようになり、「なんとなく」からの卒業ができそうです。

本書の最後では実際のロゴタイプを例にとり、なぜそのスペーシングなのか解説してくれます。ロゴタイプは企業としても大事なものであり、目にする機会も多いため、そのスペーシングに対しての考察は勉強になります。例えば、商品パッケージで縦組みと横組みのロゴタイプがある場合は、それぞれで文字の形を微妙に変化させスペーシングを調整しているなど、すごいなと思いました。

今まで文字組みをなんとなく行っていた方が読むと勉強になるので、おすすめの一冊となります。

関連サイト(外部サイト)
「レタースペーシング タイポグラフィにおける文字間調整の考え方」の参考文献一覧

Meta Data
公開日:2026-10-29
Tags:
#フォント
#デザイン
トンデモと科学のあいだ
トンデモと科学のあいだ
トンデモと科学のあいだ
サイエンス
著者
田口 善弘
発売日
2026年9月9日

科学・物理学の世界では、中身や理由が分かっていない、かつてはトンデモな扱いだったものが、今では主流になったりする。

生成AIはどうだろう。科学者も中身が分かっていないながらも使用しているという。科学の歴史がそうであったように、恐れずに生成AIを使用していこうというのが主張か。

正直、科学のトンデモな概念の歴史と、生成AIとの議論がつながってなくない?となり、あまり話が入ってこなかった。

生成AIがどのようにして答えを出力しているのかを著者は知っているのかと、書きぶりから心配したが、ブルーバックスから出ている「はじめての機械学習」の著者でもあるのですね。それなら、今の科学者がどのようにして生成AIを使用して研究しているのかを書いて欲しかったな。

そもそも、「科学者が中身が分からなくても生成AIを平然と使えるのはなぜ?」と疑問に思ったことがないので噛み合わなかったかも。

題名から、ニュートンが晩年錬金術に情熱を注いだみたいなトンデモ話のことが書かれているのかと思って買ったんだけれども、錬金術みたいなトンデモ話は出てこなかったです。

収穫としては、ガリレオとケプラーの話でしょうか。あとは、参考文献にも複数挙げられている山本義隆の著書群が気になりました。

関連サイト(外部サイト)
「トンデモと科学のあいだ」の参考文献一覧

Meta Data
公開日:2026-10-20
Tags:
#サイエンス
センスをみがく文章上達事典 新装版
センスをみがく文章上達事典 新装版
センスをみがく文章上達事典 新装版
文章術
著者
中村 明
発売日
2016年12月9日

多くの文章術の著書がある中村明氏の文章観のエッセンスを一望できる一冊である。

本書の構成は基礎編、応用編、実践編の三つに分かれる。第Ⅰ部「書く」では、相手に正しく伝わる文章を書くための基礎的な技術について書かれている。第Ⅱ部「練る」では、「表現をゆたかに」とあるように小説などでの表現技法について解説されている。第Ⅲ部「研く」では、「文体をしなやかに」とあるように自己のスタイルを確立するまでや、文章の深みといった点について書かれている。

全体として、プロの実例をもとに解説していく流れになる。よりよい文章を書きたい人にもおすすめだが、実例にもある小説についての読み方の視点も変わっていきそうだ。

「センスをみがく」ということは、多く良い文章に触れていくことなのだろう。
本書の見出しをみるだけでもためになりそう。

書く - 文章をはっきりと

  • 句読点のルール - 打つも打たぬも思いやり
  • 記号類の活用 - 使いすぎは品格をおとす
  • 漢字・ひらがな・カタカナの使い分け - 文字に思想をこめて
  • 漢字の書き分け - ニュアンスを書き分ける
  • ことばの選択 - 三方向から一語にしぼる
  • 和語と漢語 - 硬軟おりまぜて
  • 擬声語・擬態語 - 感覚の新鮮さがいのち
  • 修飾語を効果的に - 適量のさじ加減
  • 並列 - 両輪をバランスよく
  • 語順と表現意図 - 繰り出し方で感じが変わる
  • 文末表現 - 足もとのおしゃれ
  • 文構造と文の筋 - 述語は忘れないうちに
  • 文の長さ - 手を抜くと文が長くなる
  • わかりやすい表現 - 読まれなければ始まらない
  • あいまいな表現 - 誤解の芽を摘む
  • 文と文との接続 - 関係は書き手がつくる
  • 段落づくり - 迷ったら改行する
  • 引用を明記する - 借用証書のすすめ
  • 敬語表現 - 形式よりも気持ちが問題
  • 読者への配慮 - いやいや読む人の身になって
  • 執筆態度を明確に - 情報を鼓動とともに
  • 構想と展開 - 調理の腕で素材が生きる
  • 文章の調子 - こなれがいいほど心になじむ
  • 推敲 - 見知らぬ読者になりすます

練る - 表現をゆたかに

  • 情報待機 - サスペンスをつくりだす
  • 漸層・漸降 - 上りと下りは勢いが違う
  • 倒置表現 - 計画的に取り乱す
  • 反復法 - 畳みかけて弾みをつける
  • 尻取り文 - 展開は鎖のように
  • リズムのある文章 - 軽くステップを踏んで
  • 対句表現 - 形式美はシンメトリックから
  • 挙例法 - 理屈より実感
  • 列挙法 - ことばの洪水で圧倒
  • 省略法 - 沈黙がものをいう
  • 名詞止め - ことばを置き去りにして
  • 否定表現 - 打ち消すのもレトリック
  • 婉曲表現 - 身もふたもある
  • 反語表現 - ばれるように嘘をつく
  • 比喩表現 - 心の風景をのぞかせる
  • 擬人法 - 万物と語らう
  • 洒落 - ことばで遊ぶ
  • パロディー - 二重映しの愉しみ
  • 現写法 - 臨場感を高める
  • 誇張表現 - 望遠レンズで迫力を
  • 逆説 - 常識を逆なでする

研く - 文体をしなやかに

  • 語感 - ことばのにをいを嗅ぎ分ける
  • 書き出し - もう読まずにはいられない
  • 結び - ギュッと締めて、フワッと放す
  • 書き手の視点 - カメラワークを意のままに
  • 人物描写 - のこのこ歩き出す
  • 心理描写 - 心のひだを映し出す
  • 感覚描写 - イメージに限りなく近づける
  • 自然描写 - 風景に体温を添えて
  • 表現の深さ - ことばに奥行きを感じるとき
  • 表現の間 - 息づかいが聞こえる
  • 余韻・余情 - 文章の奥へ、その先へ
  • ユーモア - 弱さや愚かしさをしみじみと笑う
  • スタイル - 譲れない文体の熟すまで
  • 文章の雰囲気 - 表現の奥に人のけはいを聴く
Meta Data
公開日:2026-10-25
Tags:
#文章術
日本語の作文技術
日本語の作文技術
日本語の作文技術
文章術
著者
本多 勝一
発売日
2015年12月6日

1982年に刊行された文章術の名著となります。

この本は、小説などの物語を書くためではなく、「事実的」「実用的」な文章を分かりやすく書くための本になります。悪い文章の例を提示しながら、どの部分が読みづらくなっているのや、改善方法などが解説されています。

自分では良い文章だと思っていても、他人から見たら読みづらい文章になっていることがあるでしょう。著者自身も例外に漏れず、悪い文章の例として、自分の文章も提示されています。日本語の文章を分かりやすく書くことの難しさを感じます。

日本語は非論理的だと外国語を優遇する人たちを著者は批判します。そうではなく、日本語を使いこなせない「使い手自身」こそが非論理的なのであると主張されているのが印象的でした。

学校で習う日本語の文法は、明治以降の西洋の文法からの影響に築かれたものであるので、本来の日本語にそぐわない形で体系化された経緯があります。英語などの影響により、文章の最初に「主語」を書かなくてはいけない風潮がありますが、日本語には「主語」は存在せず、あるのは「主格」にすぎないとの論には、なるほどなと思いました。

文章術の本を読んでいくと、いかに分かりやすい日本語で書くことが難しいのかを感じます。読みやすいリズムかどうかは、朗読してみれば分かると本書にかかれていたので、こうしたブログを書く際に実践してより多く文章を書いていきたいです。

関連サイト(外部サイト)
「日本語の作文技術」の参考文献一覧

Meta Data
公開日:2026-10-17
Tags:
#文章術
Info