2015-11-15 1 views
1

Я пытаюсь сделать 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), и я не могу понять, почему. До этого момента все остальное выглядит хорошо.

Любая помощь приветствуется.

ответ

0

Обнаружена проблема. Вместо вызова glCopyTexImage2D (который создает новую текстуру) необходимо использовать glCopyTexSubImage2D:

glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, width, height);