CocosCreatorのRenderTextureを使ってみる

cocoscreator

RenderTexture経由でSceneに描画してみる。
プロジェクト一式はgithubのココ

RenderTextureでできること

  • 通常はCameraのレンダリング先はScene
  • Cameraのレンダリング先(targetTexture)をRenderTextureに変更できる
  • レンダリング先を変更するとSceneに描かれなくなる
  • SpriteFrameのテクスチャ(textture)としてRenderTextureを設定するとSceneに表示される

プロジェクト構成

  1. resources/images/ball4color
    • Sprite表示用の画像
  2. scenes/Main
    • メインのScene
  3. scripts/MainController
    • TypeScriptを記述するファイル(Main用)

シーン構成

  1. Canvas
    • プロジェクト作成時に最初から配置されているCanvas
  2. Main Camera
    • プロジェクト作成時に最初から配置されているCamera
  3. SpriteTop
    • 画面上部に表示するSprite(Main Camera経由でSceneにレンダリングする)
  4. SpriteBottom
    • 画面下部に表示するSprite(CameraRender2経由でRenderTextureにレンダリングする)
  5. CameraRender2
    • レンダリング先をRenderTextureに向けるCamera

ノードを編集する

Spriteを2つ配置する。
それぞれのSpriteの名前を「SpriteTop」、「SpriteBottom」に設定する。

Scene
Node Tree

Groupを2つ追加する。
それぞれのGroupの名前を「render1」、「render2」に設定する。

Project Setting

SpriteのGroupを変更する。
SpriteTopのGroupを「render1」、SpriteBottomのGroupを「render2」に設定する。

SpriteTop
SpriteBottom

Main CameraのcullingMaskプロパティのrender2のチェックボックスを外す。
これによってMain Cameraがレンダリング対象とするグループからrender2が除外される。

Cameraを1つ追加する。
追加したCameraの名前を「CameraRender2」に設定する。
CameraRender2のcullingMaskプロパティのチェックボックスを「render2」だけチェックする。

Node Tree
CameraRender2

コードを編集する

  • Scriptを1つ追加する。
  • 追加したScriptの名前を「MainController」に設定する。
  • Scriptのコードは以下の通り。
const {ccclass, property} = cc._decorator;

@ccclass
export default class MainController extends cc.Component {

    // LIFE-CYCLE CALLBACKS:

    onLoad () {

        // 0. getting canvas properties
        let { x: canvasX, y: canvasY, width: canvasWidth, height: canvasHeight } = cc.Canvas.instance.node

        // 1. creating RenderTexture
        let renderTexture = this.createRenderTexture(canvasWidth, canvasHeight)

        // 2. changing targetTexture property (rendering destination)
        //    before: Scene, afer: RenderTexture
        let camera = this.node.getChildByName("CameraRender2").getComponent(cc.Camera)
        camera.targetTexture = renderTexture

        // 3. showing RenderTexture via Sprite.spriteFrame
        let sprite = this.createSprite(canvasX, canvasY, canvasWidth, canvasHeight, renderTexture)
    }

    start () {}

    update (dt) {}

    // PRIVATE FUNCTIONS:

    private createRenderTexture(width: number, height: number) : cc.RenderTexture {
        let renderTexture = new cc.RenderTexture()
        renderTexture.initWithSize(width, height)
        return renderTexture
    }

    private createSprite(x: number, y: number, width: number, height: number, renderTexture: cc.RenderTexture): cc.Sprite {
        let sprite = this.node.addComponent(cc.Sprite)
        sprite.node.width = width
        sprite.node.height = height
        sprite.spriteFrame = this.createSpriteFrame(renderTexture)
        return sprite
    }

    private createSpriteFrame(renderTexture: cc.RenderTexture): cc.SpriteFrame {
        let spriteFrame = new cc.SpriteFrame()
        spriteFrame.setFlipY(true)
        spriteFrame.setTexture(renderTexture)
        return spriteFrame
    }
}
  1. RenderTextureを生成する
  2. CameraRender2のレンダリング対象をRenderTextureに設定する
    • これによってCameraRender2のレンダリング先がSceneからRenderTextureに変更される。
  3. Spriteを生成してSpriteFrameにRenderTextureを設定する
実行結果

補足

前のステップでCameraRender2レンダリング先がRenderTextureになっているので、ステップ3のSpriteを生成しないとSpriteBotomは画面に描画されない。(コメントアウトして実行すれば確認できる)

createSpriteFrameファンクションのなかの setFlipY(true)を消すと上下逆さまにレンダリングされる。Cocos座標系とスクリーン座標系はYの向きが逆らしい。

コメント

タイトルとURLをコピーしました