トップページ > 記事閲覧
動画ファイルをフレーム毎にシェーダー描画のテクスチャに渡す方法について
名前:BI201 日時: 2023/08/18 19:47

いつもお世話になります。 動画ファイルをフレーム毎にシェーダー描画のテクスチャに渡そうと考えています。 SetUseTextureToShaderに動画ファイルのハンドルを渡して、 DrawPolygon2DToShaderで描画できるかな?と思ったのですが、 フレームが進まないらしく正常な描画は出来ませんでした。 フレームを進めるため、DrawGraph関数を入れると期待した描画を行うことが出来ました。 当然DrawGraphは不要な処理ですので、他に負荷の軽い(処理時間の短い)フレームを進める方法はありますでしょうか? また、他にシェーダー描画のテクスチャに渡す良い方法がありましたら、ご教授お願いします。 int MovieGraphHandle; //動画ファイルのハンドルを取得 MovieGraphHandle = LoadGraph("XXX"); //PlayMovie PlayMovieToGraph(MovieGraphHandle); while( ProcessMessage() == 0 && GetMovieStateToGraph(MovieGraphHandle) == 1 ) { //動画ファイルをテクスチャ0番にセット SetUseTextureToShader( 0, MovieGraphHandle); //フレームを進める?   DrawGraph( 0 , 0, MovieGraphHandle, FALSE ) ;   ClearDrawScreen() ; //描画   DrawPolygon2DToShader( Vert, 2 ); ScreenFlip(); WaitTimer(10) ; }
メンテ

Page: 1 |

Re: 動画ファイルをフレーム毎にシェーダー描画のテクスチャに渡す方法について ( No.1 )
名前:管理人 日時:2023/08/19 02:28

すみません、動画ファイルのグラフィックハンドルが SetUseTextureToShader で 使用されることを想定していませんでした DrawGraph 等で使用しなくても動画の画像が更新されるように修正しましたので よろしければこちらの修正バージョンをお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
メンテ
Re: 動画ファイルをフレーム毎にシェーダー描画のテクスチャに渡す方法について ( No.2 )
名前:BI201 日時:2023/08/19 11:04

迅速なご回答&対応ありがとうございます!! 動作確認をしようと思ったのですが、別の問題が発生しました。 申し訳ありませんが、ご相談させてください。 [動作環境] Windows版C++Builder11 バージョン38.0.46141.0937 Windows VCLアプリケーション 環境でDxLibを使用しています。 DxLibのバージョンにより下記のような動作となります。 [DxLibバージョン] 3.23: 問題なし <=このバージョンを使用していました。 3.23b: 問題なし 3.23d; Error:未解決の外部シンボル'__pure_error_'等 3.23f, 3.24, 3.24b: Error:"floating point divided by zero at アドレス" 下記にプログラムを記載します。 ("DxLib.h"のインクルードとChangeWindowMode( TRUE )を追加しただけです) //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include "DxLib.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { ChangeWindowMode( TRUE ) ; } //--------------------------------------------------------------------------- 「サンプルプログラム実行用フォルダ」にあるサンプルプログラムおよび コンソールアプリケーションでは、どのバージョンもエラーなく実行出来ます。 お手数おかけしますが、原因分かりますでしょうか?
メンテ
Re: 動画ファイルをフレーム毎にシェーダー描画のテクスチャに渡す方法について ( No.3 )
名前:管理人 日時:2023/08/20 23:39

