10日目の記事は@kaiware007さんのAppendStructuredBuffer/ConsumeStructuredBufferを使ったGPUパーティクルのサンプルです。CEDEC2015においてP-MAPブレンドによる加算合成のアプローチの講演、およびサンプルプロジェクトが公開されました。ゲームではこのメダルが大量に出ますのでこの目も当てられない描画負荷に対するアプローチが必要でした。当然ではありますが、通常、半透明と加算ではスプライトのバッチングは行われずSetPassの数も増えてしまいます。大量にメダルが重なった場合は加算>半透明>加算>半透明>加算・・・とメダル数×2の描画数(=SetPass数)が発生してしまいます。Androidにおいて操作出来ないほどの処理落ちや発熱による機能低下が発生してしまいます。シンプルなアプローチ単純に「加算レイヤー」と「半透明レイヤー」に分けることでバッチングを促します。UnityスプライトではSortingLayerを使うことで簡単にレイヤー単位での描画プライオリティを作ることが出来ます。(とりあえずシェーダーはプリセットのものを使用しています)これによりメダル全体の描画を2パスに抑えることが出来ます。これはこれで悪くはないのですが、メダルの上には加算がかからないので「特別な状況感」はやや薄れてしまいます。発光>メダル>発光>メダル>発光・・・という描画を諦めることが出来ませんでした。事前乗算というアプローチ加算>半透明>加算>半透明>加算・・・という描画を現実的に実装するには同一のシェーダーで行えるようにしなればなりません。ここで掲題のP-MAPブレンドが登場します。発表されている内容にはテクスチャに手を加えないシェーダーでのブレンドもありますが開発中のゲームはモバイルで、適用対象は大量のスプライトであった為、シェーダー内での計算量は極力抑える必要がありました。事前にテクスチャを作成するP-MAPテクスチャの手法を採用しました。https://github.com/ToshiyasuMiyabe/P-MAP////////////////////////////////////////////////////////////////////////////////以下GitHubより抜粋////////////////////////////////////////////////////////////////////////////////それでは実際に扱う準備をしていきます。GitHubで公開されているプロジェクトからPMAP.csとPMAP_Maker.csを自身のプロジェクトに移しましたら、UnityのウィンドウメニューにPMAPが追加されますので選択してPMAP_Makerウィンドウを開きます。それぞれのテクスチャをドロップしてブレンド方法を選択し、それぞれ保存します。ここで一度に複数のテクスチャを登録するとテクスチャが事前に合成されます。合成してしまえる場合はしてしまった方がフィルレートやバッチングコストを抑えれますので利用すべきです。今回開発中のゲームではメダルが常時発光しているわけではないので事前合成は行いません。作成されたPMAPテクスチャのスプライトをAtlasにまとめます。※今回はUnityのSpritePackerを利用しますが別ツールでパッキングしてもいいと思います。※PMAPテクスチャのAlphaTransparentフラグはOFFにしないと正常に表示されないので注意してください。Premultiplyシェーダーを設定します。長くなりましたがこれで完成です。PMAP対応によって1Passで描画できていることが確認出来ます。[適用前][適用後]たくさん並べても1Passになっていることが確認できます。まとめ今回はCEDEC2015でナツメアタリ株式会社、宮部様が講演され、GitHubで公開されているPMAP_Makerの使用方法と実用例をご紹介しました。事例として紹介しています開発中のゲームにおいてはさらに少し手を加えて独自のツール(というよりはオレオレツールですが)とシェーダーになっていますがアプローチ方法としては今回ご紹介したP-MAPテクスチャを基にさせて頂いています。今回事例としてご紹介しました開発中のゲームは株式会社タノシマスのiOS/Android用シューティングゲームの「アカとブルー」になります。ご興味を持ってくださった方は是非動向を追って頂けましたら幸いです。https://twitter.com/tanoshimasu_comhttps://www.youtube.com/watch?v=rrfZkyd438Ihttps://www.youtube.com/watch?v=o83B-dm5JA8長々とお読みいただきましてありがとうございました。10日目の記事は@kaiware007さんの[AppendStructuredBuffer/ConsumeStructuredBufferを使ったGPUパーティクルのサンプル](http://qiita.com/kaiware007/items/fc77ab303a326123344b)です。***CEDEC2015においてP-MAPブレンドによる加算合成のアプローチの講演、およびサンプルプロジェクトが公開されました。http://cedec.cesa.or.jp/2015/session/ENG/1024.htmlhttp://www.slideshare.net/toshiyasumiyabe/cedec2015pmap今回はそのうちのテクスチャをあらかじめ準備しておく手法を用いたこのSpriteRendererのメダルの後光の加算部分での最適化事例をご紹介します。現在開発中のゲームではこのメダルが大量に出ますのでこの目も当てられない描画負荷に対するアプローチが必要でした。当然ではありますが、通常、半透明と加算ではスプライトのバッチングは行われずSetPassの数も増えてしまいます。![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/105136/0a0bc755-e254-ff6b-b321-a317c4cf4130.png)大量にメダルが重なった場合は加算>半透明>加算>半透明>加算・・・とメダル数×2の描画数(=SetPass数)が発生してしまいます。Androidにおいて操作出来ないほどの処理落ちや発熱による機能低下が発生してしまいます。#シンプルなアプローチ単純に「加算レイヤー」と「半透明レイヤー」に分けることでバッチングを促します。UnityスプライトではSortingLayerを使うことで簡単にレイヤー単位での描画プライオリティを作ることが出来ます。(とりあえずシェーダーはプリセットのものを使用しています)![キャプチャ4.PNG](https://qiita-image-store.s3.amazonaws.com/0/105136/b9cd36ed-1f3c-794a-8263-4fe62e3ec0dd.png)これによりメダル全体の描画を2パスに抑えることが出来ます。![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/105136/a53e2c4d-6332-51f2-91ca-ef25e6a8bbad.png)これはこれで悪くはないのですが、メダルの上には加算がかからないので「特別な状況感」はやや薄れてしまいます。発光>メダル>発光>メダル>発光・・・という描画を諦めることが出来ませんでした。#事前乗算というアプローチ加算>半透明>加算>半透明>加算・・・という描画を現実的に実装するには同一のシェーダーで行えるようにしなればなりません。ここで掲題のP-MAPブレンドが登場します。発表されている内容にはテクスチャに手を加えないシェーダーでのブレンドもありますが開発中のゲームはモバイルで、適用対象は大量のスプライトであった為、シェーダー内での計算量は極力抑える必要がありました。事前にテクスチャを作成するP-MAPテクスチャの手法を採用しました。https://github.com/ToshiyasuMiyabe/P-MAP////////////////////////////////////////////////////////////////////////////////以下GitHubより抜粋![キャプチャ5.PNG](https://qiita-image-store.s3.amazonaws.com/0/105136/bb56f0b5-ad0a-9736-f0e9-3b76969471a7.png)////////////////////////////////////////////////////////////////////////////////それでは実際に扱う準備をしていきます。GitHubで公開されているプロジェクトからPMAP.csとPMAP_Maker.csを自身のプロジェクトに移しましたら、UnityのウィンドウメニューにPMAPが追加されますので選択してPMAP_Makerウィンドウを開きます。それぞれのテクスチャをドロップしてブレンド方法を選択し、**それぞれ保存**します。![キャプチャ10.PNG](https://qiita-image-store.s3.amazonaws.com/0/105136/c627af8d-5478-6ab0-5a70-689aa9566092.png)![キャプチャ11.PNG](https://qiita-image-store.s3.amazonaws.com/0/105136/db4c458a-ab52-2ae4-9da7-885a59da209a.png)***ここで一度に複数のテクスチャを登録するとテクスチャが事前に合成されます。合成してしまえる場合はしてしまった方がフィルレートやバッチングコストを抑えれますので利用すべきです。今回開発中のゲームではメダルが常時発光しているわけではないので事前合成は行いません。![キャプチャ12.PNG](https://qiita-image-store.s3.amazonaws.com/0/105136/1c9610d9-601d-00ab-060c-047c7ed6dabf.png)![キャプチャ13.PNG](https://qiita-image-store.s3.amazonaws.com/0/105136/90099674-372c-c176-1d74-2359a745ee44.png)***そして作成されたPMAPテクスチャのスプライトをAtlasにまとめます。※今回はUnityのSpritePackerを利用しますが別ツールでパッキングしてもいいと思います。※PMAPテクスチャのAlphaTransparentフラグはOFFにしないと正常に表示されないので注意してください。Premultiplyシェーダーを設定します。![キャプチャ20.PNG](https://qiita-image-store.s3.amazonaws.com/0/105136/903b23bc-7064-16de-3ed8-24250570b1eb.png)長くなりましたがこれで完成です。PMAP対応によって1Passで描画できていることが確認出来ます。**[適用前]**![キャプチャ22.PNG](https://qiita-image-store.s3.amazonaws.com/0/105136/d81db330-2516-f256-a379-ed4d10acd813.png)**[適用後]**![キャプチャ21.PNG](https://qiita-image-store.s3.amazonaws.com/0/105136/3cd49943-bc24-478f-3db7-51d8ec280351.png)たくさん並べても1Passになっていることが確認できます。![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/105136/12399406-3ce3-4578-0120-ac01aa1a998e.png)#まとめ今回はCEDEC2015でナツメアタリ株式会社、宮部様が講演され、GitHubで公開されているPMAP_Makerの使用方法と実用例をご紹介しました。事例として紹介しています開発中のゲームにおいてはさらに少し手を加えて独自のツール(というよりはオレオレツールですが)とシェーダーになっていますがアプローチ方法としては今回ご紹介したP-MAPテクスチャを基にさせて頂いています。今回事例としてご紹介しました開発中のゲームは株式会社タノシマスのiOS/Android用シューティングゲームの「[アカとブルー](http://tanoshimasu.com/project)」になります。ご興味を持ってくださった方は是非動向を追って頂けましたら幸いです。https://twitter.com/tanoshimasu_comhttps://www.youtube.com/watch?v=rrfZkyd438Ihttps://www.youtube.com/watch?v=o83B-dm5JA8長々とお読みいただきましてありがとうございました。送信いただいたご意見への返信は行っておりません。お問い合わせください。