#2 型と演算子

一歩出す前に

<< #1 準備
トップ
#3 HelloWorld >>

index

2019/11/20作成
2020/4/26更新


型の指定は礼儀

 マイクラの用いるシェーディング言語
glsl,hlslはC言語をベースにした言語です
float,intなどのお馴染みの型に加えて
vec,matなどの色、座標(ベクトル)の計算がしやすいような型が用意されています

glslhlsl説明
float float 浮動小数点数
float a = 1.0;
float a = 1; //これはダメ
						
int int 整数。
int a = 1;
int a = 1.0; //これはダメ
						
bool bool ブーレアンの略 ブーメランじゃないです
値はtrueまたはfalseのみ
bool a = true;
						
vec2 float2 floatが二つ集まったもの
vec2 a = vec2(1.0,1.0);
float2 a = float2(1.0,1.0);
vec2 a = vec2(1); //これはok(int→vec2への型変換)
float2 a = float2(1.0); //これはダメ
float2 a = 1.0; //hlslはfloatで入れる
						
vec3 float3 floatが三つ集まったもの
vec3 a = vec2(1.0,1.0,1.0);
float3 a = float3(1.0,1.0,1.0);
vec3 a = vec3(1); //これはok(int→vec3への型変換)
float3 a = float3(1.0); //これはダメ
float3 a = 1.0; //hlslはfloatで入れる
						
vec4 float4 floatが(ry
mat2
mat3
mat4
float2x2
float3x3
float4x4
それぞれのvecに対応する行列
mat2 a = mat2(vec2(1.0,1.0),vec2(1.0,1.0));
mat3 a = mat3(vec3(1),vec3(1),vec3(1));
float2x2 a = float2x2(float2(1.0,1.0),float2(1.0,1.0));
						

C言語と違う点は暗黙の型変換が行われないことでしょうか
floatは小数点付けないだけで動かない&見逃しがちなので注意

ここからは基本glslを使って解説していきます
断りのない限りhlslも同じなので安心してください


演算子

演算しないと始まらない ((それはそう

 ふつーに四則演算できます
()をつけない限り乗算除算が優先されます

+…加算 -…減算
*…乗算 /…除算
()…括弧 =で代入です
余りを出してくれる %は使えないみたいです…

float a = 1.0;
float b = 2.0;

a = a+b; //加算 a = 3.0;
a = a/b; //除算 a = 1.5;
a = b-a; //減算 a = 0.5;
a = b*a; //乗算 a = 1.0;

//もちろんvecも行ける
//それぞれの要素ごとに計算する
vec2 c = vec2(a, b); //c = vec2(5.0, 2.0);
vec2 d = vec2(a/b, b/a) //d = vec2(2.5, 0.4);
c = c+d; //c = vec2(7.5, 2.4);
c = c/d; //c = vec2(3.0, 6.0);
c = d-c; //c = vec2(-0.5, -5.6);
c = d*c; //c = vec2(-1.25, -2.24);

a = ((a+b)*b+5.0-a)/2.0; //a = 5.0; 括弧は全部小かっこ
			

代入演算子

 上の例の4~7行目のような処理の場合、いちいち同じ文字を書くのは
面倒臭いし読みにくいですよね?
代入演算子 += -= *= /=
を使うとその手間を省くことができます!
(後々書く関数を使うようになると使用頻度グッと下がる)
これは実際に使った方が理解早いですので
上の例をすっきりさせてみます

float a = 1.0;
float b = 2.0;

a += b; //加算 a = 3.0;
a /= b; //除算 a = 1.5;
a = b-a; //減算 a = 0.5;
a *= b; //乗算 a = 1.0;

//もちろんvecも行ける
//それぞれの要素ごとに計算する
vec2 c = vec2(a, b); //c = vec2(5.0, 2.0);
vec2 d = vec2(a/b, b/a) //d = vec2(2.5, 0.4);
c += d; //c = vec2(7.5, 2.4);
c /= d; //c = vec2(3.0, 6.0);
c = d-c; //c = vec2(-0.5, -5.6);
c *= d; //c = vec2(-1.25, -2.24);
			

6, 15行目見れば分かると思いますが
減算,除算の場合、元の式の順番大事です。 当たり前ですね


スウィズル(swizzle)演算子

 いかつい名前してますが大したことないです
はっきり言って演算子なのかも怪しいです
vec型のn番目の数字だけ取り出したい!って時に使うものです
vec型の数の後にこれを書くことで機能します

🍄 第一要素 第二要素 第三要素 第四要素
座標xyzw
rgba
ベクトルstpq

座標のwは拡大率を表すのだとか
座標の計算の時に必ずxyzの演算子を使わなくても
併用する演算子が同じ列の中のものなら大丈夫です
説明しづらいので例を

vec4 a = vec4(1.0, 2.0, 3.0, 4.0);
vec2 b = a.xy; //b = vec2(1.0, 2.0);
b = a.aa; //b = vec2(4.0, 4.0); 同じ要素を複数回使うのもok
b = a.xs; //異なる組のスウィズル演算子を使うことはできない
vec3 c = a.zxz; //b = vec3(3.0, 1.0, 3.0);
float d = b.s+c.p; //d = 4.0+1.0; つまり5.0
a = a.agbr; //a = vec4(4.0, 2.0, 3.0, 1.0); 順番の入れ替えも可能
			

予想以上に長くなったので今回はここまで
次回"Hello World"する予定です
お楽しみに!

<< #1 準備
トップ
#3 HelloWorld >>