「Metalのデータ型」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
1行目: 1行目:
== スカラー型==  
+
==スカラー型==  
 
{| class="wikitable"
 
{| class="wikitable"
 
|+
 
|+
! 型
+
!型
! 概要
+
!概要
 
|-
 
|-
 
|bool
 
|bool
9行目: 9行目:
 
|-
 
|-
 
|char
 
|char
int8_t
+
| rowspan="2" |符号付き8ビット整数
|符号付き8ビット整数
+
|-
 +
|int8_t
 
|-
 
|-
 
|unsigned char
 
|unsigned char
uchar
+
| rowspan="3" |符号なし8ビット整数
 
+
|-
uint8_t
+
|uchar
|符号なし8ビット整数
+
|-
 +
|uint8_t
 
|-
 
|-
 
|short
 
|short
int16_t
+
| rowspan="2" |符号付き16ビット整数
|符号付き16ビット整数
+
|-
 +
|int16_t
 
|-
 
|-
 
|unsigned short
 
|unsigned short
ushort
+
| rowspan="3" |符号なし16ビット整数
 
+
|-
uint16_t
+
|ushort
|符号なし16ビット整数
+
|-
 +
|uint16_t
 
|-
 
|-
 
|int
 
|int
int32_t
+
| rowspan="2" |符号付き32ビット整数
|符号付き32ビット整数
+
|-
 +
|int32_t
 
|-
 
|-
 
|unsigned int
 
|unsigned int
uint
+
| rowspan="3" |符号なし32ビット整数
 
+
|-
uint32_t
+
|uint
|符号なし32ビット整数
+
|-
 +
|uint32_t
 
|-
 
|-
 
|long
 
|long
int64_t
+
| rowspan="2" |符号付き64ビット整数
|符号付き64ビット整数
 
 
Metal 2.2以降
 
Metal 2.2以降
 +
|-
 +
|int64_t
 
|-
 
|-
 
|unsigned long
 
|unsigned long
uint64_t
+
| rowspan="2" |符号なし64ビット制す
|符号なし64ビット制す
 
 
Metal 2.2以降
 
Metal 2.2以降
 +
|-
 +
|uint64_t
 
|-
 
|-
 
|half
 
|half
57行目: 65行目:
 
|-
 
|-
 
|size_t
 
|size_t
|sizeof 演算子の結果を表す符号なし整数型。実態は符号なし64ビット整数。
+
|sizeof 演算子の結果を表す符号なし整数型。
 +
実態は符号なし64ビット整数。
 
|-
 
|-
 
|ptrdiff_t
 
|ptrdiff_t
|2つのポインタを引き算した結果の符号付き整数型。実態は符号付き64ビット整数。
+
|2つのポインタを引き算した結果の符号付き整数型。
 +
実態は符号付き64ビット整数。
 
|-
 
|-
 
|void
 
|void
66行目: 76行目:
 
|}
 
|}
  
=== サフィックス ===
+
===サフィックス ===
* f または F = float, 0.5f
+
 
* h または H = half, 0.5h
+
*f または F = float, 0.5f
* u または U = uint, 2u
+
*h または H = half, 0.5h
* l または L = long, 2L
+
*u または U = uint, 2u
 +
*l または L = long, 2L
  
== ベクトル型 ==
+
==ベクトル型==
 
スカラー型名の末尾に数字(ここでは'''n'''とする)を付けるとベクトル型になる。
 
スカラー型名の末尾に数字(ここでは'''n'''とする)を付けるとベクトル型になる。
 
'''n''' には 2, 3, 4のいづれかの数字が入る。
 
'''n''' には 2, 3, 4のいづれかの数字が入る。
 
「float2」や「float3」といった感じだ。
 
「float2」や「float3」といった感じだ。
 
[[HLSL]]などと同じだな。
 
[[HLSL]]などと同じだな。
* bool'''n'''
 
* char'''n'''
 
* short'''n'''
 
* int'''n'''
 
* long'''n'''
 
* uchar'''n'''
 
* ushort'''n'''
 
* uint'''n'''
 
