main() blog

プログラムやゲーム、旅、愛する家族について綴っていきます。

【Metal】Metal Shading Language 仕様 Version2.2

Metal のシェーダー言語の仕様は以下のURLにあります。

https://developer.apple.com/metal/Metal-Shading-Language-Specification.pdf

必要なところから抜粋して翻訳してみます。

6 Metal Standard Library

この章では Metal Standard Library(MSLib)の関数について説明します。

6.1 Namespace and Header Files

MSLib関数と列挙は、metal名前空間で宣言されています。
MSLib関数で説明されているヘッダーファイル<metal_stdlib>ヘッダーが利用可能で、
MSLibでサポートされているすべての関数にアクセスできます。

6.2 Common Functions

表6.1の関数は、ヘッダー <metal_common> で定義されています。
Tはスカラーまたはベクトル浮動小数点型です。

ビルトイン共通関数 説明
T clamp(T x, T minval, T maxval) fmin(fmax(x, minval), maxval) を返す。
minval>maxvalの場合、結果は未定義。
T mix(T x, T y, T a) xとyの線形ブレンドの値を返す。
x +(y – x)* a

aは0.0から1.0の範囲の値でなければならない。
0.0から1.0の範囲でない場合は戻り値は未定義。
T saturate(T x) 指定された値を0.0から1.0の範囲内にクランプする。
T sign(T x) x> 0の場合は1.0、x = -0.0の場合は-0.0、x = +0.0の場合は+0.0、またはx <0の場合は-1.0を返す。
xがNaNの場合は0.0を返す。
T smoothstep(T edge0, T edge1m T x) x <= edge0の場合は0.0を、x >= edge1の場合は1.0を返す。
edge0 < x <edge1の場合はエルミート補間を実行し、0から1の値を返す。

以下と同等。
t = clamp( (x – edge0) / (edge1 – edge0), 0, 1);
return t * t * (3 – 2 * t);

edge0> = edge1の場合、またはx、edge0もしくはedge1がNaNの場合は結果は未定義。
T step(T edge, T x) x < edgeの場合は0.0を返し、それ以外の場合は1.0を返す。

6.3 Integer Functions

ビルトイン整数関数 説明
T abs(T x) |x|を返す。
Tu absdiff(T x, T y) 剰余オーバーフローなしで|x-y|を返す。
T addsat(T x, T y) x+yのsaturateした結果を返す。
T clamp(T x, T minval, T maxval) min(max(x, minval), maxval)を返す。

minval > maxvalの場合、結果は未定義。
T clz(T x) 最上位ビット位置から開始して、xの先頭の0ビットの数を返す。
T ctz(T x) xの末尾の0ビットの数を返す。
T extract_bits(T x, uint offset, uint bits)
T hadd(T x, T y) (x + y) >> 1を返す。
The intermediate sum does not modulo overflow.
T insert_bits(T base, T insert, uint offset, uint bits)
T32 mad24(T32 x, T32 y, T32 z)
T madhi(T a, T b, T c) mulhi(a, b) + cを返す。
T madsat(T a, T b, T c) a * b + cのsaturateした結果を返す。
T max(T x, T y) x < yの場合はyを返し、それ以外の場合はxを返す。
T max3(T x, T y, T z) max(x, max(y, z))を返す。
T median3(T x, T y, T z)
T min(T x, T y) y < xの場合はyを返し、それ以外の場合はxを返す。
T min3(T x, T y, T z) min(x, min(y, z))を返す。
T32 mul24(T32 x, T32 y)
T mulhi(T x, T y) x * yを計算し、xとyの積の上位半分を返す。
T popcount(T x) xの非ゼロビットの数を返す。
T reverse_bits(T x)
T rhadd(T x, T y) (x + y + 1) >> 1を返す。
The intermediate sum does not modulo overflow.
T rotate(T v, T i)
T subsat(T x, T y) x – yのsaturateした結果を返す。

6.4 Relational Functions

