PMG
https://forum.pmg.org.ru/

glCopyTexImage2D: востановление поврежденных участков экрана
https://forum.pmg.org.ru/viewtopic.php?f=1&t=6812
Страница 4 из 5

Автор:  bad_duck [ 20 июн 2009 17:05 ]
Заголовок сообщения:  Re: glCopyTexImage2D: востановление поврежденных участков экрана

Vitone, а у тебя точно вьюпорт настроен под твою текстуру 2048 на 2048?
Код:
glViewport(0, 0, 2048, 2048);

Автор:  Vitone [ 21 июн 2009 21:50 ]
Заголовок сообщения:  Re: glCopyTexImage2D: востановление поврежденных участков экрана

Нет, вьюпорт у меня настроен под размер окна и это логично, иначе картинка искривляется (вытягивается\сжимается). Но все же, даже если выставить 2048, проблему это не решает - текстура содержит мусор.

Автор:  Vitone [ 21 июн 2009 22:43 ]
Заголовок сообщения:  Re: glCopyTexImage2D: востановление поврежденных участков экрана

Закоментил условие if (needTexInit) - заработало, но текстура почему-то перевернутая. Попытался перевернуть ее и в результате получил черный фон. Видимо, это неиспользуемая часть текстуры отображается:
Код:
                 if (startMouseMove)
                 {
                     Gl.glMatrixMode(Gl.GL_PROJECTION);
                     Gl.glPushMatrix();
                     Gl.glMatrixMode(Gl.GL_MODELVIEW);
                     Gl.glPushMatrix();
                     Gl.glScalef(1, -1, 1);

                     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(size, 0);
                     Gl.glTexCoord2dv(new double[] { 1.0, 1.0 });
                     Gl.glVertex2d(size, size);
                     Gl.glTexCoord2dv(new double[] { 0.0, 1.0 });
                     Gl.glVertex2d(0, size);
                     Gl.glEnd();
                     Gl.glDisable(Gl.GL_TEXTURE_2D);

                     Gl.glMatrixMode(Gl.GL_PROJECTION);
                     Gl.glPopMatrix();
                     Gl.glMatrixMode(Gl.GL_MODELVIEW);
                     Gl.glPopMatrix();
                 }


Что ж я делаю не так?
Думаю стоит привести функцию изменения размера окна:
Код:
            private void Resize(int width, int height)
            {
                if (height == 0)
                {
                    height = 1;
                }
                Gl.glMatrixMode(Gl.GL_PROJECTION);
                Gl.glLoadIdentity();
                Glu.gluOrtho2D(0, width, height, 0); // Top-left corner pixel has coordinate (0, 0)
                Gl.glViewport(0, 0, width, height);
                Gl.glMatrixMode(Gl.GL_MODELVIEW);
                Gl.glLoadIdentity();

                BuildLists();
                InitTexture();
                Draw();
            }

Автор:  Vitone [ 21 июн 2009 23:05 ]
Заголовок сообщения:  Re: glCopyTexImage2D: востановление поврежденных участков экрана

Как я и догадался, все проблемы из-за перевернутой системы координат. Сделал ее нормальной относительно ОЖЛ - все работает правильно, только отсчитывать снизу вверх ох как не удобно.

Скорость работы меня радует, и процессор грузится на 10-15% при интенсивном перемещении.
В GDI+ это бы загрузило на процентов 50, если не больше и заметно как дергаются перемещаемые объекты.

Но вот еще масштабирование не правильно работает - текстура также масштабируется, но мне нужно сделать скрин отмасштабированого рисунка. Придется реализовать его мат. средствами, а не ОЖЛ?
private void glControl_KeyDown(object sender, KeyEventArgs e)
{
double scale = 0.9;
if (e.KeyCode == Keys.Z)
{
Gl.glScaled(1.0 / scale, 1.0 / scale, 1.0 / scale);
glControl.Invalidate();
}
else if (e.KeyCode == Keys.X)
{
Gl.glScaled(scale, scale, scale);
glControl.Invalidate();
}

Автор:  bad_duck [ 22 июн 2009 10:09 ]
Заголовок сообщения:  Re: glCopyTexImage2D: востановление поврежденных участков экрана

Ну да, комп все правильно делает. Ты использовал Gl.glScaled для блоков, а для скрина нужно вернуть матрицу в начальное положение домножив на противоположенное Gl.glScaled.
Вот поэтому вместо
Код:
if (startMouseMove)
                 {
                     Gl.glMatrixMode(Gl.GL_PROJECTION);
                     Gl.glPushMatrix();
                     Gl.glMatrixMode(Gl.GL_MODELVIEW);
                     Gl.glPushMatrix();
                     Gl.glScalef(1, -1, 1);
                         ...

я использую этот код для отрисовки скрина
Код:
glViewport(0, 0, WindowW, WindowH);
      glMatrixMode(GL_PROJECTION);
      glLoadIdentity();
      glOrtho(0.0, 1.0, 1.0, 0.0, -1.0, 1.0);   
      glMatrixMode(GL_MODELVIEW);
      glLoadIdentity();

      glBindTexture(GL_TEXTURE_2D, pass_texture0);
      glBegin(GL_QUADS);
         glTexCoord2i(0, 0); glVertex2i(0, 1);
         glTexCoord2i(1, 0); glVertex2i(1, 1);
         glTexCoord2i(1, 1); glVertex2i(1, 0);
         glTexCoord2i(0, 1); glVertex2i(0, 0);
      glEnd();

Тут загружается пустая матрица и нет никаких проблем с преобразованиями

Автор:  Vitone [ 22 июн 2009 13:05 ]
Заголовок сообщения:  Re: glCopyTexImage2D: востановление поврежденных участков экрана

Ребята, всем большое спасибо, задача практически решена, остались только мелочи жизни :)

Автор:  Vitone [ 25 июн 2009 12:14 ]
Заголовок сообщения:  Re: glCopyTexImage2D: востановление поврежденных участков экрана

Написал класс слоя, который исходя из размеров окна и максимально возможного размера текстуры, поддерживаемого системой, формирует 2х мерный массив текстур, в который копируется\восстанавливается экран. Если экран помещается в несколько текстур (в подавляющем количестве случаев - достаточно одной), то работает просто замечательно. Если кому нужно, могу поделится, правда код еще совсем сырой. Использовал C#+Tao.Framework.

Автор:  bad_duck [ 25 июн 2009 14:40 ]
Заголовок сообщения:  Re: glCopyTexImage2D: востановление поврежденных участков экрана

Vitone, ты можешь выложить на файлообменник ехе того что ты сделал. Интересно что получилось.

Автор:  Vitone [ 25 июн 2009 16:43 ]
Заголовок сообщения:  Re: glCopyTexImage2D: востановление поврежденных участков экрана

Знаю вас, декомпилеров))))
Предупреждаю сразу - это тестовая прога.
Блоки могут выделятся. Ни в коем случае не делайте дабл клик, а то офигеете!
http://upload.com.ua/get/900926003/

Автор:  bad_duck [ 25 июн 2009 18:51 ]
Заголовок сообщения:  Re: glCopyTexImage2D: востановление поврежденных участков экрана

ахаха :post:
Работает нормально, а после двойного щелчка мыши ничего страшного не случилось - просто цвета меняются в зависимости от положения мыши. А что ты вообще хочешь сделать то в итоге. Микроплату какую-то?

Автор:  MagicWolf [ 26 июн 2009 09:03 ]
Заголовок сообщения:  Re: glCopyTexImage2D: востановление поврежденных участков экрана

Все работает. Очень напоминает среду для программирования контроллеров.

Автор:  Vitone [ 26 июн 2009 10:20 ]
Заголовок сообщения:  Re: glCopyTexImage2D: востановление поврежденных участков экрана

MagicWolf писал(а):
Очень напоминает среду для программирования контроллеров.

Ну дык так оно и есть)))
Это будущий редактор FBD-программ, который зачастую используется для программирования контроллеров. Только в моем случае он будет использоваться в SCADA-системе.

Протестируйте, пожалуйста, приложения с большим разрешением экрана, если это возможно, мне интересно знать насколько хорошо работает с другими характеристиками системы. Попробовал на 17" мониторе с более слабым процессором - немного огорчился, хотя все равно значительно лучше работает чем в GDI+.

bad_duck писал(а):
после двойного щелчка мыши ничего страшного не случилось - просто цвета меняются в зависимости от положения мыши

Таким образом я хотел найти оптимальный цвет =)
Бредовая идея была =)

Автор:  bad_duck [ 26 июн 2009 11:00 ]
Заголовок сообщения:  Re: glCopyTexImage2D: востановление поврежденных участков экрана

Цитата:
Протестируйте, пожалуйста, приложения с большим разрешением экрана, если это возможно, мне интересно знать насколько хорошо работает с другими характеристиками системы

у меня разрешение 1440х900, всё пашет

Автор:  Vitone [ 26 июн 2009 11:05 ]
Заголовок сообщения:  Re: glCopyTexImage2D: востановление поврежденных участков экрана

bad_duck писал(а):
у меня разрешение 1440х900, всё пашет

Та пахать то оно будет.
Сильно заметно как мерцает прямоугольник?
Какие проц и видяха?
Спасибо.

Автор:  bad_duck [ 26 июн 2009 12:18 ]
Заголовок сообщения:  Re: glCopyTexImage2D: востановление поврежденных участков экрана

ничего вообще не мерцает. Только постоянно синий прямоуголдьник к мышке прикреплен.
Проц 3,9 ГГц, память 2 ГБ, видяха GeForce 6800 GS. Ну собственно с моим компом твой старый вариант наверно тоже не тормозил бы 8-)

Страница 4 из 5 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/