MetalでMTLTextureを画面全体に表示する
Metalでid型のオブジェクトを画面いっぱいに表示したい、という時。
以前は画面からはみ出すような平面を用意し、フラグメントシェーダ内で画面上の座標を計算しそこからテクスチャ座標を得て描画していたのだが、、、
なるほど、こんなやり方があるんだな、と感心したのがAppleのサンプルコード(※1)にあった。
これをMTLPrimitiveTypeTriangleStripで描く。

↑正方形のテクスチャを表示させた結果。
人様のコードを読むのって勉強になるよね。
※1 Appleのサンプルコード↓
Creating Face-Based AR Experiences | Apple Developer Documentation
以前は画面からはみ出すような平面を用意し、フラグメントシェーダ内で画面上の座標を計算しそこからテクスチャ座標を得て描画していたのだが、、、
なるほど、こんなやり方があるんだな、と感心したのがAppleのサンプルコード(※1)にあった。
static const float kImagePlaneVertexData[16] = { -1.0, -1.0, 0.0, 1.0, 1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, };↑平面を構成する4つの頂点。x,y, u,vのデータが4つある。
これをMTLPrimitiveTypeTriangleStripで描く。
{ [renderEncoder drawPrimitives:MTLPrimitiveTypeTriangleStrip vertexStart:0 vertexCount:4]; }MTLPrimitiveTypeTriangleではないのでどの頂点を使うか、の情報も不要。なるほど!
vertex ImageColorInOut vertexFunction(ImageVertex in [[stage_in]]) { ImageColorInOut out; out.position = float4(in.position, 0.0, 1.0); out.texCoord = in.texCoord; return out; } fragment float4 fragmentFunction(ImageColorInOut in [[stage_in]], texture2d↑シェーダではこの程度の記述で画面いっぱいにテクスチャが表示されることになる。すごい!texture [[ texture(kTextureIndexColor) ]]) { constexpr sampler colorSampler(mip_filter::linear, mag_filter::linear, min_filter::linear); float4 color = float4(texture.sample(colorSampler, in.texCoord).rgb , 1.0); return color; }

↑正方形のテクスチャを表示させた結果。
人様のコードを読むのって勉強になるよね。
※1 Appleのサンプルコード↓
Creating Face-Based AR Experiences | Apple Developer Documentation
スポンサーサイト
<< GPUで何やってるのかを確認するXcodeの機能 TopPage MTLTextureDescriptorのusageを複数指定する >>
トラックバック
トラックバックURL
https://ringsbell.blog.fc2.com/tb.php/1292-269e3b3b
https://ringsbell.blog.fc2.com/tb.php/1292-269e3b3b