У меня есть приложение, которое использует OpenGL довольно простым способом для рендеринга текстурированных квадов.
Он работает нормально при локальном запуске, но при удаленном запуске (Microsoft Remote Desktop) отображает пустые белые окна.
Мне было интересно, являются ли некоторые конфигурации, которые я сделал, прямой причиной этого, или это что-то более фундаментальное, что может быть решено только с помощью другого подхода, такого как использование Списки отображения или что-то типа того.
Мой код следует. Я инициализирую контексты так:
void InitWindow(HWND *hWnd, HDC *hDC, HGLRC *hRC)
{
*hDC = GetDC(*hWnd);
// set the pixel format for the DC
PIXELFORMATDESCRIPTOR pfd;
ZeroMemory(&pfd, sizeof(pfd));
pfd.nSize = sizeof(pfd);
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 24;
// pfd.cRedBits = 8;
// pfd.cGreenBits = 8;
// pfd.cBlueBits = 8;
pfd.cAlphaBits = 0;
pfd.cDepthBits = 0;
pfd.iLayerType = PFD_MAIN_PLANE;
int format = ChoosePixelFormat(*hDC, &pfd);
SetPixelFormat(*hDC, format, &pfd);
// create and enable the render context (RC)
*hRC = wglCreateContext(*hDC);
// make current context current
wglMakeCurrent(*hDC, *hRC);
}
И нарисуйте на экране так:
int Render(HWND hWnd, Raster* raster)
{
Size RasterSize = raster->GetSize();
HDC hDC = NULL;
HGLRC hRC = NULL;
// acquire DC, HGLRC for the window & make current
InitWindow(&hWnd, &hDC, &hRC);
GLenum raster_pixel_format = GL_BGRA_EXT;
GLint internal_format = GL_RGBA;
if (s_ClearBeforeDraw)
{
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
}
GLuint texture;
// allocate a texture name
glGenTextures(1, &texture);
glBindTexture (GL_TEXTURE_2D, texture);
glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexImage2D (GL_TEXTURE_2D, 0, internal_format,
RasterSize.width, RasterSize.height,
0, raster_pixel_format, GL_UNSIGNED_BYTE,
raster->GetData());
glBindTexture(GL_TEXTURE_2D, texture);
RECT wndRect;
::GetClientRect(hWnd, &wndRect);
GLsizei wndWidth = wndRect.right;
GLsizei wndHeight = wndRect.bottom;
glEnable(GL_TEXTURE_2D);
// this is usually stated in window coordinates,
// but since we know the raster gets its size from
// the window - we can use raster coordinates
glViewport(0, 0, RasterSize.width, RasterSize.height);
glBegin( GL_QUADS );
glTexCoord2d(0.0,0.0); glVertex2d(-1.0,+1.0);
glTexCoord2d(1.0,0.0); glVertex2d(+1.0,+1.0);
glTexCoord2d(1.0,1.0); glVertex2d(+1.0,-1.0);
glTexCoord2d(0.0,1.0); glVertex2d(-1.0,-1.0);
glEnd();
glDisable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, 0);
glDeleteTextures(1, &texture);
SwapBuffers(hDC);
wglMakeCurrent(NULL, NULL);
// Release the context handles if they aren't cached
wglDeleteContext(hRC);
ReleaseDC(hWnd, hDC);
return SUCCESS;
}
В RDP у вас обычно нет ускорения GPU. Я предлагаю вам получить Windows-версию программного растеризатора MesaGL и, в зависимости от того, используете ли вы соединение RDP, установить переменную среды PATH, чтобы найти альтернативный файл opengl32.dll, чтобы у вас был хороший программный рендер.
Других решений пока нет …