Class GraphicsBindingSimD3d11
Graphics API binding for local simulation.
This graphics binding is used to render a monoscopic remote image on a normal desktop application. With no sensors to provide head movement available, this binding requires the user to provide a current camera update each frame. The basic setup works as follow:
Remote and local content is rendered onto an off-screen color / depth render target called 'proxy' using the proxy camera provided by the Update function. The proxy needs to be created matching the resolution of the back-buffer. Before any rendering takes place, InitSimulation() needs to be called with the proxy texture handles, as well as a D3D device to fully initialize the simulation.
Each frame, before any rendering takes place, Update is called with the current camera transform and the returned proxy transform is applied to the proxy camera.
At the start of rendering into the proxy, GraphicsBindingSimD3d11.BlitRemoteFrameToProxy needs to be called, this fills the remote color and depth information into the proxy render targets. Any local content can now be rendered onto the proxy using the proxy camera.
Once the back-buffer is bound, only GraphicsBindingSimD3d11.ReprojectProxy needs to be called and no other rendering should take place.
Repeat with step 2 until session ends.
Call GraphicsBindingSimD3d11.DeinitSimulation after the remote session has ended.
class Microsoft::Azure::RemoteRendering::GraphicsBindingSimD3d11 final : public Microsoft::Azure::RemoteRendering::GraphicsBinding
Methods
BlitRemoteFrameToProxy
Blits the current remote frame to the currently bound render target.
When this function is executed it is assumed that the proxy color and depth buffers are bound as the current render target. This should be done as the very first thing in each frame as this function will overwrite all content in the target buffers.
auto BlitRemoteFrameToProxy() noexcept -> Microsoft::Azure::RemoteRendering::Result;
Returns
Type | Description |
---|---|
Result | Result.Success, Result.NotInitialized, Result.Fail, Result.NoConnection |
DeinitSimulation
Deinitializes the simulation. Needs to be called after a remote rendering session has ended.
auto DeinitSimulation() noexcept -> Microsoft::Azure::RemoteRendering::Result;
Returns
Type | Description |
---|---|
Result | Result.Success, Result.NotInitialized, Result.Fail |
GetRemoteFocusPoint
Retrieves the remote focus point.
This focus point must be explicitly set as the focus point to be used.
A Result.NoConnection error occurs if this is called while there is no connection to the server.
auto GetRemoteFocusPoint(Microsoft::Azure::RemoteRendering::Float3* position, Microsoft::Azure::RemoteRendering::Float3* normal, Microsoft::Azure::RemoteRendering::Float3* velocity) noexcept -> Microsoft::Azure::RemoteRendering::FocusPointResult;
Parameters
Name | Type | Description |
---|---|---|
position |
Float3 | The focus point's position in world-space. |
normal |
Float3 | The focus point's normal in world-space. |
velocity |
Float3 | The focus point's velocity measured in units per second, in world-space. |
Returns
Type | Description |
---|---|
FocusPointResult | How to interpret the point data. If FocusPointResult.Invalid is returned, the data should not be used. |
InitSimulation
Initializes the simulation. Needs to be called before a remote rendering session is started.
auto InitSimulation(void* d3dDevice, void* proxyDepth, void* proxyColor, float refreshRate, bool flipBlitRemoteFrameTextureVertically, bool flipReprojectTextureVertically, bool stereo) noexcept -> Microsoft::Azure::RemoteRendering::Result;
Parameters
Name | Type | Description |
---|---|---|
d3dDevice |
System.IntPtr | The d3d device that will be used to render the remote image. |
proxyDepth |
System.IntPtr | Depth texture of the proxy render-target. |
proxyColor |
System.IntPtr | Color texture of the proxy render-target. The minimum dimension of the texture is 256x256. |
refreshRate |
float | Target refresh rate at which the remote runtime should render. |
flipBlitRemoteFrameTextureVertically |
bool | If set, will flip the rendered image vertically. |
flipReprojectTextureVertically |
bool | If set, will flip the rendered image vertically. |
stereo |
bool | Simulation will use stereoscopic rendering if set to true. The proxy textures need to have two array layers in this case! |
Returns
Type | Description |
---|---|
Result | Result.Success, Result.NotInitialized, Result.Fail, Result.InvalidParam, Result.UnsupportedDisplayAdapter |
InitSimulation
Initializes the simulation. Needs to be called before a remote rendering session is started. This is an alternative initialization call, where no proxy targets are configured. Therefore, local pose mode will be forced and GraphicsBindingSimD3d11.ReprojectProxy will essentially become a no-op. The caller is expected to bind the final render target before calling GraphicsBindingSimD3d11.BlitRemoteFrameToProxy.
auto InitSimulation(void* d3dDevice, int32_t renderTargetWidth, int32_t renderTargetHeight, float refreshRate, bool flipBlitRemoteFrameTextureVertically, bool flipReprojectTextureVertically, bool stereo) noexcept -> Microsoft::Azure::RemoteRendering::Result;
Parameters
Name | Type | Description |
---|---|---|
d3dDevice |
System.IntPtr | The d3d device that will be used to render the remote image. |
renderTargetWidth |
int | The width of the final render target (minimum: 256). |
renderTargetHeight |
int | The heigth of the final render target (minimum: 256). |
refreshRate |
float | Target refresh rate at which the remote runtime should render. |
flipBlitRemoteFrameTextureVertically |
bool | If set, will flip the rendered image vertically. |
flipReprojectTextureVertically |
bool | If set, will flip the rendered image vertically. |
stereo |
bool | Simulation will use stereoscopic rendering if set to true. The final render target needs to have two array layers in this case! |
Returns
Type | Description |
---|---|
Result | Result.Success, Result.NotInitialized, Result.Fail, Result.InvalidParam, Result.UnsupportedDisplayAdapter |
ReprojectProxy
Reprojects the proxy color texture onto the back-buffer.
When this function is executed it is assumed that the back-buffer color and depth buffers are bound as the current render target. This should be done as the very last thing in each frame.
auto ReprojectProxy() noexcept -> Microsoft::Azure::RemoteRendering::Result;
Returns
Type | Description |
---|---|
Result | Result.Success, Result.NotInitialized, Result.Fail, Result.NoConnection |
Update
Needs to be called every frame.
Typically there are multiple frames in flight. The frame data that is received and rendered locally, is always lagging behind a bit. Therefore, when calling Update() you need to specify the latest matrices with which the server should render that frame, but the matrices that you need to use for rendering local contant have to match the ones that were used for the currently arriving video frame. Therefore ARR provides you with that information through the proxyFrameUpdate parameter, so that you don't need to keep track of old rendering matrices yourself.
auto Update(Microsoft::Azure::RemoteRendering::SimulationUpdateParameters updateParameters, Microsoft::Azure::RemoteRendering::SimulationUpdateResult* proxyFrameUpdateResult) noexcept -> Microsoft::Azure::RemoteRendering::Result;
Parameters
Name | Type | Description |
---|---|---|
updateParameters |
SimulationUpdateParameters | The update parameters of the main camera. This information will be sent to the server for rendering. |
proxyFrameUpdateResult |
SimulationUpdateResult | The camera update for the proxy. Matches the current remote frame and needs to be applied locally. |
Returns
Type | Description |
---|---|
Result | Result.Success, Result.NotInitialized, Result.Fail, Result.NoConnection, Result.InvalidParam |