Поэтому я пытаюсь создать систему многоэкранного рендеринга в Unity, используя C#, но после того, как пришел к выводу, что (2017.1) видеопроигрыватель Unity с процессором Bound не способен отвечать требованиям производительности, я решил попытаться использовать аппаратно-ускоренное декодирование видео Intel в Unity в проекте, который можно найти здесь:
https://software.intel.com/en-us/articles/hardware-accelerated-video-decode-in-unity
После импорта в мой проект начальное воспроизведение работало до тех пор, пока я не понял, что все объекты воспроизведения фактически используют один и тот же ресурс общих текстур на нативном конце. Это не отвечает моим потребностям, так как мне нужно иметь возможность копировать эти текстуры, чтобы иметь возможность воспроизводить несколько медиа-файлов на любом количестве экранов.
Я ни в коем случае не беглый программист C ++, поэтому я не знаю, что нужно сделать, чтобы изменить и перекомпилировать dll для поддержки создания экземпляров (я кодирую в C#).
Открывая файл cpp, я вижу эти две функции
'' '
HRESULT CMediaPlayerPlayback::CreatePlaybackTexture(
UINT32 width,
UINT32 height,
void** ppvTexture)
{
NULL_CHK(ppvTexture);
if (width < 1 || height < 1)
IFR(E_INVALIDARG);
*ppvTexture = nullptr;
// create the video texture description based on texture format
m_textureDesc = CD3D11_TEXTURE2D_DESC(DXGI_FORMAT_B8G8R8A8_UNORM, width, height);
m_textureDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
m_textureDesc.MipLevels = 1;
m_textureDesc.MiscFlags = D3D11_RESOURCE_MISC_SHARED | D3D11_RESOURCE_MISC_SHARED_NTHANDLE;
m_textureDesc.Usage = D3D11_USAGE_DEFAULT;
IFR(CreateTextures());
ComPtr<ID3D11ShaderResourceView> spSRV;
IFR(m_primaryTextureSRV.CopyTo(&spSRV));
*ppvTexture = spSRV.Detach();
return S_OK;
}
HRESULT CMediaPlayerPlayback::CreateTextures()
{
if (nullptr != m_primaryTexture || nullptr != m_primaryTextureSRV)
ReleaseTextures();
// create staging texture on unity device
ComPtr<ID3D11Texture2D> spTexture;
IFR(m_d3dDevice->CreateTexture2D(&m_textureDesc, nullptr, &spTexture));
auto srvDesc = CD3D11_SHADER_RESOURCE_VIEW_DESC(spTexture.Get(), D3D11_SRV_DIMENSION_TEXTURE2D);
ComPtr<ID3D11ShaderResourceView> spSRV;
IFR(m_d3dDevice->CreateShaderResourceView(spTexture.Get(), &srvDesc, &spSRV));
// create shared texture from the unity texture
ComPtr<IDXGIResource1> spDXGIResource;
IFR(spTexture.As(&spDXGIResource));
HANDLE sharedHandle = INVALID_HANDLE_VALUE;
ComPtr<ID3D11Texture2D> spMediaTexture;
ComPtr<IDirect3DSurface> spMediaSurface;
HRESULT hr = spDXGIResource->CreateSharedHandle(
nullptr,
DXGI_SHARED_RESOURCE_READ | DXGI_SHARED_RESOURCE_WRITE,
L"SharedTextureHandle",
&sharedHandle);
if (SUCCEEDED(hr))
{
ComPtr<ID3D11Device1> spMediaDevice;
hr = m_mediaDevice.As(&spMediaDevice);
if (SUCCEEDED(hr))
{
hr = spMediaDevice->OpenSharedResource1(sharedHandle, IID_PPV_ARGS(&spMediaTexture));
if (SUCCEEDED(hr))
{
hr = GetSurfaceFromTexture(spMediaTexture.Get(), &spMediaSurface);
}
}
}
// if anything failed, clean up and return
if (FAILED(hr))
{
if (sharedHandle != INVALID_HANDLE_VALUE)
CloseHandle(sharedHandle);
IFR(hr);
}
m_primaryTexture.Attach(spTexture.Detach());
m_primaryTextureSRV.Attach(spSRV.Detach());
m_primarySharedHandle = sharedHandle;
m_primaryMediaTexture.Attach(spMediaTexture.Detach());
m_primaryMediaSurface.Attach(spMediaSurface.Detach());
return hr;
}
' ''
Какие части этих две функции мне нужно изменить, чтобы позволить создание экземпляров каждой вновь созданной текстуры?