RenderTexture経由でSceneに描画してみる。
プロジェクト一式はgithubのココ。
RenderTextureでできること
- 通常はCameraのレンダリング先はScene
- Cameraのレンダリング先(targetTexture)をRenderTextureに変更できる
- レンダリング先を変更するとSceneに描かれなくなる
- SpriteFrameのテクスチャ(textture)としてRenderTextureを設定するとSceneに表示される
プロジェクト構成
- resources/images/ball4color
- Sprite表示用の画像
- scenes/Main
- メインのScene
- scripts/MainController
- TypeScriptを記述するファイル(Main用)
シーン構成
- Canvas
- プロジェクト作成時に最初から配置されているCanvas
- Main Camera
- プロジェクト作成時に最初から配置されているCamera
- SpriteTop
- 画面上部に表示するSprite(Main Camera経由でSceneにレンダリングする)
- SpriteBottom
- 画面下部に表示するSprite(CameraRender2経由でRenderTextureにレンダリングする)
- CameraRender2
- レンダリング先をRenderTextureに向けるCamera
ノードを編集する
Spriteを2つ配置する。
それぞれのSpriteの名前を「SpriteTop」、「SpriteBottom」に設定する。
Groupを2つ追加する。
それぞれのGroupの名前を「render1」、「render2」に設定する。
SpriteのGroupを変更する。
SpriteTopのGroupを「render1」、SpriteBottomのGroupを「render2」に設定する。
Main CameraのcullingMaskプロパティのrender2のチェックボックスを外す。
これによってMain Cameraがレンダリング対象とするグループからrender2が除外される。
Cameraを1つ追加する。
追加したCameraの名前を「CameraRender2」に設定する。
CameraRender2のcullingMaskプロパティのチェックボックスを「render2」だけチェックする。
コードを編集する
- 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
}
}
- RenderTextureを生成する
- CameraRender2のレンダリング対象をRenderTextureに設定する
- これによってCameraRender2のレンダリング先がSceneからRenderTextureに変更される。
- Spriteを生成してSpriteFrameにRenderTextureを設定する
補足
前のステップでCameraRender2レンダリング先がRenderTextureになっているので、ステップ3のSpriteを生成しないとSpriteBotomは画面に描画されない。(コメントアウトして実行すれば確認できる)
createSpriteFrameファンクションのなかの setFlipY(true)
を消すと上下逆さまにレンダリングされる。Cocos座標系とスクリーン座標系はYの向きが逆らしい。
コメント