ビルトイン共通関数 説明
bool all(Tb x) xのすべてのコンポーネントがtrueの場合にのみtrueを返す。
bool any(Tb x) xのいずれかのコンポーネントがtrueの場合にのみtrueを返す。
Tb isfinite(T x) 有限値をテストする。
Tb isinf(T x) 無限値(正または負)をテストする。
Tb isnan(T x) NaNのテスト。
Tb isnormal(T x)
Tb isordered(T x, T y)
Tb isunordered(T x, T y)
Tb not(Tb x) xのコンポーネント単位の論理補数を返す。
T select(T a, T b, Tb c)
Ti select(Ti a, Ti b, Tb c)
ベクトル型の各コンポーネントについて
result [i] = c [i]? b [i]:a [i]

スカラー型の場合
result = c? b:a
Tb signbit(T x) 符号ビットをテスト。

xの浮動小数点値に符号ビットが設定されている場合はtrueを返す。
それ以外の場合はfalseを返す。

6.5 Math Functions

ビルトイン数学関数 説明
T acos(T x) xの逆余弦を計算。
T acosh(T x) xの逆双曲線余弦を計算。
T asin(T x) xの逆正弦を計算。
T asinh(T x) xの逆双曲線正弦を計算。
T atan(T y_over_x) xの逆正接を計算。
T atan2(T y, T x) xに対するyの逆正接を計算。
T atanh(T x) xの双曲線逆正接を計算。
T ceil(T x) xを整数値に丸める。
T copysign(T x, T y)
T cos(T x) xの余弦を計算。
T cosh(T x) xの双曲線余弦を計算。
T cospi(T x) cos(πx)を計算。
T divide(T x, T y) x / yを計算。
T exp(T x) eが底の指数関数。
T exp2(T x) 2が底の指数関数。
T exp10(T x) 10が底の指数関数。
T fabs(T x)
T abs(T x)
浮動小数点数の絶対値を計算。
T fdim(T x, T y)
T floor(T x)
T fma(T a, T b, T c)
T fmax(T x, T y)
T max(T x, T y)
fmax(x, fmax(y, z))を返す。
T fmax3(T x, T y, T z)
T max3(T x, T y, T z)
T fmedian3(T x, T y, T z)
T median3(T x, T y, T z)
T fmin(T x, T y)
T min(T x, T y)
T fmin3(T x, T y, T z)
T min3(T x, T y, T z)
fmin(x, fmin(y, z))を返す。
T fmod(T x, T y) x – y * trunc(x / y)を返す。
T fract(T x)
T frexp(T x, Ti &exponent)
Ti ilogb(T x)
T ldexp(T x, Ti k)
T log(T x) xの自然対数を計算。
T log2(T x) xの2を底とする対数を計算。
T log10(T x) xの10を底とする対数を計算
T modf(T x, T &intval)
T pow(T x, T y) xのy乗を計算。
T powr(T x, T y) x >= 0の時、xのy乗を計算。
T rint(T x)
T round(T x)
T rsqrt(T x) xの逆平方根を計算。
T sin(T x) xの正弦を計算。
T sincos(T x, T &cosval)
T sinh(T x) xの双曲線正弦を計算。
T sinpi(T x) sin(πx)を計算。
T sqrt(T x) xの平方根を計算。
T tan(T x) xの正接を計算。
T tanh(T x) xの双曲線正接を計算。
T tanpi(T x) tan(πx)を計算。
T trunc(T x) xを整数値に丸める。
定数名 説明
MAXFLOAT
HUGE_VALF
INFINITY
NAN
M_E_F
M_LOG2E_F
M_LOG10E_F
M_LN2_F
M_LN10_F
M_PI_F
M_PI_2_F
M_PI_4_F
M_1_PI_F
M_2_PI_F
M_2_SQRTPI_F
M_SQRT2_F
M_SQRT1_2_F
定数名 説明
MAXHALF
M_E_H
M_LOG2E_H
M_LOG10E_H
M_LN2_H
M_LN10_H
M_PI_H
M_PI_2_H
M_PI_4_H
M_1_PI_H
M_2_PI_H
M_2_SQRTPI_H
M_SQRT2_H
M_SQRT1_2_H

6.6 Matrix Functions

ビルトインマトリクス関数 説明
float determinant(floatnxn)
half determinant(halfnxn)
floatmxn transpose(floatnxm)
halfmxn transpose(halfnxm)