手元の C++ Builder が 10.4 と少し古かったので、最新の C++ Builder 11.3 をインストールして 試してみたところ、載せていただいたプログラムで Error:"floating point divided by zero の エラーが発生しました 調べてみたところ、原因は恐らくコンパイラのバグでした bullet Physics ライブラリの以下の関数でゼロ除算エラーを回避するために除算に使用する値が 0 かどうかを if文でチェック( if (mass == D_btScalar(0.))等 )しているのですが、 void D_btRigidBody::setMassProps(D_btScalar mass, const D_btVector3& inertia) { if (mass == D_btScalar(0.)) { m_collisionFlags |= D_btCollisionObject::D_CF_STATIC_OBJECT; m_inverseMass = D_btScalar(0.); } else { m_collisionFlags &= (~D_btCollisionObject::D_CF_STATIC_OBJECT); m_inverseMass = D_btScalar(1.0) / mass; } m_invInertiaLocal.setValue(inertia.x() != D_btScalar(0.0) ? D_btScalar(1.0) / inertia.x(): D_btScalar(0.0), inertia.y() != D_btScalar(0.0) ? D_btScalar(1.0) / inertia.y(): D_btScalar(0.0), inertia.z() != D_btScalar(0.0) ? D_btScalar(1.0) / inertia.z(): D_btScalar(0.0)); } 最適化を有効にするとどうもこのゼロかどうかのチェックが無効化(?)されてしまうようで、 if (mass == D_btScalar(0.)) や inertia.x() != D_btScalar(0.0) のチェックをすり抜け、 ゼロ除算が行われてしまい、Error:"floating point divided by zero が発生してしまう という状況のようでした( なので最適化を無効にするとエラーは発生しませんでした ) float型の値の == の比較が無効化されるようなので、以下のように unsigned int型で ゼロかどうかを判定するようにしたところ、Error:"floating point divided by zero は 発生しなくなりました void D_btRigidBody::setMassProps(D_btScalar mass, const D_btVector3& inertia) { if ( ( *((unsigned int *)&mass) & 0x7fffffff ) == 0 ) { m_collisionFlags |= D_btCollisionObject::D_CF_STATIC_OBJECT; m_inverseMass = D_btScalar(0.); } else { m_collisionFlags &= (~D_btCollisionObject::D_CF_STATIC_OBJECT); m_inverseMass = D_btScalar(1.0) / mass; } m_invInertiaLocal.setValue( ( *((unsigned int *)&inertia.x()) & 0x7fffffff ) != 0 ? D_btScalar(1.0) / inertia.x(): D_btScalar(0.0), ( *((unsigned int *)&inertia.y()) & 0x7fffffff ) != 0 ? D_btScalar(1.0) / inertia.y(): D_btScalar(0.0), ( *((unsigned int *)&inertia.z()) & 0x7fffffff ) != 0 ? D_btScalar(1.0) / inertia.z(): D_btScalar(0.0)); } 上記の変更を行ったバージョンをこちらにアップしましたので、よろしければお試しください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 11.3 用 あと、今回 64bitプラットフォーム用のビルドもできることに気付いたので、 64bitプラットフォーム用のライブラリファイルも加えました なので、zipファイルの中には Win32 と Win64 のフォルダが入っています 今まで通りの 32bitプラットフォーム用のビルドを行う際は Win32フォルダの中の ファイルを使用してください m(_ _)m > 3.23: 問題なし <=このバージョンを使用していました。 > 3.23b: 問題なし > 3.23d; Error:未解決の外部シンボル'__pure_error_'等 > 3.23f, 3.24, 3.24b: Error:"floating point divided by zero at アドレス" 無料で使用できる C++ Builder は約1年で無料ライセンスの期限が切れるため都度新しい バージョンをインストールしているのですが( 1年以内に次のバージョンが登場するため、 無料で使い続けたい場合は約1年毎に半強制的に新バージョンに移行しなくてはいけないシステム? )、 恐らく 3.23b の頃までライブラリファイルのコンパイルに使用していた C++ Builder のバージョンで作成した ライブラリファイルはたまたま C++ Builder 11.3 でも問題なく使用できて、3.23d 以降のライブラリファイルを コンパイルする際に使用していた C++ Builder のバージョンで作成したライブラリファイルは C++ Builder 11.3 では正常に使用できなかった、ということかと思います 同じコンパイラで作成したライブラリファイルでも、 『ライブラリファイルの作成に使用したコンパイラのバージョン』と、 『そのライブラリファイルを使用するプログラムのコンパイルに使用するコンパイラのバージョン』 が異なると正常に使用できないということは Microsoft系のコンパイラでも Gnu C 系のコンパイラでも存在しますので…
メンテ
Re: 動画ファイルをフレーム毎にシェーダー描画のテクスチャに渡す方法について ( No.4 )
名前:BI201(解決済み) 日時:2023/08/21 13:41

お世話になります。 Dxライブラリ バージョン3.23bまで動作していたので、 コンパイラのバージョン違いによる異常動作の可能性は低いと判断してしまいました。 ライブラリ作成で使用したバージョンを試すべきでしたね。ご迷惑おかけしました。 また、作成して頂いたバージョンにて、 SetUseTextureToShaderに動画ファイルのハンドルを渡して、DrawPolygon2DToShaderで描画できることを確認致しました。 ご対応頂きありがとうございました!!
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存