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
 |
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)の場合
 |