|
こんにちは、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ドットがクリップしたい領域をはみ出して描画されてしまうかもしれませんので、それが許されない場合には、あらかじめ画像バッファを複製しておくしかありません。
|
|