6.7 Geometric Functions

ビルトイン幾何関数 説明
T cross(T x, T y) xとyの外積を返す。

Tは3成分のベクトル型でなければならない。
Ts distance(T x, T y) xとyの間の距離を返す。
Ts distance_squared(T x, T y) xとyの間の距離の2乗を返す。
Ts dot(T x, T y) xとyの内積を返す。
T faceforward(T N, T I, T Nref) dot(Nref, I) < 0.0はNを返し、それ以外は–Nを返す。
Ts length(T x) ベクトルxの長さを返す。
Ts length_squared(T x) ベクトルxの長さの2乗を返す。
T normalize(T x) xと同じ方向で長さが1のベクトルを返す。
T reflect(T I, T N) 入射ベクトルIと表面方向Nについて、正規化されたN(NN)を計算し、反射方向を返す。
I – 2 * dot(NN, I) * NN
T refract(T I, T N, Ts eta) 入射ベクトルIと表面法線N、および屈折率etaの屈折ベクトルを返す。

6.8 Compute Functions

6.9 Graphics Functions

6.10 Texture Functions

6.11 Imageblock Functions

6.12 Pack and Unpack Functions

6.13 Atomic Functions

6.14 Encoding Commands for Indirect Command Buffers

6.15 Variable Rasterization Rate

7 Numerical Compliance

7.1 INF, NaN, and Denormalized Numbers

7.2 Rounding Mode

7.3 Floating-Point Exceptions

7.4 Relative Error as ULPs

7.5 Edge Case Behavior in Flush to Zero Mode

7.6 Conversion Rules for Floating-Point and Integer Types

7.7 Texture Addressing and Conversion Rules

7.7.1 Conversion Rules for Normalized Integer Pixel Data Types
7.7.2 Conversion Rules for Half-Precision Floating-Point Pixel Data Type
7.7.3 Conversion Rules for Single-Precision Floating-Point Pixel Data Type
7.7.4 Conversion Rules for 10- and 11-bit Floating-Point Pixel Data Type
7.7.5 Conversion Rules for 9-bit Floating-Point Pixel Data Type with a 5-bit Exponent
7.7.6 Conversion Rules for Signed and Unsigned Integer Pixel Data Types
7.7.7 Conversion Rules for sRGBA and sBGRA Textures

Xcodeで実行時に必要なdylibなどをコピーする方法

GLEWやSDLなどのライブラリをdylibでプロジェクトに組み込んだ場合、
Xcodeで実行するに際に実行ファイルと同じ場所にdylibがないと実行時にエラーになる。

そのような場合にXcodeで実行時に実行ファイルと同じフォルダにdylibをコピーするには以下の方法で行える。

[Build Phase] → [Run Script] に以下のシェルスクリプトを記述する。