* ulong'''n'''
 
* half'''n'''
 
* float'''n'''
 
  
=== ベクトル型のサイズは必ず2の乗数===
+
*bool'''n'''
 +
*char'''n'''
 +
*short'''n'''
 +
*int'''n'''
 +
*long'''n'''
 +
*uchar'''n'''
 +
*ushort'''n'''
 +
*uint'''n'''
 +
*ulong'''n'''
 +
*half'''n'''
 +
*float'''n'''
 +
 
 +
===ベクトル型のサイズは必ず2の乗数===
 
Metalのベクトル型は「型のサイズは必ず2の乗数」となっている。
 
Metalのベクトル型は「型のサイズは必ず2の乗数」となっている。
  
 
たとえば、
 
たとえば、
* int = 4バイト
+
 
* int2 = 8バイト
+
*int = 4バイト
* int3 = '''16バイト''' (12バイトではない)
+
*int2 = 8バイト
* int4 = 16バイト
+
*int3 = '''16バイト''' (12バイトではない)
 +
*int4 = 16バイト
  
 
[[HLSL]]や[[GLSL]]で[[定数バッファー]]などの[[構造体]]を作る際は、その構造体のサイズを「8バイト単位」や「16バイト単位」にする必要があり、[[シェーダー]]の[[プログラミング]]の際にはその構造体のサイズを手計算で算出して、バイト数が足りない場合はダミーの変数を追加してサイズ調整が必要である。
 
[[HLSL]]や[[GLSL]]で[[定数バッファー]]などの[[構造体]]を作る際は、その構造体のサイズを「8バイト単位」や「16バイト単位」にする必要があり、[[シェーダー]]の[[プログラミング]]の際にはその構造体のサイズを手計算で算出して、バイト数が足りない場合はダミーの変数を追加してサイズ調整が必要である。

2022年6月9日 (木) 01:47時点における版

スカラー型

概要
bool true or false
char 符号付き8ビット整数
int8_t
unsigned char 符号なし8ビット整数
uchar
uint8_t
short 符号付き16ビット整数
int16_t
unsigned short 符号なし16ビット整数
ushort
uint16_t
int 符号付き32ビット整数
int32_t
unsigned int 符号なし32ビット整数
uint
uint32_t
long 符号付き64ビット整数

Metal 2.2以降

int64_t
unsigned long 符号なし64ビット制す

Metal 2.2以降

uint64_t
half 16ビット浮動小数点

IEEE 754のbinary16形式

float 32ビット浮動小数点

IEEE 754に準拠

size_t sizeof 演算子の結果を表す符号なし整数型。

実態は符号なし64ビット整数。

ptrdiff_t 2つのポインタを引き算した結果の符号付き整数型。

実態は符号付き64ビット整数。

void void

サフィックス 

  • f または F = float, 0.5f
  • h または H = half, 0.5h
  • u または U = uint, 2u
  • l または L = long, 2L

ベクトル型

スカラー型名の末尾に数字(ここではnとする)を付けるとベクトル型になる。 n には 2, 3, 4のいづれかの数字が入る。 「float2」や「float3」といった感じだ。 HLSLなどと同じだな。

  • booln
  • charn
  • shortn
  • intn
  • longn
  • ucharn
  • ushortn
  • uintn
  • ulongn
  • halfn
  • floatn

ベクトル型のサイズは必ず2の乗数

Metalのベクトル型は「型のサイズは必ず2の乗数」となっている。

たとえば、

  • int = 4バイト
  • int2 = 8バイト
  • int3 = 16バイト (12バイトではない)
  • int4 = 16バイト

HLSLGLSL定数バッファーなどの構造体を作る際は、その構造体のサイズを「8バイト単位」や「16バイト単位」にする必要があり、シェーダープログラミングの際にはその構造体のサイズを手計算で算出して、バイト数が足りない場合はダミーの変数を追加してサイズ調整が必要である。

一方、Metalでは「必ず2の乗数」になるのでそのような手計算が必要ない。 HLSLGLSLの感覚でサイズ調整すると無駄が発生するので注意すること。