頭と尻尾はくれてやる!

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


Metalでシェーダが受けるデータの型

Objective-C++ でMetalを使う場合のお話。現時点iOS 8.0.2でのお話ね。今だけかもしれない。

こういう頂点データをシェーダに渡そうとしたのよ。なんのことはない三角形一つのデータ。
const float vertexData[] = {
    0.5, -0.5, 0.0, 
    -0.5, 0.5, 0.0, 
    -0.5, -0.5, 0.0,
};
OpenGL ESで扱ってきたデータがこういう形だからこれを渡せるとデータを作り直さなくてもいいはず。データをMetalだからって作り直すのが面倒だしねえ。
ところがどうもうまくいかない。
vertexBuffer = [device newBufferWithBytes:vertexData length:sizeof(vertexData) options:0];
てな感じでvertex buffer作る。

シェーダ側は
vertex float4 basic_vertex(device packed_float3 *vertex_array [[ buffer(0) ]] , unsigned int vid [[ vertex_id ]]) {   
	return float4(float3(vertex_array[vid]) , 1.0);
}
こんな感じでいけると思うんだけど、ダメなんだよなあ???

ところが引数の部分を自作の構造体を用意しといてそれで受けとる。
typedef struct {
    packed_float3 position;
} vertex_t;

vertex float4 basic_vertex( device vertex_t *vertex_array [[ buffer(0) ]] , unsigned int vid [[ vertex_id ]]) { 
	return float4(vertex_array[vid].position, 1.0);
}
↑こちらだといけるんだよな。どちらもpacked_float3のデータをもらってるのは同じだと思うんだけどなあ? まあうまくいってないんだから俺がなにか勘違いしてるんだろう。

Metalで表示した三角形
↑表示結果のスクショ。

ちなみに
iOS 8 Metal Tutorial with Swift: Getting Started - Ray Wenderlich
↑このチュートリアルはSwiftなんだけどこれをObjective-C++でやろうとしてたのよ。

<< Blenderの -Z Forward , Y Up の設定  TopPage  BBQでとうもろこしの丸焼きをやってみた >>

コメント


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

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/931-a0357776




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

FC2Ad