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: востановление поврежденных участков экрана |
ахаха Работает нормально, а после двойного щелчка мыши ничего страшного не случилось - просто цвета меняются в зависимости от положения мыши. А что ты вообще хочешь сделать то в итоге. Микроплату какую-то? |
Автор: | 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. Ну собственно с моим компом твой старый вариант наверно тоже не тормозил бы |
Страница 4 из 5 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |