Использую .Net + Tao.Framework.
Рисую много объектов, которые можно перемещать мышкой, то есть в маусмуве нужно переисовывать все изображение.
Но поскольку объекты содержат много текста, это все подтормаживает, хуже чем в жди+.
Решил перемещать не просто полупрозрачный прямоугольник (как изначально хотел), а реверсивную рамку.
Работает замечательно, но не красиво. Потом мне посоветовали использовать glCopyTexImage2D, но у меня ничего не вышло - вместо наложения текстуры - черный прямоугольник.
Идея следующая: перед тем как выводить перемещаемый объект(объекты), сначала записать в текстуру фрагмент изображения под ним, а потом когда мышь переместится - обновить участок. Работает быстро и замечательно, только обновляется не тем...
Вот мой код (возможно логика задачи и нарушена, но вопрос в том, почему вместо текстуры черный прямоугольник):
Код:
bool startMouseMove=false;
int RenderTex;
private void glControl_MouseMove(object sender, MouseEventArgs e)
{
Gl.glReadBuffer(Gl.GL_FRONT);
Gl.glDrawBuffer(Gl.GL_FRONT);
mousePosition = glControl.PointToClient(Cursor.Position);
if (startMouseMove)
{
//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.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_CLAMP);
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_CLAMP);
Gl.glCopyTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGB,
mousePositionPrev.X - 35, mousePositionPrev.Y - 60, 70, 120, 1);
Gl.glBegin(Gl.GL_QUADS);
Gl.glTexCoord2dv(new double[] { 0.0, 0.0 });
Gl.glVertex2d(mousePositionPrev.X-35, mousePositionPrev.Y-60);
Gl.glTexCoord2dv(new double[] { 1.0, 0.0 });
Gl.glVertex2d(mousePositionPrev.X-35 + 70, mousePositionPrev.Y-60);
Gl.glTexCoord2dv(new double[] { 1.0, 1.0 });
Gl.glVertex2d(mousePositionPrev.X-35 + 70, mousePositionPrev.Y -60 + 120);
Gl.glTexCoord2dv(new double[] { 0.0, 1.0 });
Gl.glVertex2d(mousePositionPrev.X-35, mousePositionPrev.Y -60 + 120);
Gl.glEnd();
}
else
{
startMouseMove = true;
}
mousePositionPrev = mousePosition;
//DrawFrames(mousePosition, 1);
Gl.glFlush();
Gl.glDrawBuffer(Gl.GL_BACK);
Gl.glReadBuffer(Gl.GL_BACK);
}