GLS Developer's BBS
  新規投稿 ┃ ツリー表示 ┃ 一覧表示 ┃ トピック表示 ┃ 検索 ┃ 設定 ┃ ホーム  
6 / 17 ツリー ←次へ | 前へ→

クリッピング画像のテクスチャ利用 knockedout 04/1/31(土) 1:04
┗ Re:クリッピング画像のテクスチャ利用 L.Entis(開発者) 04/1/31(土) 14:15
 ┗ Re:クリッピング画像のテクスチャ利用 knockedout 04/2/1(日) 0:25
  ┗ Re:クリッピング画像のテクスチャ利用 L.Entis(開発者) 04/2/1(日) 9:06
   ┗ Re:クリッピング画像のテクスチャ利用 knockedout 04/2/1(日) 17:25
    ┗ Re:クリッピング画像のテクスチャ利用 L.Entis(開発者) 04/2/1(日) 21:52

クリッピング画像のテクスチャ利用
 knockedout  - 04/1/31(土) 1:04 -

引用なし
パスワード
   ある画像からクリッピングした画像をテクスチャとして使用したいのですが

E3D_RENDER_PARAM    rp ;
::eslFillMemory( &rp, 0, sizeof(rp) ) ;

EGLImage SrcImage;
EGLImage ClippedImage;
ClippedImage.SetImageView(SrcImage.GetInfo(), ptRect);
rp.pSrcImage = ClippedImage.GetInfo();

if (!m_hRenderPoly->PrepareRenderParam( &rp ) )
{
    m_hRenderPoly->RenderPolygon( ) ;
}

このようにしてPrepareRenderParamを動かしたところfalseが返ります。

こういった場合どのようにすればよろしいでしょうか
<Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; i-NavFourF)@YahooBB219015025008.bbtec.net>

Re:クリッピング画像のテクスチャ利用
 L.Entis(開発者)  - 04/1/31(土) 14:15 -

引用なし
パスワード
   こんにちは、L.Entis です。

▼knockedoutさん:
> ある画像からクリッピングした画像をテクスチャとして使用したいのですが
> このようにしてPrepareRenderParamを動かしたところfalseが返ります。

え〜〜と、上のコードですととりあえず2点、問題があるように思えます。
一つは、テクスチャ画像に使えるのは eglCreateImageBuffer 関数などで生成された画像バッファのみなので、クリップした生成した EGL_IMAGE_INFO 構造体を渡すとダメなのです。(クリップして生成した構造体の dwInfoSize は sizeof(EGL_IMAGE_INFO) になっていると思いますが、egCreateImageBuffer 関数や eslDuplicateImage〜などで生成したバッファの dwInfoSize は少し大きな値になっていると思います。増えた部分に最適化のための情報が設定されています)
このような場合には、テクスチャの頂点のUV座標を指定することによって部分領域を指定するようにしてください。
で、もう一つの問題点は rp.dwFlags に E3DRP_RENDER_REV_IMAGE を指定しないのに、それ以外のパラメータを省略してしまっていることですが、…えっと、単に全部コピペすると長くなるからしなかったのであれば問題ありません。
因みに、rp.rgbaColor.rgbMul には白色を指定するようにしておかないと、どんなテクスチャ画像でも真っ黒になってしまいます。

で、クリップ画像を描画する方法ですが、rp.dwFlags に E3DRP_RENDER_REV_IMAGE を指定した場合には、rp.pSrcImage に元の画像(ReadImageFile 関数で読み込んだり CreateImage 関数で生成したものなど)を指定し、rp.rev.nViewVertexes, rp.rev.nViewVertexes メンバをつかってクリップして表示したい領域を囲んだ凹でない多角形を指定すれば実現できますので、元の画像バッファへのポインタと矩形情報を管理しておけば良いのではないでしょうか?

もう一つは、クリップして出来た EGLImage を DuplicateImage 関数などでバッファごと複製したものを渡してあげれば良いのですが、これは画像イメージそのものを複製するので、メモリを消費しますし、あまり良い方法ではありません。
EGLImage クラスを派生したクラスで置き換え、SetImageView 関数をオーバーライドすれば、元の画像バッファへのポインタと EGL_RECT 構造体の内容を管理できるかと思います。
因みに、画像の部分領域のレンダリングの場合、特に画像が視線に対して垂直に見えている場合、端の1ドットがクリップしたい領域をはみ出して描画されてしまうかもしれませんので、それが許されない場合には、あらかじめ画像バッファを複製しておくしかありません。
<Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP; rv:1.4) Gecko/20030624 Netscape/7.1 (ax)@tokyo-fa4-199.kcom.ne.jp>

Re:クリッピング画像のテクスチャ利用
 knockedout  - 04/2/1(日) 0:25 -

引用なし
パスワード
   返答ありがとうございます

