頭と尻尾はくれてやる!

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


Metalで画面ではなくMTLTextureに描く

MetalでMTKViewオブジェクトなどの画面ではなくMTLTextureに描くことを試してみた。
だいぶ昔にOpenGL ESでやった時はオフスクリーンレンダリング(※1)と言ってたかな。
以前Metalで影を表現するために光源位置から見たシーンの深度情報をMTLTextureに書き込む、というのはやったことあったのだが、その場合と異なったところなどをメモ。
{
    id <MTLTexture> outTexture;//インスタンス変数
}
-(void)setupOutTexture
{
    MTLTextureDescriptor *textureDescriptor = [MTLTextureDescriptor texture2DDescriptorWithPixelFormat:MTLPixelFormatBGRA8Unorm width:WIDTH height:HEIGHT mipmapped:NO];//—(1)
    textureDescriptor.usage = MTLTextureUsageRenderTarget;//—(2)
    outTexture = [device newTextureWithDescriptor:textureDescriptor];//—(3)
}
(1)で指定するピクセルフォーマットをカラー画像用に。深度情報を書き込んだ時はMTLPixelFormatDepth32Floatを使っていたが、今回はカラー画像なのでMTLPixelFormatBGRA8Unormで。
(2)こういうのを書け、と実行時にエラーが出たので追加。
(3)textureDescriptorからテクスチャ用バッファを作成。


MTLRenderPipelineDescriptorオブジェクト自体は画面に描こうがMTLTextureに描こうが特に変わらないが、MTLRenderPassDescriptorは出力先を画面じゃなくてMTLTextureと記述する必要がある。
{
    MTLRenderPassDescriptor *outTextureRenderPassDescriptor;//インスタンス変数
}
-(void)setupOutTextureRenderPassDescriptor
{
    outTextureRenderPassDescriptor = [MTLRenderPassDescriptor renderPassDescriptor];

    MTLRenderPassColorAttachmentDescriptor *attachment = outTextureRenderPassDescriptor.colorAttachments[0];
    attachment.texture = outTexture;
    attachment.loadAction = MTLLoadActionClear;
    attachment.storeAction = MTLStoreActionStore;
    attachment.clearColor = MTLClearColorMake(0.0f, 104.0/255.0, 5.0/255.0, 1.0f);//green
}
↑描画時にはここで作成したoutTextureRenderPassDescriptorからid <MTLRenderCommandEncoder>を作成してレンダリングする。

実行結果のスクショ

↑実行結果。テクスチャ画像におなじみのLenaを使いMTLTextureに立方体を描き、それをテクスチャとする立方体を描いている(ARKitのARFaceAnchorから立方体の位置姿勢を決めているので後方におっさんがいるけどここでは関係ない)。
なんのこっちゃ、という感じだが処理の流れは意図通りにできていることを確認した。



※1 ↓オフスクリーンレンダリング。な、なつかしい。このサイトにはホントお世話になった。
床井研究室 - 第26回 レンダリング画像をテクスチャに使う
スポンサーサイト

<< MTLTextureDescriptorのusageを複数指定する  TopPage  ARKitのface trackingはiPhoneが横向きでも可能 >>

コメント


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

トラックバック

トラックバックURL
https://ringsbell.blog.fc2.com/tb.php/1290-896126c9




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

FC2Ad