Я пишу графический интерфейс, который использует OpenGL через OpenTK и GLControl на C #, и я пытаюсь использовать грязные прямоугольники для рисования только тех элементов управления, которые необходимо нарисовать. Очевидно, что неразумно перерисовывать всю развернутую форму только для обновления кнопки наведения мыши.
Моя первая попытка состояла в том, чтобы использовать glScissors, но это не ограничивает SwapBuffers, которые на моей платформе, как я подозреваю (из-за того, что производительность почти полностью зависит от размера окна) не «свопируются», а делают полную копию назад буфер на передний буфер.
Второй попыткой был glAddSwapHintRectWIN, который теоретически ограничил бы область подкачки (в данном случае скопированную) SwapBuffers, но это только подсказка, и она вообще ничего не делает.
Третьей попыткой было glDrawBuffer скопировать часть заднего буфера в буфер кадра, по какой-то неизвестной причине, даже когда я копирую только часть буфера, производительность все равно снижается так же, как и раньше, когда размер окна увеличивается.
Похоже, что полное обновление области все еще происходит независимо от того, что я делаю.
Итак, я пытаюсь использовать glReadPixels() и каким-то образом получить указатель для рисования непосредственно на пиксельных данных hdc, полученных из CreateGraphics() элемента управления. Это возможно?
ИЗМЕНИТЬ:
Я думаю, что что-то не так с GLControl, почему производительность этого кода зависит от размера экрана, я не делаю никаких свопбуферов или очисток, просто рисую треугольник постоянного размера на переднем буфере: Может быть, проблема с драйвером?
GL.DrawBuffer(DrawBufferMode.Front);
Vector4 Color;
Color = new Vector4((float)R.NextDouble(), 0, 0, 0.3F);
GL.Begin(BeginMode.Triangles);
GL.Color4(Color.X, Color.Y, Color.Z, Color.W);
GL.Vertex3(50, 50, 0);
GL.Vertex3(150F, 50F, 0F);
GL.Vertex3(50F, 150F, 0F);
GL.End();
GL.Finish();
РЕДАКТИРОВАТЬ 2 Это решение нежизнеспособно: рисование на текстуре и использование glGetTexImage для рисования на растровом изображении GDI, а затем рисование этого растрового изображения на окне HDC
Чтение пикселей буфера из буфера с помощью glReadPixels в растровое изображение GDI и последующее рисование этого растрового изображения на HDC окна.
Разделение окна на сетку окон просмотра и обновление только ячеек, содержащих грязный прямоугольник
GL.GetString(StringName.Renderer)
? - person The Fiddler   schedule 26.03.2014