В общем, решил все статические объекты сохранять в текстуру, а перемещаемые блоки рисовать поверх нее. Работает относительно быстро, несмотря на слабую видяху и большой размер текстуры, в общем, меня бы это удовлетворило, если бы текстура не содержала черный цвет (иногда с небольшой полоской сверху слева, залитая текущим цветом) вместо скрина экрана.
Привожу код.
Инициализация текстуры при изменении размеров формы:
Код:
private void InitTexture()
{
Gl.glEnable(Gl.GL_TEXTURE_2D);
Gl.glGenTextures(1, out RenderTex);
Gl.glBindTexture(Gl.GL_TEXTURE_2D, RenderTex);
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);
Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGB, 2048, 2048, 0, Gl.GL_RGB, Gl.GL_UNSIGNED_BYTE, null);
err = Gl.glGetError();
Gl.glDisable(Gl.GL_TEXTURE_2D);
}
Рисование сцены:
Код:
private void Draw()
{
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT /*| Gl.GL_DEPTH_BUFFER_BIT*/);
Gl.glCallList(_genList); // Background
Gl.glCallList(_genList + 1); // Grid
DrawBlocks(); // Objects
if (needTexInit)
{
Gl.glReadBuffer(Gl.GL_BACK);
Gl.glBindTexture(Gl.GL_TEXTURE_2D, RenderTex);
Gl.glCopyTexSubImage2D(Gl.GL_TEXTURE_2D, 0, 0, 0, 0, 0, 2048, 2048); //ScreenShot
needTexInit = false;
}
glControl.SwapBuffers();
allowMouseMove = true;
}
И перемещение объектов:
Код:
private void glControl_MouseMove(object sender, MouseEventArgs e)
{
if (!allowMouseMove)
return;
mousePosition = glControl.PointToClient(Cursor.Position);
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT /*| Gl.GL_DEPTH_BUFFER_BIT*/);
Gl.glColor4f(1f, 1f, 1f, 1f); // Current color
if (startMouseMove)
{
Gl.glEnable(Gl.GL_TEXTURE_2D);
Gl.glBindTexture(Gl.GL_TEXTURE_2D, RenderTex);
Gl.glBegin(Gl.GL_QUADS);
Gl.glTexCoord2dv(new double[] { 0.0, 0.0 });
Gl.glVertex2d(0, 0);
Gl.glTexCoord2dv(new double[] { 1.0, 0.0 });
Gl.glVertex2d(2048, 0);
Gl.glTexCoord2dv(new double[] { 1.0, 1.0 });
Gl.glVertex2d(2048, 2048);
Gl.glTexCoord2dv(new double[] { 0.0, 1.0 });
Gl.glVertex2d(0, 2048);
Gl.glEnd();
Gl.glDisable(Gl.GL_TEXTURE_2D);
}
else
{
startMouseMove = true;
}
DrawFramesFill(mousePosition, 1);
glControl.SwapBuffers();
mousePositionPrev = mousePosition;
}
На ошибки проверял - их нету.
Что может быть не так?
У меня подозрение, что та полосочка - и есть наложенная текстура, но почему тогда она таких размеров и однородным цветом?