if [ -d "$BUILD_DIR/Debug" ]; then
    cp "$SRCROOT"/GLEW/lib/mac/*.dylib $BUILD_DIR/Debug
    cp "$SRCROOT"/SDL/lib/mac/*.dylib $BUILD_DIR/Debug
fi

if [ -d "$BUILD_DIR/Release" ]; then
    cp "$SRCROOT"/GLEW/lib/mac/*.dylib $BUILD_DIR/Release
    cp "$SRCROOT"/SDL/lib/mac/*.dylib $BUILD_DIR/Release
fi

f:id:takezoh_1127:20190831004045p:plain

Xcodeで実行時の作業ディレクトリの変更方法

Xcodeでデバッガで実行した際のファイルの読み込みの作業ディレクトリは以下の方法で変更できる。

1.Xcodeのメニューバーの [Product] → [Scheme] → [Edit Scheme] を開く。

f:id:takezoh_1127:20190830000913p:plain

2.[Run] の [Options] を選択。
3.その中のWorking Directory の Use custom working directory: にチェックを入れる。
4.その下の項目にデータを読み込ませるパスを指定する。
 例えばプロジェクト直下から読みたい場合は、環境変数の $(SRCROOT) を指定することで読み込むことができる。

f:id:takezoh_1127:20190830000930p:plain

*.xcodeprojのあるディレクトリで以下のコマンドを実行すると環境変数を確認することができる。

xcodebuild -showBuildSettings

XcodeでARCの有効/無効を設定する方法

Xcodeはデフォルトでプロジェクト全体の設定でARCが有効になっている。

ファイル単位でARCの設定を行う

プロジェクト内で特定のファイルのみARCの設定を変更したい場合、以下の設定を行う。

1.各ファイルの [Build Phase] → [Compile Source] を開く
2.ARCを無効にしたいファイルを選択してエンターキーもしくはダブルクリックする
3.入力欄が表示されるので無効にする場合は -fno-objc-arc と入力する
(※有効にする場合は -fobjc-arc と入力する)

f:id:takezoh_1127:20190829233002p:plain

プロジェクト全体でARCの設定を行う

プロジェクト全体のARCの設定は [Build Setting] → [Apple Clang - Language - Objective-C] の
"Objective-C Automatic Reference Counting"で変更できる。

f:id:takezoh_1127:20190829233045p:plain

【貢茶・ゴンチャ】やっぱり美味しい!定番の『ブラックミルクティー』がオススメ!

今回はペリエ千葉店の「ゴンチャ」に行ってきました!

 

前回飲んだストロベリーフレーバーを飲もう思ったのですが、人気がすごくて(少なくとも千葉店では)売り切れていました。

 

なので今回は定番の「ブラックミルクティー + パール(タピオカ)」を注文しました!

 

f:id:takezoh_1127:20190424023708j:plain

 

 

 

 

定番のミルクティーは氷「少なめ」、甘さ控えめの「少なめ」、それに「パール」の組み合わせがやはり美味しい!

 

f:id:takezoh_1127:20190424023933j:image

 

f:id:takezoh_1127:20190424023951j:image

 

さらに今回は「ピーチ阿里山ティーエイド」と「マンゴージュース」も買って帰りました。

 

ピーチ阿里山ティーエイドは甘酸っぱい感じの味がしますが、かなりさっぱりしていて、こちらもパールとの相性が抜群でとても美味しいです!

 

f:id:takezoh_1127:20190424024005j:image

 

ペリエ千葉店は相変わらず混んでいて、店の横まで行列ができています。

それでも20分ぐらい並んで買うことができました。

 

f:id:takezoh_1127:20190424024022j:image

 

期間限定のストロベリーフレーバーが楽しめなかったは残念ですが、まだまだ試していない味もたくさんあるのでまた行きたいと思います。

 

  

www.main-function.com

 

 

 

 

 

 

 

【貢茶・ゴンチャ】期間限定!人気のストロベリーフレーバー再び!『ストロベリーミルクティー』飲んでみました!

2019/3/20にゴンチャの期間限定でストロベリーフレーバーの『ストロベリーブラックエード』『ストロベリーミルクティー』『ストロベリーミルクフォーム』が発売されました!

 

f:id:takezoh_1127:20190418235550j:plain

 

www.gongcha.co.jp

 

ストロベリーシリーズを昨年、期間限定で販売したところ人気が高かったということで、今年も販売となりました!

今回は『ストロベリーミルクティ』を頂いてみます!

 

ストロベリーフレーバーですので、甘さは控え目の「少なめ」、氷も「少なめ」、もちろんトッピングは「パール(タピオカ)」を選択。

 

甘さを控え目にすることで香り高いブラックティーのほろ苦い味わいとストロベリーの甘さ、優しい甘さの「パール」との相性が抜群です。

 

f:id:takezoh_1127:20190418235819j:image

 

今回は新宿東南口店に行ってきましたが、雨が降っていたのと、9時近い時間だったためか人が殆ど並んでおらず、すぐに購入することができました。

 

f:id:takezoh_1127:20190418235842j:image

 

最近、千葉駅にもできたのですが、そちらは平日の夜でも常に行列です。

今度は千葉駅も寄ってみたいと思います。

 

 

ストロベリーフレーバーは期間限定のことですので、試したい方はお早めに!

 

www.gongcha.co.jp

 

 

【Metal】mtlppをビルドしてみる

mtlppとはAppleのOSで動作するオーバーヘッドの小さいローレベル(low level)のグラフィックスAPIのMetalのC++ラッパーである。

github.com

MetalはObjective-CかSwiftのAPIは用意されているが、C++でのAPIは用意されていない。 mtlppはObjective-Cで実装し、C++から呼び出せる様にしている。

UnrealEngineでも使用されている模様...

とりあえずビルドしてみる。

GitHubからCloneもしくはダウンロードする。

今回はダウンドードした環境でビルドしてみる。 ターミナルから展開した環境にディレクトリに移動する。

scripts/以下に移動して以下のシェルスクリプトを実行する。

$ ./build_osx.sh

ビルドが開始される。

++ dirname ./build_osx.sh
+ cd .
+ [[ '' == \a\r\m ]]
+ build_mac 10.9
+ local ver=10.9
+ local output=../.build/macos_10.9
+ local 'objcflags=-std=c++11 -x objective-c++ -mmacosx-version-min=10.9'
+ local 'cppflags=-std=c++11 -mmacosx-version-min=10.9'
+ local 'ldflags=-framework Metal -framework MetalKit -framework Cocoa -framework CoreFoundation -fobjc-link-runtime'
+ rm -Rf ../.build/macos_10.9
+ mkdir -p ../.build/macos_10.9
+ clang++ -std=c++11 -x objective-c++ -mmacosx-version-min=10.9 -c ../mtlpp.mm -o ../.build/macos_10.9/mtlpp.o
+ clang++ -std=c++11 -x objective-c++ -mmacosx-version-min=10.9 -c ../examples/window_macos.mm -o ../.build/macos_10.9/window.o
+ clang++ -std=c++11 -mmacosx-version-min=10.9 -framework Metal -framework MetalKit -framework Cocoa -framework CoreFoundation -fobjc-link-runtime ../examples/00_init.cpp ../.build/macos_10.9/mtlpp.o -o ../.build/macos_10.9/00_init
+ clang++ -std=c++11 -mmacosx-version-min=10.9 -framework Metal -framework MetalKit -framework Cocoa -framework CoreFoundation -fobjc-link-runtime ../examples/01_clear.cpp ../.build/macos_10.9/mtlpp.o -o ../.build/macos_10.9/01_clear
+ clang++ -std=c++11 -mmacosx-version-min=10.9 -framework Metal -framework MetalKit -framework Cocoa -framework CoreFoundation -fobjc-link-runtime ../examples/02_triangle.cpp ../.build/macos_10.9/mtlpp.o -o ../.build/macos_10.9/02_triangle
+ clang++ -std=c++11 -mmacosx-version-min=10.9 -framework Metal -framework MetalKit -framework Cocoa -framework CoreFoundation -fobjc-link-runtime ../examples/03_compute.cpp ../.build/macos_10.9/mtlpp.o -o ../.build/macos_10.9/03_compute
+ clang++ -std=c++11 -mmacosx-version-min=10.9 -framework Metal -framework MetalKit -framework Cocoa -framework CoreFoundation -fobjc-link-runtime ../examples/04_window.cpp ../.build/macos_10.9/mtlpp.o ../.build/macos_10.9/window.o -o ../.build/macos_10.9/04_window

    :
    :

+ build_mac 10.12
+ local ver=10.12
+ local output=../.build/macos_10.12
+ local 'objcflags=-std=c++11 -x objective-c++ -mmacosx-version-min=10.12'
+ local 'cppflags=-std=c++11 -mmacosx-version-min=10.12'
+ local 'ldflags=-framework Metal -framework MetalKit -framework Cocoa -framework CoreFoundation -fobjc-link-runtime'
+ rm -Rf ../.build/macos_10.12
+ mkdir -p ../.build/macos_10.12
+ clang++ -std=c++11 -x objective-c++ -mmacosx-version-min=10.12 -c ../mtlpp.mm -o ../.build/macos_10.12/mtlpp.o
+ clang++ -std=c++11 -x objective-c++ -mmacosx-version-min=10.12 -c ../examples/window_macos.mm -o ../.build/macos_10.12/window.o
+ clang++ -std=c++11 -mmacosx-version-min=10.12 -framework Metal -framework MetalKit -framework Cocoa -framework CoreFoundation -fobjc-link-runtime ../examples/00_init.cpp ../.build/macos_10.12/mtlpp.o -o ../.build/macos_10.12/00_init
+ clang++ -std=c++11 -mmacosx-version-min=10.12 -framework Metal -framework MetalKit -framework Cocoa -framework CoreFoundation -fobjc-link-runtime ../examples/01_clear.cpp ../.build/macos_10.12/mtlpp.o -o ../.build/macos_10.12/01_clear
+ clang++ -std=c++11 -mmacosx-version-min=10.12 -framework Metal -framework MetalKit -framework Cocoa -framework CoreFoundation -fobjc-link-runtime ../examples/02_triangle.cpp ../.build/macos_10.12/mtlpp.o -o ../.build/macos_10.12/02_triangle
+ clang++ -std=c++11 -mmacosx-version-min=10.12 -framework Metal -framework MetalKit -framework Cocoa -framework CoreFoundation -fobjc-link-runtime ../examples/03_compute.cpp ../.build/macos_10.12/mtlpp.o -o ../.build/macos_10.12/03_compute
+ clang++ -std=c++11 -mmacosx-version-min=10.12 -framework Metal -framework MetalKit -framework Cocoa -framework CoreFoundation -fobjc-link-runtime ../examples/04_window.cpp ../.build/macos_10.12/mtlpp.o ../.build/macos_10.12/window.o -o ../.build/macos_10.12/04_window

ビルドされた実行ファイルは .build/以下に出力されている。

drwxr-xr-x  12 xxxxx  staff     384  3 25 18:57 .
drwxr-xr-x   8 xxxxx  staff     256  9 24  2018 ..
drwxr-xr-x   6 xxxxx  staff     192  3 25 18:59 .build
-rwxr-xr-x@  1 xxxxx  staff      17  1 23  2018 .gitignore
-rwxr-xr-x@  1 xxxxx  staff     418  1 23  2018 .travis.yml
-rwxr-xr-x@  1 xxxxx  staff    1078  1 23  2018 LICENSE
-rwxr-xr-x@  1 xxxxx  staff    1624  1 23  2018 README.md
drwxr-xr-x  10 xxxxx  staff     320  3 25 18:57 examples
-rwxr-xr-x@  1 xxxxx  staff   96835  1 23  2018 mtlpp.hpp
-rwxr-xr-x@  1 xxxxx  staff  164269  1 23  2018 mtlpp.mm
drwxr-xr-x   5 xxxxx  staff     160  3 25 18:57 scripts
drwxr-xr-x  56 xxxxx  staff    1792  3 25 18:57 src

OSのバージョン毎にビルドされている。

drwxr-xr-x   6 xxxxx  staff  192  3 25 18:59 .
drwxr-xr-x  12 xxxxx  staff  384  3 25 18:57 ..
drwxr-xr-x   9 xxxxx  staff  288  3 25 18:59 macos_10.10
drwxr-xr-x   9 xxxxx  staff  288  3 25 18:59 macos_10.11
drwxr-xr-x   9 xxxxx  staff  288  3 25 18:59 macos_10.12
drwxr-xr-x   9 xxxxx  staff  288  3 25 18:59 macos_10.9

$ cd ./macos_10.12

drwxr-xr-x  9 xxxxx  staff     288  3 25 18:59 .
drwxr-xr-x  6 xxxxx  staff     192  3 25 18:59 ..
-rwxr-xr-x  1 xxxxx  staff  236408  3 25 18:59 00_init
-rwxr-xr-x  1 xxxxx  staff  241120  3 25 18:59 01_clear
-rwxr-xr-x  1 xxxxx  staff  241656  3 25 18:59 02_triangle
-rwxr-xr-x  1 xxxxx  staff  240696  3 25 18:59 03_compute
-rwxr-xr-x  1 xxxxx  staff  250108  3 25 18:59 04_window
-rw-r--r--  1 xxxxx  staff  296820  3 25 18:59 mtlpp.o
-rw-r--r--  1 xxxxx  staff   16712  3 25 18:59 window.o

04_windowを実行してみる。

$ ./04_window

以下の画面が表示されることを確認。

f:id:takezoh_1127:20190325193243p:plain

以上がmtlppのビルドと実行確認の方法。