トップページ > 記事閲覧
3D11BackBufferTexture2Dの取得に関して
名前:猫の湯飲み 日時: 2023/02/01 20:38

VR機器で描画する際 MakeScreenで左右の目専用のスクリーンを作成して、 SetCameraViewMatrixでカメラを設定した後、MakeScreenで作成したスクリーンに3Dモデルを描画して、VR機器にGetGraphID3D11Texture2Dを使用してID3D11Texture2Dを渡すと 一部のモデルで部分的に透明になったりと正常に描画されません。 しかしPC上に描画されているスクリーンををGetUseDirect3D11BackBufferTexture2Dを使用してVR機器にID3D11Texture2Dを渡すと 3Dモデルは正常に描画されます。 左右で異なる角度からの状態を表示したいためGetGraphID3D11Texture2Dを使用して、VR機器にID3D11Texture2Dを渡すしたいのですが無理でしょうか? もしくは使い方を間違えているのでしょうか?
メンテ

Page: 1 | 2 | 3 | 4 |

Re: 3D11BackBufferTexture2Dの取得に関して ( No.25 )
名前:猫の湯飲み 日時:2023/02/14 22:28

ttps://ibb.co/0Cjgd6y 以上の画像のように正常に描画することは出来ますが、立体的に見えなくなります。(両眼視差が変になっている) またVHDが向いた方向とは反対に反映されず、左右の奥行きもズレるようになりました。 HMDWidth=2976 HMDHeight=2976 --------m_mat4ProjectionLeft-------- pos[0]=0.816916 pos[1]=0.000000 pos[2]=0.000000 pos[3]=0.000000 pos[4]=0.000000 pos[5]=0.894180 pos[6]=0.000000 pos[7]=0.000000 pos[8]=-0.313354 pos[9]=-0.004750 pos[10]=-1.000007 pos[11]=-1.000000 pos[12]=0.000000 pos[13]=0.000000 pos[14]=-0.100001 pos[15]=0.000000 --------m_mat4ProjectionRight-------- pos[0]=0.818952 pos[1]=0.000000 pos[2]=0.000000 pos[3]=0.000000 pos[4]=0.000000 pos[5]=0.892256 pos[6]=0.000000 pos[7]=0.000000 pos[8]=0.318878 pos[9]=-0.017492 pos[10]=-1.000007 pos[11]=-1.000000 pos[12]=0.000000 pos[13]=0.000000 pos[14]=-0.100001 pos[15]=0.000000 --------m_mat4eyePosLeft-------- pos[0]=1.000000 pos[1]=0.000000 pos[2]=0.000000 pos[3]=0.000000 pos[4]=0.000000 pos[5]=1.000000 pos[6]=0.000000 pos[7]=0.000000 pos[8]=0.000000 pos[9]=0.000000 pos[10]=1.000000 pos[11]=0.000000 pos[12]=0.031500 pos[13]=-0.000000 pos[14]=-0.015000 pos[15]=1.000000 --------m_mat4eyePosRight-------- pos[0]=1.000000 pos[1]=0.000000 pos[2]=0.000000 pos[3]=0.000000 pos[4]=0.000000 pos[5]=1.000000 pos[6]=0.000000 pos[7]=0.000000 pos[8]=0.000000 pos[9]=0.000000 pos[10]=1.000000 pos[11]=0.000000 pos[12]=-0.031500 pos[13]=-0.000000 pos[14]=-0.015000 pos[15]=1.000000 [Eye_Right] --------pfLeft-------- -0.831700 --------pfRight-------- 1.610445 --------pfTop-------- -1.140358 --------pfBottom-------- 1.101150 unTrackedDevice=0->type<H> --------matDeviceToTracking-------- pos[0]=-0.921514 pos[1]=0.040082 pos[2]=-0.386272 pos[3]=0.000000 pos[4]=0.039792 pos[5]=0.999170 pos[6]=0.008751 pos[7]=0.000000 pos[8]=0.386302 pos[9]=-0.007306 pos[10]=-0.922344 pos[11]=0.000000 pos[12]=0.213375 pos[13]=0.150011 pos[14]=0.724527 pos[15]=1.000000 unTrackedDevice=2->type<T> --------matDeviceToTracking-------- pos[0]=0.654137 pos[1]=0.046494 pos[2]=0.754946 pos[3]=0.000000 pos[4]=-0.298568 pos[5]=0.932930 pos[6]=0.201244 pos[7]=0.000000 pos[8]=-0.694955 pos[9]=-0.357044 pos[10]=0.624146 pos[11]=0.000000 pos[12]=-0.218205 pos[13]=0.082180 pos[14]=0.992830 pos[15]=1.000000 --------m_pos-------- val[0][n]->-0.892547,0.079092,-0.443965,0.000000 val[1][n]->0.234794,0.922036,-0.307770,0.000000 val[2][n]->0.385010,-0.378939,-0.841530,0.000000 val[3][n]->0.259850,-0.082600,-0.428692,1.000000 [Eye_Left] --------pfLeft-------- -1.607698 --------pfRight-------- 0.840534 --------pfTop-------- -1.123655 --------pfBottom-------- 1.113030 unTrackedDevice=0->type<H> --------matDeviceToTracking-------- pos[0]=-0.921514 pos[1]=0.040082 pos[2]=-0.386272 pos[3]=0.000000 pos[4]=0.039792 pos[5]=0.999170 pos[6]=0.008751 pos[7]=0.000000 pos[8]=0.386302 pos[9]=-0.007306 pos[10]=-0.922344 pos[11]=0.000000 pos[12]=0.213375 pos[13]=0.150011 pos[14]=0.724527 pos[15]=1.000000 unTrackedDevice=2->type<T> --------matDeviceToTracking-------- pos[0]=0.654137 pos[1]=0.046494 pos[2]=0.754946 pos[3]=0.000000 pos[4]=-0.298568 pos[5]=0.932930 pos[6]=0.201244 pos[7]=0.000000 pos[8]=-0.694955 pos[9]=-0.357044 pos[10]=0.624146 pos[11]=0.000000 pos[12]=-0.218205 pos[13]=0.082180 pos[14]=0.992830 pos[15]=1.000000 --------m_pos-------- val[0][n]->-0.892547,0.079092,-0.443965,0.000000 val[1][n]->0.234794,0.922036,-0.307770,0.000000 val[2][n]->0.385010,-0.378939,-0.841530,0.000000 val[3][n]->0.322850,-0.082600,-0.428692,1.000000
メンテ
Re: 3D11BackBufferTexture2Dの取得に関して ( No.26 )
名前:管理人 日時:2023/02/15 02:28

