Я пытаюсь сделать DirectX - OpenGL interop для работы, без успеха до сих пор. В моем случае рендеринг выполняется в OpenGL (по библиотеке OSG), и я бы хотел, чтобы получилось изображение как DirectX Texture2D. То, что я пытаюсь до сих пор:DX11 OpenGL interop: не могу скопировать буфер
Initialization:
ID3D11Device *dev3D;
// init dev3D with D3D11CreateDevice
ID3D11Texture2D *dxTexture2D;
// init dxTexture2D with CreateTexture2D, with D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE
HANDLE hGlDev = wglDXOpenDeviceNV(dev3D);
GLuint glTex;
glGenTextures(1, &glTex);
HANDLE hGLTx = wglDXRegisterObjectNV(hGlDev, (void*) dxTexture2D, glTex, GL_TEXTURE_2D, WGL_ACCESS_READ_WRITE_NV);
На каждом кадре, вынесенным OSG камерой я получаю обратный вызов. Сначала я начинаю с glReadBuffer(GL_FRONT)
, и, кажется, все в порядке до этой точки, так как я могу прочитать полученный буфер в памяти с помощью glReadPixels
. Проблема заключается в том, что я не могу скопировать пиксели ранее созданный GL_TEXTURE_2D
:
BOOL lockOK = wglDXLockObjectsNV(hGlDev, 1, &hGLTx);
glBindTexture(GL_TEXTURE_2D, glTex);
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, width, height, 0);
auto err = glGetError();
последний вызов glCopyTexImage2D
создает ошибку 0x502 (GL_INVALID_OPERATION
), и я не могу понять, почему. До этого момента все остальное выглядит хорошо.
Любая помощь приветствуется.