頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


Metalシェーダのfloat3とpacked_float3の違い

sizeof(simd_float3)=16という罠
↑ここと似たような話。ここで躓いてたので解決は早かったかもしれない。

そもそもはSCNVector3のデータ”列”をシェーダに渡したかった。1つだけではなく複数のSCNVector3を渡したい。
{
    SCNVector3 *offsets = calloc(… );//—(1)
    //(値を入れる処理)
    …

    NSData *data = [NSData dataWithBytes:offsets length:sizeof(SCNVector3)*NofVertices];
    [node.geometry.firstMaterial setValue:data forKey:@"offsets”];//—(2)
}
↑ (1)メモリ確保して、なんらかの値を入れる処理がある、とする。
(2)データ列をNSDataオブジェクトにしてそれをセットする。
ここまではよくある話。

これを頂点シェーダで受ける時に最初は下のようにして受けていた↓
…
 constant float3 *offsets [[buffer(3)]],
…
ところがこれだとなにやらおかしい。

Metal-Shading-Language-Specification
↑シェーダで使える関数とかここで見てる。
ここでfloat3について調べると、、、

リファレンスのスクショ1
↑サイズが16バイト?float3よ、お前もか、、、!
じゃあどうするの?と思って他のところを見ると

リファレンスのスクショ2
↑packed_float3というのがあってこれだと12バイトで受けてくれる。
…
//constant float3 *offsets [[buffer(3)]],
constant packed_float3 *offsets [[buffer(3)]],
uint vertexID [[vertex_id]] )
{
    float3 offset = offsets[vertexID];
    …
}
↑このように変更してSCNVector3を受け取ることができた。
スポンサーサイト

<< Objective-Cでsmoothstep関数を使いたい  TopPage  simd_float4x4の作成方法 >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
https://ringsbell.blog.fc2.com/tb.php/1279-6e9e0277




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad