У меня есть приложение для Windows, которое может создавать несколько окон просмотра, которые могут отображать некоторые модели с использованием OpenGL (3.2+). Каждое окно может отображать свой собственный независимый объект, или два (или более) окна могут отображать один и тот же объект (но, например, с разных точек зрения камеры):
После прочтения различных сообщений здесь, в stackoverflow, я решил создать единый контекст OpenGL (HGLRC) и для каждого окна, в которое я отображаю (HDC), я переключаюсь с помощью
wglMakeCurrent(targetWindowHDC, m_deviceContext)
Как вы можете видеть на снимке экрана, в принципе это работает нормально (код окна выполняется в основном потоке, а для рендеринга у меня есть собственный RenderThread, которым ограничены все операции OpenGL). Для каждого из окон я визуализирую в FBO (который имеет поддержку MSAA, если пользователь активирует его), который обновляется только в случае изменения чего-либо в сцене, в противном случае он просто отрисовывает его в окно как есть.
Теперь мой вопрос: какие состояния мне нужно устанавливать каждый раз, когда я переключаюсь на рисование в другом окне? И разумен ли мой подход с точки зрения производительности?
Это то, что я теперь устанавливаю каждый раз после того, как делаю контекст текущим для другого HDC:
glClearDepth( 1.0f );
glClearColor( color.r, color.g, color.b, 1.0f );
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
glDepthFunc(GL_LEQUAL);
glDepthRange(0.0f, 1.0f);
glPointSize(3.0f);
glEnable(GL_BLEND);
glBlendFunc( srcBlend, dstBlend );
glPolygonMode( GL_FRONT_AND_BACK, targetType );
glEnable( GL_CULL_FACE );
glCullFace( GL_BACK );
glViewport( 0, 0, vp.width, vp.height );
Это в основном все настройки, которые могут быть изменены, когда пользователь настраивает окна рендеринга, поэтому мне нужно убедиться, что они установлены правильно перед рендерингом каждого окна.
Но действительно ли необходимо делать все эти звонки? Это означает, что в приведенном выше примере с 4 окнами рендеринга мне нужно вызывать их 4 раза в каждом кадре. Есть ли способ лучше? Будет ли это более эффективно с несколькими контекстами GL?