お試しいただきありがとうございます また、値のご情報もありがとうございます 載せて頂いた値と VR の射影行列の式を使って色々試してみますので何日かお時間をください m(_ _)m
メンテ
Re: 3D11BackBufferTexture2Dの取得に関して ( No.27 )
名前:管理人 日時:2023/02/16 01:58

VR の射影行列を作成する関数を少し変更してみると上手くいくかもしれません No.24 の変更を加えた上で、vr.cpp の GetProjectMat を以下のように変更してください MATRIX GetProjectMat(vr::EVREye eye) { Matrix4 matMVP; if (eye == vr::EVREye::Eye_Left) { matMVP = GetCurrentViewProjectionMatrix(vr::EVREye::Eye_Left); } else { matMVP = GetCurrentViewProjectionMatrix(vr::EVREye::Eye_Right); } const float* pos = matMVP.get(); MATRIX m_pos; m_pos.m[0][0] = pos[0]; m_pos.m[0][1] = pos[1]; m_pos.m[0][2] = pos[2]; m_pos.m[0][3] = pos[3]; m_pos.m[1][0] = pos[4]; m_pos.m[1][1] = pos[5]; m_pos.m[1][2] = pos[6]; m_pos.m[1][3] = pos[7]; m_pos.m[2][0] = pos[8]; m_pos.m[2][1] = pos[9]; m_pos.m[2][2] = pos[10]; m_pos.m[2][3] = pos[11]; m_pos.m[3][0] = pos[12]; m_pos.m[3][1] = pos[13]; m_pos.m[3][2] = pos[14]; m_pos.m[3][3] = pos[15]; VAR_NAME(m_pos); MATRIX_Print(m_pos); return m_pos; } ↓変更 MATRIX GetProjectMat(vr::EVREye eye) { float fLeft, fRight, fTop, fBottom; m_pHMD->GetProjectionRaw( eye, &fLeft, &fRight, &fTop, &fBottom ); float idx = 1.0f / (fRight - fLeft); float idy = 1.0f / (fBottom - fTop); float idz = 1.0f / (m_fFarClip - m_fNearClip); float sx = fRight + fLeft; float sy = fBottom + fTop; MATRIX m_pos; m_pos.m[0][0] = 2*idx; m_pos.m[0][1] = 0; m_pos.m[0][2] = 0; m_pos.m[0][3] = 0; m_pos.m[1][0] = 0; m_pos.m[1][1] = 2*idy; m_pos.m[1][2] = 0; m_pos.m[1][3] = 0; m_pos.m[2][0] = sx*idx; m_pos.m[2][1] = sy*idy; m_pos.m[2][2] = m_fFarClip*idz; m_pos.m[2][3] = 1.0f; m_pos.m[3][0] = 0; m_pos.m[3][1] = 0; m_pos.m[3][2] = -m_fFarClip*m_fNearClip*idz; m_pos.m[3][3] = 0; VAR_NAME(m_pos); MATRIX_Print(m_pos); return m_pos; } 次に UpdateCameraScreen を以下のように変更してください void UpdateCameraScreen(vr::Hmd_Eye nEye, MATRIX view,MATRIX projection) { if (nEye == vr::Eye_Right) { SetDrawScreen(vrEyeRight); } if (nEye == vr::Eye_Left) { SetDrawScreen(vrEyeLeft); } ClearDrawScreenZBuffer(); ClearDrawScreen(); SetCameraScreenCenter(DXLIB_VR::GetHMDWidth()/2.0f, DXLIB_VR::GetHMDHeight()/2.0f); //カメラが見ている映像の中心座標を再設定 SetCameraNearFar(0.1f, 15000.0f); float Near = 0.1f; float Far = 15000.0f; float Q = Far / ( Far - Near ); if (nEye == vr::Eye_Right) { MATRIX mat4ProjectionRight = { 0.816916, 0.000000, 0.000000, 0.000000, 0.000000, 0.894180, 0.000000, 0.000000, 0.000000, 0.000000, Q, 1.000000, 0.000000, 0.000000, -Q * Near, 0.000000 }; SetupCamera_ProjectionMatrix(mat4ProjectionRight); } if (nEye == vr::Eye_Left) { MATRIX mat4ProjectionLeft = { 0.816916, 0.000000, 0.000000, 0.000000, 0.000000, 0.894180, 0.000000, 0.000000, 0.000000, 0.000000, Q, 1.000000, 0.000000, 0.000000, -Q * Near, 0.000000 }; SetupCamera_ProjectionMatrix(mat4ProjectionLeft); } SetCameraViewMatrix(view); MV1DrawModel(stage); SetDrawScreen(DX_SCREEN_BACK);//描画先を元に戻す } ↓変更 void UpdateCameraScreen(vr::Hmd_Eye nEye, MATRIX view,MATRIX projection) { if (nEye == vr::Eye_Right) { SetDrawScreen(vrEyeRight); } if (nEye == vr::Eye_Left) { SetDrawScreen(vrEyeLeft); } ClearDrawScreenZBuffer(); ClearDrawScreen(); SetCameraScreenCenter(DXLIB_VR::GetHMDWidth()/2.0f, DXLIB_VR::GetHMDHeight()/2.0f); //カメラが見ている映像の中心座標を再設定 SetupCamera_ProjectionMatrix(projection); SetCameraViewMatrix(view); MV1DrawModel(stage); SetDrawScreen(DX_SCREEN_BACK);//描画先を元に戻す } GetCurrentViewProjectionMatrix は前回と同じく、m_mat4ProjectionLeft と m_mat4ProjectionRight は削除された状態にしてください Matrix4 GetCurrentViewProjectionMatrix(vr::Hmd_Eye nEye) { Matrix4 matMVP; VAR_NAME(m_mat4HMDPose); MATRIX4_Print(m_mat4HMDPose); if (nEye == vr::Eye_Left) { matMVP = m_mat4eyePosLeft * m_mat4HMDPose; } else if (nEye == vr::Eye_Right) { matMVP = m_mat4eyePosRight * m_mat4HMDPose; } return matMVP; } この変更を加えた上で実行してみてください m(_ _)m
メンテ
Re: 3D11BackBufferTexture2Dの取得に関して ( No.28 )
名前:猫の湯飲み 日時:2023/02/16 22:48

ttps://ibb.co/Rhw9zrY 以上の画像のように正常に描画することは出来ますが、左右が大きく異なるようになりました。 またHMDが向いた方向とは反対に反映され、HMDを左右に回転すると大きく位置が変化するようになりました [HMDを左右に回転した際の動画] ttps://xgf.nu/n3bd ファイル共有となってしまい申し訳ありません
メンテ
Re: 3D11BackBufferTexture2Dの取得に関して ( No.29 )
名前:管理人 日時:2023/02/17 08:36

お試しいただきありがとうございます 動画拝見しました、確かに左右でかなり違いますね… 少しの変更となるのですが、前回の状態から GetProjectMat のこちらの1行を変更して再度実行してみて頂けないでしょうか? m(_ _)m ( m[2][0] と m[2][1] へ代入する値の符号を逆転しただけ ) m_pos.m[2][0] = sx*idx; m_pos.m[2][1] = sy*idy; m_pos.m[2][2] = m_fFarClip*idz; m_pos.m[2][3] = 1.0f; ↓変更 m_pos.m[2][0] = -sx*idx; m_pos.m[2][1] = -sy*idy; m_pos.m[2][2] = m_fFarClip*idz; m_pos.m[2][3] = 1.0f;
メンテ
Re: 3D11BackBufferTexture2Dの取得に関して ( No.30 )
名前:猫の湯飲み 日時:2023/02/17 23:13

正常に描画することができ、立体的に見えるようになりました。 しかしHMDが向いた方向とは反対にカメラの移動が反映され、HMDの向きとカメラの向きがズレるようになりました。 (HMDを水平にし、基準方向に向いた場合、カメラでは斜め右下方向で少し傾いた状態になってしまいます。) ttps://ibb.co/9hTSTSy
メンテ
Re: 3D11BackBufferTexture2Dの取得に関して ( No.31 )
名前:管理人 日時:2023/02/18 02:11

正常に立体視できるようになったとのことで、一歩前進ですね と、言いたいところなのですが、最後の『HMDが向いた方向と反対方向にカメラが向いてしまう』というのは 今の路線だと解決できそうにありません 本件の問題を解決しにくくしている最大の要因が『OpenVR は右手座標系を使用している』点です DXライブラリは左手座標系なので、Z軸の向きが反対となっています OpenVR では使用される射影行列( Projection Matrix )も右手座標系用となっていたので、 無理矢理左手座標系の射影行列を作成するようにしてみた、というのが No.29 までの流れなのですが、 射影行列を左手座標系用にしただけでは HMD の向いた方向まで左手座標系の行列にすることができないので、 頭を動かした方向と逆の方向にカメラが向いてしまうという訳です 解決策としては、今の路線( 右手座標系の VR の情報を無理矢理左手座標系に変換して使う )を止めて、 『素直に右手座標系を使う』路線にする、というものがあります ただ、DXライブラリは左手座標系用に作られているので、幾つか変更を行う必要があります 1.GetProjectMat の一部を右手座標系用に書き換え m_pos.m[2][0] = -sx*idx; m_pos.m[2][1] = -sy*idy; m_pos.m[2][2] = m_fFarClip*idz; m_pos.m[2][3] = 1.0f; ↓変更 m_pos.m[2][0] = sx*idx; m_pos.m[2][1] = sy*idy; m_pos.m[2][2] = -m_fFarClip*idz; m_pos.m[2][3] = -1.0f; No.29 で書き換えて頂いた行を更に書き換えです、m[2][0] 〜 m[2][3] に代入する値の 符号を全て逆転して、VR 本来の右手座標系用の射影行列にします 2.main.cpp の MV1LoadModel で画像を読み込んだ後にカリング方向を右回転にする stage = MV1LoadModel(".\\res\\mmd_batokin_island\\batokin_island5.x"); ↓追記 stage = MV1LoadModel(".\\res\\mmd_batokin_island\\batokin_island5.x"); for( int i = 0; i < MV1GetMeshNum( stage ); i++ ) { MV1SetMeshBackCulling( stage, i, DX_CULLING_RIGHT ) ; } 左手座標系では一般的には左回りのポリゴンをカリング( 描画しない )するのですが、右手座標系では 右回りのポリゴンをカリングするので、MV1SetMeshBackCulling を使用して右回りカリングの設定を行います あと、手元では batokin_island5.x では右手座標系で何か表示される形にすることはできませんでした batokin_island5.x はテストするには大きすぎるので、VR機器が無い状態で見えるパラメータを探すのが大変です なので、一旦 DxChara.x という、DXライブラリのサンプルプログラム実行用フォルダに入っている 人間サイズのキャラクターモデルを使うことにします というわけで、DXライブラリのパッケージの中の『サンプルプログラム実行用フォルダ』というフォルダの中にある DxChara.x DxCharaEye.tga ↑ こちらの2つのファイルをプロジェクトの res フォルダの中に入れてください、その上で main.cpp の batokin_island5.x を読み込んでいる箇所を以下のように変更してください stage = MV1LoadModel(".\\res\\mmd_batokin_island\\batokin_island5.x"); for( int i = 0; i < MV1GetMeshNum( stage ); i++ ) { MV1SetMeshBackCulling( stage, i, DX_CULLING_RIGHT ) ; } MV1SetScale(stage,VGet(3.0f, 3.0f, 3.0f)); MV1SetPosition(stage, VGet(0.0f, 0.0f, 0.0f)); ↓変更 stage = MV1LoadModel(".\\res\\DxChara.x"); for( int i = 0; i < MV1GetMeshNum( stage ); i++ ) { MV1SetMeshBackCulling( stage, i, DX_CULLING_RIGHT ) ; } MV1SetPosition(stage, VGet(200.0f, -400.0f, 800.0f)); MV1SetScale を使用しないようにして、MV1SetPosition の座標を x=200.0f y=-400.0f z=800.0f に しています、こちらはこれまでに頂いたカメラのパラメータで目の前に DxChara.x が表示されることを確認した座標です 更に、DxChara.x を表示した限りでは Zバッファの精度がデフォルトの 16bit では足りなかったので、DxLib_Init() を呼び出す前の行に SetZBufferBitDepth( 24 ) ; SetCreateDrawValidGraphZBufferBitDepth( 24 ) ; ↑ こちらの2行を加えて、Zバッファの精度を 24bit にしてください 以上の変更を加えた上で実行すると、恐らく HMD でどちらかの方向を向いたときに DxChara.x が表示されるはずです よろしければお試しください m(_ _)m
メンテ
Re: 3D11BackBufferTexture2Dの取得に関して ( No.32 )
名前:猫の湯飲み 日時:2023/02/18 23:13

DxChara.xは正常に描画することは出来ましたが、batokin_island5.xを正常に描画することは出来ませんでした。 (VR上では描画を一切されず、画面上(PCモニター)にも正常に描画されない) DxChara.xはSetCameraViewMatrixに以下の計算式(No.9の時と同様)でmatMVPを指定すると、なぜか回転および描画を正常に行うことが出来てしまいます。 matMVP = GetCurrentViewProjectionMatrix(vr::EVREye::Eye_Left) * matDeviceToTracking; GetCurrentViewProjectionMatrix<-m_mat4ProjectionLeft * m_mat4eyePosLeft * m_mat4HMDPose; openVRをunity(左手座標系)で扱う公式のプラグインがあるので処理を調べてみることにします。 ttps://github.com/ValveSoftware/steamvr_unity_plugin
メンテ
Re: 3D11BackBufferTexture2Dの取得に関して ( No.33 )
名前:管理人 日時:2023/02/19 02:30

すみません、スキニングメッシュには適用されない3Dモデルのクリッピングの処理が 剛体メッシュである batokin_island5.x には適用されていて、 クリッピングの処理もデフォルトでは左手座標系用になっており、各行列が右手座標系用に設定されている状態で 行うと正常にクリッピングされず、結果として batokin_island5.x は何処に配置しても何も描画されない状態となっていました なのでクリッピング処理を右手座標系用に設定するための関数を追加しましたので、 お手数で申し訳ありませんがこちらの暫定最新版をダウンロードしてください 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 // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) 以下の関数を追加しました // 右手座標系のクリッピング処理を行うかを設定する // Flag = TRUE:右手座標系用のクリッピング処理を行う FALSE:左手座標系用のクリッピング処理を行う( デフォルト ) int SetUseRightHandClippingProcess( int Flag ) ; こちらの関数を DxLib_Init の呼び出し後に TRUE を渡して呼んでください SetUseRightHandClippingProcess( TRUE ); そうすることで batokin_island5.x も表示できるようになります m(_ _)m
メンテ
Re: 3D11BackBufferTexture2Dの取得に関して ( No.34 )
名前:猫の湯飲み 日時:2023/02/19 23:16

batokin_island5.xを正常に描画することができました。 しかし3dモデルが小刻みに震えるような感じになり、また描画が追いついてないのか、かなりの頻度で画面上の下半分が遅れたようにズレて表示されます。
メンテ
Re: 3D11BackBufferTexture2Dの取得に関して ( No.35 )
名前:管理人 日時:2023/02/20 02:27

> しかし3dモデルが小刻みに震えるような感じになり、また描画が追いついてないのか、かなりの頻度で画面上の下半分が遅れたようにズレて表示されます。 うーん、謎ですね… すみません、ご質問なのですが No.30 でも描画自体は正常に行えていたと思うのですが、 その際も小刻みに震えたり描画が追いついていなかったりしたのでしょうか?
メンテ
Re: 3D11BackBufferTexture2Dの取得に関して ( No.36 )
名前:猫の湯飲み 日時:2023/02/20 22:14

No.30では小刻みに震えたり描画が追いついていない感じにはなっていませんでした。
メンテ
Re: 3D11BackBufferTexture2Dの取得に関して ( No.37 )
名前:管理人 日時:2023/02/21 05:56

ご返答ありがとうございます No.30 では大丈夫でしたか… となると、No.31 で追加した Zバッファの 24bit化が原因かもしれません( 16bit のZバッファより処理負荷が高くなるので ) No.31 で追加した SetZBufferBitDepth( 24 ) ; SetCreateDrawValidGraphZBufferBitDepth( 24 ) ; ↑ こちらを削除してみてください m(_ _)m
メンテ
Re: 3D11BackBufferTexture2Dの取得に関して ( No.38 )
名前:猫の湯飲み 日時:2023/02/21 23:57

SetZBufferBitDepth( 24 ) ; SetCreateDrawValidGraphZBufferBitDepth( 24 ) ; を削除しても変わりませんでした。 一応CPUは50%,メモリーは30%,グラフィックボードは60%程度の使用率で実行できているのでスペックが足を引っ張っていることは無いと思います。
メンテ
Re: 3D11BackBufferTexture2Dの取得に関して ( No.39 )
名前:管理人 日時:2023/02/22 08:06

お試しいただきありがとうございます 駄目でしたか… うーんあと一歩の所まで来たと思うのですが、小刻みに震える原因が分かりません… > また描画が追いついてないのか、かなりの頻度で画面上の下半分が遅れたようにズレて表示されます。 画面のある地点から下側の部分だけ遅れたようにズレて表示されるというと、 ゲームなどで VSYNC待ち設定を OFF にした場合の現象に似ていますね… とりあえず実際に描画が追いついていないのか確かめるために、WinMain のメインループの部分を while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) { DXLIB_VR::updateVRState(); UpdateCameraScreen(vr::Eye_Right, DXLIB_VR::GetViewMat(vr::Eye_Right), DXLIB_VR::GetProjectMat(vr::Eye_Right)); UpdateCameraScreen(vr::Eye_Left, DXLIB_VR::GetViewMat(vr::Eye_Left), DXLIB_VR::GetProjectMat(vr::Eye_Left)); DXLIB_VR::putTex((ID3D11Texture2D*)GetGraphID3D11Texture2D(vrEyeRight), vr::Eye_Right); DXLIB_VR::putTex((ID3D11Texture2D*)GetGraphID3D11Texture2D(vrEyeLeft), vr::Eye_Left); SetCameraPositionAndTarget_UpVecY(VGet(0.0f, 500.0f, 100.0f), VGet(0.0f, 0.0f, 0.0f)); SetCameraScreenCenter(1280,720); MV1DrawModel(stage); DXLIB_VR::render(); } ↓こちらのようにFPSを出力する処理を追加して int DispFPS = 0; int FPSCount = 0; int FPSTime = GetNowCount(); while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) { DXLIB_VR::updateVRState(); UpdateCameraScreen(vr::Eye_Right, DXLIB_VR::GetViewMat(vr::Eye_Right), DXLIB_VR::GetProjectMat(vr::Eye_Right)); UpdateCameraScreen(vr::Eye_Left, DXLIB_VR::GetViewMat(vr::Eye_Left), DXLIB_VR::GetProjectMat(vr::Eye_Left)); DXLIB_VR::putTex((ID3D11Texture2D*)GetGraphID3D11Texture2D(vrEyeRight), vr::Eye_Right); DXLIB_VR::putTex((ID3D11Texture2D*)GetGraphID3D11Texture2D(vrEyeLeft), vr::Eye_Left); SetCameraPositionAndTarget_UpVecY(VGet(0.0f, 500.0f, 100.0f), VGet(0.0f, 0.0f, 0.0f)); SetCameraScreenCenter(1280,720); MV1DrawModel(stage); FPSCount++; int NowTime = GetNowCount(); if( NowTime - FPSTime >= 1000 ) { DispFPS = FPSCount; FPSCount = 0; FPSTime = NowTime; } DrawFormatString( 0, 0, GetColor( 255,255,255 ), "FPS:%d", DispFPS ); DXLIB_VR::render(); } 一秒間の画面更新回数( Frame Per Second )を表示するようにして、 値が十分大きいか( 処理落ちしていないか )確認してみていただけないでしょうか? m(_ _)m あと、VIVE PRO 2 の仕様を見たところリフレッシュレート( FPS )が 90Hz 又は 120Hz と記載されていました DXライブラリの ScreenFlip 関数を使用するとデフォルトの設定ではモニターの VSYNC( 画面更新タイミング )を 待ってしまうので VIEW PRO 2 の画面更新タイミングとズレてしまい、正常に画面が表示されないということがあるかもしれません ( 一般的なPCのモニターはリフレッシュレートは 60Hz なので、90Hz / 120Hz の VIVE PRO 2 とはタイミングが合わない? ) なので、DxLib_Init() の呼び出し前に SetWaitVSyncFlag( FALSE ); を追加して ScreenFlip 呼び出し時に モニターの VSYNC を待たないようにするか、メインループの while( ScreenFlip() == 0 ←こちらの ScreenFlip 呼び出しを 削除する必要があるかもしれません
メンテ
Re: 3D11BackBufferTexture2Dの取得に関して ( No.40 )
名前:猫の湯飲み 日時:2023/02/22 22:59

SetWaitVSyncFlag(false);の場合90FPS SetWaitVSyncFlag(true);の場合60FPS でした。 またどちらの場合でも小刻みに震えるような感じになり、かなりの頻度で画面上の下半分が遅れたようにズレて表示されます。 VIVE PRO 2の設定は90Hzに設定しています。(steamVR上でも90Hzになっています)
メンテ
Re: 3D11BackBufferTexture2Dの取得に関して ( No.41 )
名前:管理人 日時:2023/02/23 02:44

SetWaitVSyncFlag をお試しいただきありがとうございます うーん、現状ではこれ以上思いつくことが無いですね… batokin_island5.x ではなく DxChara.x でしたら震えないでしょうか? あと、現象を拝見できれば何か分かるかもしれないので、小刻みに震える・下半分が遅れるという映像を 録画して頂くことはできますでしょうか? m(_ _)m 質問ばかりですみません、あともう一つご質問させてください やはり手元で色々試せないと問題の解決が難しそうなので VIVE PRO 2 の購入を考えたのですが ベースステーションというものを2台適切な位置に設置しなければいけないというのが問題になりました ( 現在のPC環境がかなり狭い空間なので… ) ベースステーションが適当な位置に設置されていてもヘッドトラッキング( 頭の向き )くらいは 取得することができますでしょうか? もし適切な位置に設置されていないとヘッドトラッキングも正常に取得できないとなると、 購入しても無駄になってしまいそうです (・_・;
メンテ
Re: 3D11BackBufferTexture2Dの取得に関して ( No.42 )
名前:猫の湯飲み 日時:2023/02/23 22:55

ttps://xgf.nu/djZrp 最初の部分はSteamVRのhome画面です。この時点では小刻みに震えるような現象は発生してません。(少なくともハードウェアの不具合は無いはず) あまり動画だと震えるような感じが伝わりにくいです。すみません 下半分が遅れるという現象自体は起きているのですが、vive console上(ミラースクリーン)では録画できませんでした。 >batokin_island5.x ではなく DxChara.x でしたら震えないでしょうか? どちらも小刻みに震えるような感じでした。 >ベースステーションが適当な位置に設置されていてもヘッドトラッキング( 頭の向き )くらいは >取得することができますでしょうか? ベースステーションが適切な位置に無いとルームセットアップがうまく動作しません。なので怪しい挙動を繰り返したりします。(向きが反対になるなど) またベースステーションが一台でも動かすことは出来るのですが、ルームセットアップなしで動かすので位置が突然ぶれたり、トラッキングが途切れたりします。 一応vive pro2(lighthouse)とは計測方法が違うmeta quest2(インサイドアウト方式) でも試してみたのですがmeta quest2ではうねるような感じに描画されました。(こちらはOculus Linkで接続しているのでうまくミラースクリーンを録画できませんでした。) またopenVRのサンプルでは少し揺れているかな?ぐらい(注視しないと気づかないレベル)で描画されるので、もしかしたらopenVRとsteamVRの相性が悪いのかもしれません。 (steamVRはopenVRからopenXRに移行しています。一応後方互換性としてopenVRもサポートしている感じだそうです) ただ移行にするにしてもopenXRは多くの機種に対応するため、かなり複雑になっておりopenXR側が作成したSwapchainに描画する必要がある仕様なので難易度が高いです。
メンテ
Re: 3D11BackBufferTexture2Dの取得に関して ( No.43 )
名前:管理人 日時:2023/02/24 07:04

動画のアップありがとうございます 確かに動画では震えているというのは特に感じませんね… SteamVR の home画面という点で思いついたのですが、home画面ではアンチエイリアスが使用されていて DXライブラリの画面ではアンチエイリアスが使用されていない、という違いがあると思いますので vrEyeRight = MakeScreen(DXLIB_VR::GetHMDWidth(), DXLIB_VR::GetHMDHeight(), FALSE); vrEyeLeft = MakeScreen(DXLIB_VR::GetHMDWidth(), DXLIB_VR::GetHMDHeight(), FALSE); ↑ こちらの MakeScreen の実行前に SetCreateDrawValidGraphMultiSample( 8, 8 ); を追加して SetCreateDrawValidGraphMultiSample( 8, 8 ); vrEyeRight = MakeScreen(DXLIB_VR::GetHMDWidth(), DXLIB_VR::GetHMDHeight(), FALSE); vrEyeLeft = MakeScreen(DXLIB_VR::GetHMDWidth(), DXLIB_VR::GetHMDHeight(), FALSE); ↑ このようにして、アンチエイリアス付きで画面を描画してみてください m(_ _)m > ベースステーションが適切な位置に無いとルームセットアップがうまく動作しません。なので怪しい挙動を繰り返したりします。(向きが反対になるなど) > またベースステーションが一台でも動かすことは出来るのですが、ルームセットアップなしで動かすので位置が突然ぶれたり、トラッキングが途切れたりします。 ご返答ありがとうございます vive pro2 はやはり厳しそうですが、meta quest2 の場合は vive pro2 とは挙動が異なる ということで meta quest2 で本件の検証をすることはできないのですね… > またopenVRのサンプルでは少し揺れているかな?ぐらい(注視しないと気づかないレベル)で描画されるので、もしかしたらopenVRとsteamVRの相性が悪いのかもしれません。 すみません、こちらは vive pro2 を使用した際のお話でしょうか? あと、すみません、steamVR と openVR と openXR の関係性が少し理解できていないかもしれません 『openVRのサンプルでは少し揺れているかな?ぐらい』というのは、steamVR を介さずに openVR を直接使用した、ということでしょうか…?
メンテ
Re: 3D11BackBufferTexture2Dの取得に関して ( No.44 )
名前:猫の湯飲み 日時:2023/02/24 21:29

アンチエイリアス付きで画面を描画した場合大きく震えるようになりました。 openVR-->steamVR(vive用SDKを含む)--->vive console->HTVive Pro2(vive用SDKによって固有の機能が使える)(#1) | | | -->Oculus Rift ソフトウェア->Meta Quest2(基本的な機能しか使えない)*steamVRを挟むので処理が重くなるデメリットがある(#2) | -->Meta Quest用SDK->Oculus Rift ソフトウェア->Meta Quest2 (openVRからMeta Quest用SDKを一部呼び出せるので一部固有の機能が使える) openVRではバックエンドのSteamVRランタイムの後方互換性機能を呼び出している [openXR対応ランタイム] openXR------------------->steamVR--------| (Application Interface) | | -->Vive Pro2(openXRによって固有の機能が使える) |->Mixed Reality-| | | | |->Meta Quest2 (openXRによって固有の機能が使える) |->Oculus--------|->openXR---------------->| | |(Device Plugin Interface)|->PICO4(openXRによって固有の機能が使える) |->Gear VR-------| | | | etc.. -->Daydream------| openXR(Device Plugin Interface)...ハードウェアの機能を専用のSDKなしで吸収してくれる(基本ハードウェアベンダーが作成するもの) openXR(Application Interface)...ランタイムの違い(独自機能...ルームセットアップなど)を吸収してくれる。 とても分かりずらい図ですみません。 meta quest2(インサイドアウト方式)でも試してみたのですがmeta quest2ではうねるような感じに描画されました。<-(#2)での場合 >またopenVRのサンプルでは少し揺れているかな?ぐらい(注視しないと気づかないレベル)で描画されるので、もしかしたらopenVRとsteamVRの相性が悪いのかもしれません。 これはopenVRのサンプルをsteamVRを通して動かしています。vive pro2とmeta quest2で検証しましたが同じ挙動でした<-(#1と#2)の場合
メンテ

Page: 1 | 2 | 3 | 4 |

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

   クッキー保存