1.HolographicSpace class
CreateForCoreWindow :首先创建一个HolographicSpace与指定窗口的CoreApplicationView相对应
2.SpatialLocator class
GetDefault : 得到了SpatialLocator实例跟踪当前设备的位置,如全息透镜,相对于用户的环境。
3.每一帧都更新update
4.根据上面的图片 首先创建HolographicFrame类型的变量 保存下一帧图像
HolographicFrame类表示 “应用必须向所有照相机呈现的全息照相内容的帧”。
5.进入到EnsureCameraResources函数
pCameraResources->CreateResourcesForBackBuffer(this, renderingParameters);
下面进入这个函数
// Updates resources associated with a holographic camera's swap chain.
// The app does not access the swap chain directly, but it does create
// resource views for the back buffer.
void DX::CameraResources::CreateResourcesForBackBuffer(
DX::DeviceResources* pDeviceResources,
HolographicCameraRenderingParameters^ cameraParameters
)
{
const auto device = pDeviceResources->GetD3DDevice(); //获取一个3D设备描述符
// Get the WinRT object representing the holographic camera's back buffer.
IDirect3DSurface^ surface = cameraParameters->Direct3D11BackBuffer;
// Get a DXGI interface for the holographic camera's back buffer.
// Holographic cameras do not provide the DXGI swap chain, which is owned
// by the system. The Direct3D back buffer resource is provided using WinRT
// interop APIs.
ComPtr<ID3D11Resource> resource;
ThrowIfFailed(
GetDXGIInterfaceFromObject(surface, IID_PPV_ARGS(&resource))
);
// Get a Direct3D interface for the holographic camera's back buffer.
ComPtr<ID3D11Texture2D> cameraBackBuffer;
ThrowIfFailed(
resource.As(&cameraBackBuffer)
);
// Determine if the back buffer has changed. If so, ensure that the render target view
// is for the current back buffer.
if (m_d3dBackBuffer.Get() != cameraBackBuffer.Get())
{
// This can change every frame as the system moves to the next buffer in the
// swap chain. This mode of operation will occur when certain rendering modes
// are activated.
m_d3dBackBuffer = cameraBackBuffer;
// Create a render target view of the back buffer.
// Creating this resource is inexpensive, and is better than keeping track of
// the back buffers in order to pre-allocate render target views for each one.
DX::ThrowIfFailed(
device->CreateRenderTargetView(
m_d3dBackBuffer.Get(),
nullptr,
&m_d3dRenderTargetView
)
);
// Get the DXGI format for the back buffer.
// This information can be accessed by the app using CameraResources::GetBackBufferDXGIFormat().
D3D11_TEXTURE2D_DESC backBufferDesc;
m_d3dBackBuffer->GetDesc(&backBufferDesc);
m_dxgiFormat = backBufferDesc.Format;
// Check for render target size changes.
Windows::Foundation::Size currentSize = m_holographicCamera->RenderTargetSize;
if (m_d3dRenderTargetSize != currentSize)
{
// Set render target size.
m_d3dRenderTargetSize = currentSize;
// A new depth stencil view is also needed.
m_d3dDepthStencilView.Reset(); //创建一个新的深度图
}
}
// Refresh depth stencil resources, if needed.
if (m_d3dDepthStencilView == nullptr)
{
// Create a depth stencil view for use with 3D rendering if needed.
CD3D11_TEXTURE2D_DESC depthStencilDesc(
DXGI_FORMAT_D16_UNORM,
static_cast<UINT>(m_d3dRenderTargetSize.Width),
static_cast<UINT>(m_d3dRenderTargetSize.Height),
m_isStereo ? 2 : 1, // Create two textures when rendering in stereo.
1, // Use a single mipmap level.
D3D11_BIND_DEPTH_STENCIL
);
ComPtr<ID3D11Texture2D> depthStencil;
DX::ThrowIfFailed(
device->CreateTexture2D(
&depthStencilDesc,
nullptr,
&depthStencil
)
);
CD3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc(
m_isStereo ? D3D11_DSV_DIMENSION_TEXTURE2DARRAY : D3D11_DSV_DIMENSION_TEXTURE2D
);
DX::ThrowIfFailed(
device->CreateDepthStencilView(
depthStencil.Get(),
&depthStencilViewDesc,
&m_d3dDepthStencilView
)
);
}
// Create the constant buffer, if needed.
if (m_viewProjectionConstantBuffer == nullptr)
{
// Create a constant buffer to store view and projection matrices for the camera.
CD3D11_BUFFER_DESC constantBufferDesc(sizeof(ViewProjectionConstantBuffer), D3D11_BIND_CONSTANT_BUFFER);
DX::ThrowIfFailed(
device->CreateBuffer(
&constantBufferDesc,
nullptr,
&m_viewProjectionConstantBuffer
)
);
}
}
sufaceMesh.cpp
此部分功能为加载红色未扫描的部分
此部分
SimpleLightingPixelShader
此shder为填充线条的shader 可自行改变颜色 但是改变一次无法改回来