Skip to content

Commit

Permalink
minor tweaks to enforce writing conventions
Browse files Browse the repository at this point in the history
  • Loading branch information
kynd committed Dec 27, 2015
1 parent 3cece61 commit bac200a
Show file tree
Hide file tree
Showing 6 changed files with 48 additions and 49 deletions.
2 changes: 1 addition & 1 deletion 01/README-jp.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@

## GLSLとは

GLSLはopenGL Shading Languageの略で、標準化されたシェーダー言語の一つです。これ以降の章ではこの言語を扱います。他にもハードやOSによって異なるシェーダー言語があります。
GLSLはopenGL Shading Languageの略で、標準化されたシェーダー言語の1つです。これ以降の章ではこの言語を扱います。他にもハードやOSによって異なるシェーダー言語があります。
ここからは[クロノスグループ](https://www.khronos.org/opengl/)によって策定されたOpenGLの仕様に基づいて話を進めます。OpenGLの歴史を知っておくと奇妙な(訳注:プログラミング、言語仕様上の)慣習を理解する助けになるかもしれません。[openglbook.com/chapter-0-preface-what-is-opengl.html](http://openglbook.com/chapter-0-preface-what-is-opengl.html)に軽く目を通しておくと良いでしょう。

## なぜシェーダーは厄介だと思われているのか
Expand Down
14 changes: 7 additions & 7 deletions 02/README-jp.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,15 @@

2. 最終的なピクセルの色は、予約語として確保されたグローバル変数、```gl_FragColor```に割り当てられます。

3. このCによく似た言語には(```gl_FragColor```のような)組み込みの「変数」や「関数」、「型」があります。このサンプルでは浮動小数点精度を持つ4次元ベクトル```vec4```型が使われています。またこの後、```vec3``````vec2```のような型や、おなじみの```float``````int``````bool```なども登場します。
3. このCによく似た言語には(```gl_FragColor```のような)組み込みの「変数」や「関数」、「型」があります。このサンプルでは浮動小数点精度を持つ4次元ベクトル ```vec4``` 型が使われています。またこの後、```vec3``````vec2``` のような型や、おなじみの ```float``````int``````bool``` なども登場します。

4. ```vec4```型をよく見ると、4つの引数はそれぞれ赤(Red)、緑(Green)、青(Blue)、透過度(Alpha)の各チャンネルに対応していることが分かるでしょう。またこれらの値が正規化されている(normalized)、つまり```0.0```から```1.0```の値をとることも読み取れます。後ほど、値が正規化されていると変数間の写像に便利であることを学びます。
4. ```vec4```型をよく見ると、4つの引数はそれぞれ赤(Red)、緑(Green)、青(Blue)、透過度(Alpha)の各チャンネルに対応していることが分かるでしょう。またこれらの値が正規化されている(normalized)、つまり ```0.0``` から ```1.0``` の値をとることも読み取れます。後ほど、値が正規化されていると変数間の写像に便利であることを学びます。

5. プリプロセッサマクロが使えるのも、このサンプルから読み取れるもう一つの大事な「C言語的」特徴です。マクロはコンパイルの前に処理されます。マクロを使うとグローバル変数を定義(```#define```)したり、```#ifdef``````#endif```を使って場合分けを行うことができます。全てのマクロの命令はハッシュタグ(```#```)で始まります。コンパイルの直前には全ての```#define```の呼び出しが置き換えられ、```#ifdef``````#ifndef```といった条件文のチェックが行なわれます。上のサンプルでは、```GL_ES```が定義されているときにだけ2行目のコードを挿入します。```GL_ES```は多くの場合、モバイル機器やブラウザー上でコンパイルされたことを意味します。
5. プリプロセッサマクロが使えるのも、このサンプルから読み取れるもう一つの大事な「C言語的」特徴です。マクロはコンパイルの前に処理されます。マクロを使うとグローバル変数を定義(```#define```)したり、```#ifdef``````#endif``` を使って場合分けを行うことができます。全てのマクロの命令はハッシュタグ(```#```)で始まります。コンパイルの直前には全ての ```#define``` の呼び出しが置き換えられ、```#ifdef``````#ifndef``` といった条件文のチェックが行なわれます。上のサンプルでは、```GL_ES``` が定義されているときにだけ2行目のコードを挿入します。```GL_ES``` は多くの場合、モバイル機器やブラウザー上でコンパイルされたことを意味します。

6. 浮動小数点型はシェーダーに不可欠で、その精度はとても重要な意味を持ちます。精度が低いとレンダリングが速くなる代わりに品質が下がります。もしこだわりたければ、GLSLでは浮動小数点を使うそれぞれの変数ごとに精度を指定できます。一行目の```precision mediump float;```は、全ての浮動小数点型の変数に中レベルの精度を指定しています。より低い精度(```precision lowp float;```)や高い精度(```precision highp float;```)を選ぶこともできます。
6. 浮動小数点型はシェーダーに不可欠で、その精度はとても重要な意味を持ちます。精度が低いとレンダリングが速くなる代わりに品質が下がります。もしこだわりたければ、GLSLでは浮動小数点を使うそれぞれの変数ごとに精度を指定できます。一行目の ```precision mediump float;``` は、全ての浮動小数点型の変数に中レベルの精度を指定しています。より低い精度(```precision lowp float;```)や高い精度(```precision highp float;```)を選ぶこともできます。

7. 最後に、そしておそらく一番大切なことですが、GLSLの仕様では変数の自動的な型変換は保証されていません。どういうことでしょう。メーカーは色々な方法でグラフィックカードを高速化しようとしますが、同時に最低限の仕様を満たす必要があります。自動的な型変換はこの最低限の仕様には含まれていません。上のサンプルでは```vec4```型は浮動小数点精度を持っているので、```float```型の値が割り当てられることになっています。コードの一貫性を保ち、真っ白な画面で何時間もデバッグするのを避けるために、浮動小数点型の値には小数点(```.```)を使うことを習慣にしましょう。下記のようなコードはうまく動くとは限りません。
7. 最後に、そしておそらく一番大切なことですが、GLSLの仕様では変数の自動的な型変換は保証されていません。どういうことでしょう。メーカーは色々な方法でグラフィックカードを高速化しようとしますが、同時に最低限の仕様を満たす必要があります。自動的な型変換はこの最低限の仕様には含まれていません。上のサンプルでは ```vec4``` 型は浮動小数点精度を持っているので、```float``` 型の値が割り当てられることになっています。コードの一貫性を保ち、真っ白な画面で何時間もデバッグするのを避けるために、浮動小数点型の値には小数点(```.```)を使うことを習慣にしましょう。下記のようなコードはうまく動くとは限りません。

(訳注:gl_FragColorはGLSL1.3から非推奨になりました。以降のバージョンでは開発者が自由に名前をつけることができます。この本のサンプルは1.2以前のバージョンで書かれているため、gl_FragColorを出力用の変数として用います)

Expand All @@ -40,7 +40,7 @@ void main() {

* 6行目をコメントアウトして好きな値を関数に割り当ててみましょう。

* 特定の色を返す別の関数を用意して```main()```関数の中で使ってみましょう。ヒント:下記のコードは赤色を返す関数です。
* 特定の色を返す別の関数を用意して ```main()``` 関数の中で使ってみましょう。ヒント:下記のコードは赤色を返す関数です。

```glsl
vec4 red(){
Expand All @@ -54,4 +54,4 @@ vec4 red(){
vec4 color = vec4(vec3(1.0,0.0,1.0),1.0);
```

この章のサンプルはさほど面白くはありませんが、キャンバス上のピクセルを全て同じ色に変える最も基礎的な例です。この後に続く章ではピクセルの色を2種類の入力、空間(画面上のピクセルの位置)と時間(ページがロードされてから経過した秒数)を使って変化させる方法を学びます。
この章のサンプルはさほど面白くはありませんが、キャンバス上のピクセルを全て同じ色に変える、最も基礎的な例です。この後に続く章ではピクセルの色を2種類の入力、空間(画面上のピクセルの位置)と時間(ページがロードされてから経過した秒数)を使って変化させる方法を学びます。
20 changes: 10 additions & 10 deletions 03/README-jp.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

ここまで、GPUが沢山のスレッドを並列に処理する様子を見てきました。それぞれのスレッドは画像の各部分への色の割り当てを受け持っています。シェーダーではスレッド間の情報のやりとりを行うことはできませんが、CPUからそれぞれのスレッドに入力を送ることはできます。グラフィックカードは全てのスレッドにまったく同じ入力を、読み取り専用で送るように設計されています。それぞれのスレッドは同じデータを受け取り、それを書き換えることはできません。(訳注:英語の”uniform”には均一な、一様な、という意味があります)

これらの入力は```uniform```変数と呼ばれGLSLでサポートされているほとんどの型が使えます。サポートされている型には ```float``````vec2``````vec3``````vec4``````mat2``````mat3``````mat4``````sampler2D``````samplerCube```などがあります。
これらの入力は ```uniform``` 変数と呼ばれGLSLでサポートされているほとんどの型が使えます。サポートされている型には ```float``````vec2``````vec3``````vec4``````mat2``````mat3``````mat4``````sampler2D``````samplerCube``` などがあります。
uniform変数はシェーダーの冒頭、浮動小数点精度の設定の後に型指定付きで定義します。

```glsl
Expand All @@ -15,7 +15,7 @@ uniform vec2 u_mouse; // mouse position in screen pixels
uniform float u_time; // Time in seconds since load
```

uniform変数はCPUとGPUの間の小さな架け橋だと考えることができます。変数の名前は実装次第で変わりますが、この本のサンプルでは一貫して```u_time```(シェーダーが開始してから経過した秒数)、```u_resolution```(シェーダーが描画する領域の大きさ)、```u_mouse```(描画領域の中のマウスの位置)を渡すことにします。ここでは変数の種類を示すためにuniform変数の名前は```u_```で始めるという慣例に従っていますが、他の場所では異なる名前が使われているのも見かけることでしょう。
uniform変数はCPUとGPUの間の小さな架け橋だと考えることができます。変数の名前は実装次第で変わりますが、この本のサンプルでは一貫して```u_time```(シェーダーが開始してから経過した秒数)、```u_resolution```(シェーダーが描画する領域の大きさ)、```u_mouse```(描画領域の中のマウスの位置)を渡すことにします。ここでは変数の種類を示すためにuniform変数の名前は ```u_``` で始めるという慣例に従っていますが、他の場所では異なる名前が使われているのも見かけることでしょう。
例えば[ShaderToy.com](https://www.shadertoy.com/)では同じ意味を持つuniform変数に下記の名前が付けられています。


Expand All @@ -31,37 +31,37 @@ uniform float iGlobalTime; // shader playback time (in seconds)

<div class="codeAndCanvas" data="time.frag"></div>

GPUの驚くべき機能の一つとして、角度や三角関数、指数関数などがハードウェア上で高速に処理されることが挙げられます。サポートされる関数には [```sin()```](../glossary/?search=sin)、 [```cos()```](../glossary/?search=cos)、[```tan()```](../glossary/?search=tan)、 [```asin()```](../glossary/?search=asin)、[```acos()```](../glossary/?search=acos)、 [```atan()```](../glossary/?search=atan)、[```pow()```](../glossary/?search=pow)、 [```exp()```](../glossary/?search=exp)、[```log()```](../glossary/?search=log)、 [```sqrt()```](../glossary/?search=sqrt)、[```abs()```](../glossary/?search=abs)、 [```sign()```](../glossary/?search=sign)、[```floor()```](../glossary/?search=floor)、 [```ceil()```](../glossary/?search=ceil)、[```fract()```](../glossary/?search=fract)、 [```mod()```](../glossary/?search=mod)、[```min()```](../glossary/?search=min)、 [```max()```](../glossary/?search=max)、[```clamp()```](../glossary/?search=clamp)などがあります。
GPUの驚くべき機能の1つには、角度や三角関数、指数関数などがハードウェア上で高速に処理されることが挙げられます。サポートされる関数には [```sin()```](../glossary/?search=sin)、 [```cos()```](../glossary/?search=cos)、[```tan()```](../glossary/?search=tan)、 [```asin()```](../glossary/?search=asin)、[```acos()```](../glossary/?search=acos)、 [```atan()```](../glossary/?search=atan)、[```pow()```](../glossary/?search=pow)、 [```exp()```](../glossary/?search=exp)、[```log()```](../glossary/?search=log)、 [```sqrt()```](../glossary/?search=sqrt)、[```abs()```](../glossary/?search=abs)、 [```sign()```](../glossary/?search=sign)、[```floor()```](../glossary/?search=floor)、 [```ceil()```](../glossary/?search=ceil)、[```fract()```](../glossary/?search=fract)、 [```mod()```](../glossary/?search=mod)、[```min()```](../glossary/?search=min)、 [```max()```](../glossary/?search=max)、[```clamp()```](../glossary/?search=clamp) などがあります。

さて、また上のコードで色々と実験をしてみましょう。

* 色が変わる頻度を下げて、変化にほとんど気がつかなくなるまで遅くしてみましょう。

* 変化のスピードを上げて、点滅がなくなりひとつの色に見えるまで速くしてみましょう。

* 三つのチャンネル(rgb)の変化の頻度を別々に変えて、面白いパターンを作ってみましょう。
* 3つのチャンネル(rgb)の変化の頻度を別々に変えて、面白いパターンを作ってみましょう。

## gl_FragCoord

デフォルトの出力として```vec4 gl_FragColor```を使うことができるのと同様に、GLSLにはデフォルトの入力として画面上の「フラグメント」、つまりピクセルの位置を表す```vec4 gl_FragCoord```が用意されています。```vec4 gl_FragCoord```を使うとスレッドが描画領域内のどこで作業をしているかを知ることができます。この```gl_FragCoord```はスレッドごとに異なる値を持っているためuniform変数とは呼ばず、代わりにvarying変数と呼びます。
デフォルトの出力として ```vec4 gl_FragColor``` を使うことができるのと同様に、GLSLにはデフォルトの入力として画面上の「フラグメント」、つまりピクセルの位置を表す ```vec4 gl_FragCoord``` が用意されています。```vec4 gl_FragCoord``` を使うとスレッドが描画領域内のどこで作業をしているかを知ることができます。この ```gl_FragCoord```はスレッドごとに異なる値を持っているためuniform変数とは呼ばず、代わりにvarying変数と呼びます。

<div class="codeAndCanvas" data="space.frag"></div>

上のサンプルではフラグメントの座標を描画領域全体のサイズで割ることによって正規化しています。こうすると座標値の範囲が```0.0```から```1.0```の間に収まるため、簡単にx座標とy座標の値をr(赤)とg(緑)のチャンネルに対応させることができます。
上のサンプルではフラグメントの座標を描画領域全体のサイズで割ることによって正規化しています。こうすると座標値の範囲が ```0.0``` から ```1.0``` の間に収まるため、簡単にx座標とy座標の値をr(赤)とg(緑)のチャンネルに対応させることができます。

シェーダーの世界ではデバッグに使える手段は限られています。判別しやすい色を変数の値に割り当てて確認するのは数少ない方法の一つです。GLSLのコーディングは時としてガラス瓶の中に船の模型を組み立てるのに似ています。どちらも同じくらい難しいですが、結果は美しく達成感があるものです。

![](08.png)

それでは、サンプルが理解できているか確かめてみましょう。

* 座標```(0.0,0.0)```が描画領域のどこを指すかわかりますか?
* 座標 ```(0.0,0.0)``` が描画領域のどこを指すかわかりますか?

* ```(1.0,0.0)``````(0.0,1.0)``````(0.5,0.5)``````(1.0,1.0)```はどうでしょう?
* ```(1.0,0.0)``````(0.0,1.0)``````(0.5,0.5)``````(1.0,1.0)``` はどうでしょう?

* ```u_mouse```の使い方はわかりますか? ```u_mouse```の値は正規化されていないことに注意してください。この変数を使って色を変化させることはできますか?
* ```u_mouse``` の使い方はわかりますか? ```u_mouse``` の値は正規化されていないことに注意してください。この変数を使って色を変化させることはできますか?

* ```u_time``````u_mouse```の座標を使って色のパターンを自由に変化させてみましょう。
* ```u_time``````u_mouse``` の座標を使って色のパターンを自由に変化させてみましょう。

さて、課題を終えたところで、このシェーダーの力を他にどこで使うことができるのか興味が湧いているのではないでしょうか。
次の章ではオリジナルのシェーダーをthree.js、Processing、openFrameworkで使う方法について説明します。
Loading

0 comments on commit bac200a

Please sign in to comment.