忍者ブログ
  • 2024.04
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 2024.06
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

【2024/05/17 18:21 】 |
無題
RenderTexture のインスタンスを作る

texture->begin();
node->visit();
texture->end();

RenderTextureは、「ノード」を描画する。「画面」を描画するわけではない。
描画したい「ノード」(以降、ターゲットノードと呼ぶ)を、通常のdrawと同様に行うだけ。
だから、ターゲットノードに、setPosition()が入っていると、その分描画がずれてしまう。

これをRenderTextureのメソッドで修正するのは、ちょっと考え方が違うし、やりにくい
(setVirtualViewport()で変更できるが。後述)

簡単な対処として、
描画前にターゲットノードにsetPosition(0,0)を行い、
描画が終わってから元の座標を再代入することが考えられる…(A)

少しスマートな方法として、ターゲットノードは、その上にダミーノードを作り、
ダミーノードにsetPosition()をしておき、描画したいノードそのものにはsetPosition()しないのが良いと思われる…(B)

が、このやり方でも問題が。
renderするとなぜか、ノードが画面(親ノードではない)の左下隅に移動してしまうという問題が起きた

原因は詳しく追っていないが、
想像できるのは
OpenGLのビューポート指定が(0,0,w,h)の形であり、
これだと画面の左下を切り取って描画する形になっている。
それに合わせるため、ノードを画面左下に配置して描画しているということだろうか
実際、上記の(A)の時は、この問題が起きていない。描画後にsetPosition()をしているからだろうか。


結局、
「ターゲットノードと同じものをもう一度作り、それを描画する」
という形に落ち着いた。一番無駄な形に…



RenderTexture.cpp

//calculate viewport
{
Rect viewport;
viewport.size.width = _fullviewPort.size.width;
viewport.size.height = _fullviewPort.size.height;
float viewPortRectWidthRatio = float(viewport.size.width)/_fullRect.size.width;
float viewPortRectHeightRatio = float(viewport.size.height)/_fullRect.size.height;
viewport.origin.x = (_fullRect.origin.x - _rtTextureRect.origin.x) * viewPortRectWidthRatio;
viewport.origin.y = (_fullRect.origin.y - _rtTextureRect.origin.y) * viewPortRectHeightRatio;
//glViewport(_fullviewPort.origin.x, _fullviewPort.origin.y, (GLsizei)_fullviewPort.size.width, (GLsizei)_fullviewPort.size.height);
glViewport(viewport.origin.x, viewport.origin.y, (GLsizei)viewport.size.width, (GLsizei)viewport.size.height);
}

PR
【2016/02/04 17:22 】 | cocos2d-x | 有り難いご意見(0)
<<AndroidStudioでcocos2d-xのプロジェクトを動かした話 | ホーム | アドフリ君実装感>>
有り難いご意見
貴重なご意見の投稿














<<前ページ | ホーム | 次ページ>>