▼L.Entis(開発者)さん:
> で、クリップ画像を描画する方法ですが、rp.dwFlags に E3DRP_RENDER_REV_IMAGE を指定した場合には、rp.pSrcImage に元の画像(ReadImageFile 関数で読み込んだり CreateImage 関数で生成したものなど)を指定し、rp.rev.nViewVertexes, rp.rev.nViewVertexes メンバをつかってクリップして表示したい領域を囲んだ凹でない多角形を指定すれば実現できますので、元の画像バッファへのポインタと矩形情報を管理しておけば良いのではないでしょうか?

というわけで

E3D_RENDER_PARAM    rp ;
::eslFillMemory( &amp;rp, 0, sizeof(rp) ) ;
EGL_POINT    ptHotSpot = m_Image.GetHotSpot( ) ;

rp.dwFlags = E3DRP_RENDER_REV_IMAGE | E3DSAF_TEXTURE_SMOOTH ;
rp.rgbaColor.rgbMul.dwPixelCode = 0x00FFFFFF ;
rp.rgbaColor.rgbAdd.dwPixelCode = 0;

rp.pSrcImage = m_Image;

E3D_VECTOR_2D ViewVertexes[4];
ViewVertexes[0].x = (REAL32)(ptRect->left);
ViewVertexes[0].y = (REAL32)(ptRect->top);
ViewVertexes[1].x = (REAL32)(ptRect->right);
ViewVertexes[1].y = (REAL32)(ptRect->top);
ViewVertexes[2].x = (REAL32)(ptRect->right);
ViewVertexes[2].y = (REAL32)(ptRect->bottom);
ViewVertexes[3].x = (REAL32)(ptRect->left);
ViewVertexes[3].y = (REAL32)(ptRect->bottom);

rp.rev.vRenderPos = vPos ;
rp.rev.vRevCenter.x = (REAL32) ptHotSpot.x ;
rp.rev.vRevCenter.y = (REAL32) ptHotSpot.y ;
rp.rev.pRevMatrix = matrix ;
rp.rev.nViewVertexes = 4;
rp.rev.pViewVertexes = ViewVertexes;

こんな風にして見ました。
今度は省略無しです(笑)
このときPrepareRenderParamは無事動いているのですが
バッファに何も描画されません。
ちなみに
rp.rev.nViewVertexes = 0;
とした場合はキチンと画像全体が表示されます。
<Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; i-NavFourF)@YahooBB219015025008.bbtec.net>

Re:クリッピング画像のテクスチャ利用
 L.Entis(開発者)  - 04/2/1(日) 9:06 -

引用なし
パスワード
   > rp.rev.nViewVertexes = 0;
> とした場合はキチンと画像全体が表示されます。

あいたっ!
これは GLS3 のバグっぽいですね。
お手数をおかけして申し訳ありませんが、ver.3.03f をアップしておきましたのでこちらで試していただけますでしょうか?
<Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP; rv:1.4) Gecko/20030624 Netscape/7.1 (ax)@tokyo-fa3-134.kcom.ne.jp>

Re:クリッピング画像のテクスチャ利用
 knockedout  - 04/2/1(日) 17:25 -

引用なし
パスワード
   無事描画されました。
お手数かけました。

ちなみにこの画像を回転させるときrp.rev.vRevCenter が
クリッピング先の原画像での位置になってしまっているようなのですが
これは仕様でしょうか?

別に調整するのは簡単なのですが
<Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; i-NavFourF)@YahooBB219015025008.bbtec.net>

Re:クリッピング画像のテクスチャ利用
 L.Entis(開発者)  - 04/2/1(日) 21:52 -

引用なし
パスワード
   > ちなみにこの画像を回転させるときrp.rev.vRevCenter が
> クリッピング先の原画像での位置になってしまっているようなのですが
> これは仕様でしょうか?

仕様です。

ところで EGL_IMAGE_INFO 構造体からテクスチャに使える EGL_IMAGE_INFO 構造体へのポインタを生成する関数を作ったほうが良いのかな〜〜〜?とか考えております。

PEGL_IMAGE_INFO eglCreateTexture( PEGL_IMAGE_INFO pImage, PCEGL_RECT pViewRect, DWORD dwFlags ) ;

のような感じで、ヘッダ情報をテクスチャマッピングに使えるクリップ画像情報を生成するような関数ですが、気が向いたら作るかも…。

ではでは〜
<Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP; rv:1.4) Gecko/20030624 Netscape/7.1 (ax)@tokyo-fa3-142.kcom.ne.jp>

  新規投稿 ┃ ツリー表示 ┃ 一覧表示 ┃ トピック表示 ┃ 検索 ┃ 設定 ┃ ホーム  
6 / 17 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
9038 C-BOARD v3.02 is not Free?