頭と尻尾はくれてやる!

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


MetalでMTLTextureを画面全体に表示する

Metalでid型のオブジェクトを画面いっぱいに表示したい、という時。
以前は画面からはみ出すような平面を用意し、フラグメントシェーダ内で画面上の座標を計算しそこからテクスチャ座標を得て描画していたのだが、、、
なるほど、こんなやり方があるんだな、と感心したのが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




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

FC2Ad