at init:
Code: Select all
ovr_Initialize(nullptr);
if (ovr_Create(&session, &luid) != ovrSuccess)
{
ovr_Shutdown();
}
else{
hmdDesc = ovr_GetHmdDesc(session);
}
Code: Select all
void yGraphicsOculusVR::initTextures(){
const auto texSizeL = ovr_GetFovTextureSize(session, ovrEye_Left, hmdDesc.DefaultEyeFov[0], 1);
const auto texSizeR = ovr_GetFovTextureSize(session, ovrEye_Right, hmdDesc.DefaultEyeFov[1], 1);
mRenderWidth = texSizeL.w + texSizeR.w;
mRenderHeight = std::max(texSizeL.h, texSizeR.h);
ovrTextureSwapChainDesc textureSwapChainDesc = {};
textureSwapChainDesc.Type = ovrTexture_2D;
textureSwapChainDesc.ArraySize = 1;
textureSwapChainDesc.Format = OVR_FORMAT_R8G8B8A8_UNORM_SRGB;
textureSwapChainDesc.Width = mRenderWidth;
textureSwapChainDesc.Height = mRenderHeight;
textureSwapChainDesc.MipLevels = 1;
textureSwapChainDesc.SampleCount = 1;
textureSwapChainDesc.BindFlags = ovrTextureBind_DX_RenderTarget;
textureSwapChainDesc.StaticImage = ovrFalse;
Ogre::D3D11RenderSystem* renderSystem = dynamic_cast<Ogre::D3D11RenderSystem*>( Ogre::Root::getSingletonPtr()->getRenderSystem() );
if (ovr_CreateTextureSwapChainDX(session, renderSystem->_getDevice().get(), &textureSwapChainDesc, &textureSwapchain) == ovrSuccess)
{
int textureCount = 0;
ovr_GetTextureSwapChainLength(session, textureSwapchain, &textureCount);
mRenderTargetViews.resize(textureCount);
for (int i = 0; i < textureCount; ++i)
{
ID3D11Texture2D* texture = nullptr;
ID3D11RenderTargetView* rtv = nullptr;
ovr_GetTextureSwapChainBufferDX(session, textureSwapchain, i, IID_PPV_ARGS(&texture));
D3D11_RENDER_TARGET_VIEW_DESC rtvd = {};
rtvd.Format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;
rtvd.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
HRESULT hr = renderSystem->_getDevice().get()->CreateRenderTargetView(texture, &rtvd, &mRenderTargetViews[i]);
if( hr != ERROR_SUCCESS){
std::cout<<"Oculus: Error creating render target view "<<i<<std::endl;
}
texture->Release();
}
}
Ogre::TextureGpuManager* textureManager = Ogre::Root::getSingletonPtr()->getRenderSystem()->getTextureGpuManager();
mEyesRenderTexture = textureManager->createTexture( "OculusVRRenderTexture",
Ogre::GpuPageOutStrategy::Discard,
Ogre::TextureFlags::RenderToTexture | Ogre::TextureFlags::Reinterpretable |
Ogre::TextureFlags::Uav,
Ogre::TextureTypes::Type2D );
mEyesRenderTexture->setResolution( mRenderWidth, mRenderHeight );
mEyesRenderTexture->setNumMipmaps( 1u );
mEyesRenderTexture->setPixelFormat( Ogre::PixelFormatGpu::PFG_RGBA8_UNORM_SRGB );
mEyesRenderTexture->setMsaa( 1u );
mEyesRenderTexture->_transitionTo( Ogre::GpuResidency::Resident, (uint8*)0 );
mEyesRenderTexture->notifyDataIsReady();
//Create a layer with our single swaptexture on it. Each side is an eye.
layer.Header.Type = ovrLayerType_EyeFov;
layer.Header.Flags = 0;
layer.ColorTexture[0] = textureSwapchain;
layer.ColorTexture[1] = textureSwapchain;
layer.Fov[0] = EyeRenderDesc[0].Fov;
layer.Fov[1] = EyeRenderDesc[1].Fov;
ovrRecti leftRect, rightRect;
leftRect.Size.w = mRenderWidth / 2.0f;
leftRect.Size.h = mRenderHeight;
rightRect = leftRect;
leftRect.Pos.x = 0;
leftRect.Pos.y = 0;
rightRect.Pos.x = mRenderWidth / 2.0f;
rightRect.Pos.y = 0;
layer.Viewport[0] = leftRect;
layer.Viewport[1] = rightRect;
}
Code: Select all
void yGraphicsOculusVR::update(){
if( mSubmit ){
ts = ovr_GetTrackingState(session, currentFrameDisplayTime = ovr_GetPredictedDisplayTime(session, 0), ovrTrue);
pose = ts.HeadPose.ThePose;
ovr_CalcEyePoses( pose, offset.data(), layer.RenderPose );
mCameraNode->setOrientation( oculusToOgreQuat(pose.Orientation) );
mCameraNode->setPosition( oculusToOgreVect3(pose.Position) );
//copy ogre textures to oculus swap chain
int currentIndex = 0;
ovr_GetTextureSwapChainCurrentIndex(session, textureSwapchain, ¤tIndex);
ID3D11Resource* oculusTexture;
mRenderTargetViews[currentIndex]->GetResource(&oculusTexture);
ID3D11DeviceContext* context;
Ogre::D3D11RenderSystem* renderSystem = dynamic_cast<Ogre::D3D11RenderSystem*>( Ogre::Root::getSingletonPtr()->getRenderSystem() );
renderSystem->_getDevice()->GetImmediateContext(&context);
context->CopyResource( oculusTexture, static_cast<Ogre::D3D11TextureGpu*>(mEyesRenderTexture)->getFinalTextureName() );
ovrResult result = ovr_CommitTextureSwapChain(session, textureSwapchain);
if (OVR_FAILURE(result))
{
ovrErrorInfo errorInfo;
ovr_GetLastErrorInfo(&errorInfo);
}
ovrLayerHeader* layers = &layer.Header;
result = ovr_SubmitFrame(session, 0, nullptr, &layers, 1);
if (OVR_FAILURE(result))
{
ovrErrorInfo errorInfo;
ovr_GetLastErrorInfo(&errorInfo);
}
}
}
the problem is that I get no image in the headset =(
I summon you al2950! =D
thank you so much in advance!
Edit: in debug build I can see something, like half of each eye fill with a solid of some of the color of the image