PMG https://forum.pmg.org.ru/ |
|
glCopyTexImage2D: востановление поврежденных участков экрана https://forum.pmg.org.ru/viewtopic.php?f=1&t=6812 |
Страница 3 из 5 |
Автор: | Vitone [ 12 июн 2009 17:57 ] |
Заголовок сообщения: | Re: glCopyTexImage2D: востановление поврежденных участков экрана |
У меня нет поддержки FBO: Код: string extensions = Gl.glGetString(Gl.GL_EXTENSIONS); if (!extensions.Contains("GL_EXT_framebuffer_object")) { return; } Потому и FBO и PBuffer отпадает... даж не знаю что теперь делать... |
Автор: | bad_duck [ 12 июн 2009 19:06 ] |
Заголовок сообщения: | Re: glCopyTexImage2D: востановление поврежденных участков экрана |
оффтоп MagicWolf, у меня вопрос про multisampleFramebuffer раз речь зашла о фреймбуферах. Я наконец то сделал анти-алиасинг, все работает. Но почему то сглаживаются только грани фигур, а лесенки в текстурах не сглаживаются. Это так и должно быть? Мне просто нужно рисовать модели в одну текстуру, декали в другую и полупрозрачные объекты в третью текстуру. А потом их склеиваю, ну а потом уже пост эффекты. Поэтому не хочется использовать три multisampleFramebuffer. Есть ли какой способ обойтись одним. |
Автор: | bad_duck [ 12 июн 2009 20:59 ] |
Заголовок сообщения: | Re: glCopyTexImage2D: востановление поврежденных участков экрана |
И если не трудно, можешь объяснить как происходит сам процесс анти-алиасинга. Ну в смысле не как он "размазывает" пиксели, а отрисовывается ли при этом вся сцена? Или просто берется картинка из фреймбуфера и "размазывается"? Не знаю как это искать просто. |
Автор: | MagicWolf [ 15 июн 2009 08:49 ] |
Заголовок сообщения: | Re: glCopyTexImage2D: востановление поврежденных участков экрана |
Vitone писал(а): Немного погулил и выяснил что копать мне в сторону FBO. Только вот я не пойму, насколько хорошо это поддерживаются видяхами (в том числе ноутбучными)? Или с современными проблем не будет? Я думаю найдутся видеокарты, вернее драйвера для них, которые не будут поддерживать FBO, но всегда можно указать на каком железе идет данная прога. |
Автор: | MagicWolf [ 15 июн 2009 08:51 ] |
Заголовок сообщения: | Re: glCopyTexImage2D: востановление поврежденных участков экрана |
Vitone писал(а): У меня нет поддержки FBO: Код: string extensions = Gl.glGetString(Gl.GL_EXTENSIONS); if (!extensions.Contains("GL_EXT_framebuffer_object")) { return; } Потому и FBO и PBuffer отпадает... даж не знаю что теперь делать... Очень странно. Поставь http://www.realtech-vr.com/glview/index.html - GLview, посмотри какие у тебя есть расширения. Какая у тебя видюха? Драйвера последние? |
Автор: | MagicWolf [ 15 июн 2009 08:53 ] |
Заголовок сообщения: | Re: glCopyTexImage2D: востановление поврежденных участков экрана |
bad_duck писал(а): оффтоп MagicWolf, у меня вопрос про multisampleFramebuffer раз речь зашла о фреймбуферах. Я наконец то сделал анти-алиасинг, все работает. Но почему то сглаживаются только грани фигур, а лесенки в текстурах не сглаживаются. Это так и должно быть? Точно не знаю, но судя по смыслу сглаживание моделей проводится при выводе их на сцену. Значит сглаживание будет учитывать пикселы уже выведенных моделей. bad_duck писал(а): Мне просто нужно рисовать модели в одну текстуру, декали в другую и полупрозрачные объекты в третью текстуру. А потом их склеиваю, ну а потом уже пост эффекты. Поэтому не хочется использовать три multisampleFramebuffer. Есть ли какой способ обойтись одним. Не знаю с такой техникой не работал ... |
Автор: | bad_duck [ 15 июн 2009 12:34 ] |
Заголовок сообщения: | Re: glCopyTexImage2D: востановление поврежденных участков экрана |
Ну я всегда придумываю сложные пути Просто не хочу использовать GL_BLEND, я написал свои шейдеры. |
Автор: | MagicWolf [ 15 июн 2009 12:54 ] |
Заголовок сообщения: | Re: glCopyTexImage2D: востановление поврежденных участков экрана |
Ну разве, что последовательно в один буфер выводить, потом склеивать, потом снова в этот же буфер вывести и снова с результирующим склеить. А если нужны три одновременно буфера, то увы, ничего не поделать. Видно ты что-то хитрое затеял ... |
Автор: | bad_duck [ 15 июн 2009 20:20 ] |
Заголовок сообщения: | Re: glCopyTexImage2D: востановление поврежденных участков экрана |
точно, так и сделаю. Еще понадобится буфер для того, что должно находиться под водой (видел урок где можно и без этого обойтись, ну сначала так сделаю). Делаю дьявольскую игру |
Автор: | Vitone [ 15 июн 2009 22:43 ] |
Заголовок сообщения: | Re: glCopyTexImage2D: востановление поврежденных участков экрана |
MagicWolf писал(а): Какая у тебя видюха? Драйвера последние? У меня ноут со встроенной видяхой Intel X3100, слабенькая канеш... но что есть то есть... Драйвера - с офф. сайта. Думаю что лучше сделать универсальное ПО чем выслушивать маты по поводу того, почему конкретное железо не поддерживается. Реализовал перемещение блоков в виде реверсивных прямоугольников - дешево и сердито - не тормозит, хоть и не красиво, зато универсальный метод, хотя считается это дурным тоном. Какие у вас мнения по поводу этого? |
Автор: | MagicWolf [ 16 июн 2009 08:45 ] |
Заголовок сообщения: | Re: glCopyTexImage2D: востановление поврежденных участков экрана |
Попробуй предусмотреть несколько вариантов: для слабых видеокарт, для нормальных, и для крутых... |
Автор: | Vitone [ 16 июн 2009 11:05 ] |
Заголовок сообщения: | Re: glCopyTexImage2D: востановление поврежденных участков экрана |
MagicWolf писал(а): Попробуй предусмотреть несколько вариантов: для слабых видеокарт, для нормальных, и для крутых... Это канеш, здорово и правильно, но как мне разрабатывать приложение под крутую видяху с поддержкой всего функционала, на компьютере со слабенькой? Покупать для этих целей оборудование? Это может просто не окупиться. Пока что обойдусь ревересивными объектами, потом попробую использовать функцию сабжа - так будет приложение более переносимое. Большое спасибо за советы. |
Автор: | Inferno7000 [ 16 июн 2009 14:27 ] |
Заголовок сообщения: | Re: glCopyTexImage2D: востановление поврежденных участков экрана |
Цитата: У меня ноут со встроенной видяхой Intel X3100 А на моём ноуте дискретная видео карта ati mobility radeon x1400. Цитата: Это канеш, здорово и правильно, но как мне разрабатывать приложение под крутую видяху с поддержкой всего функционала, на компьютере со слабенькой? Поменять старый ноут на новый. С хорошей видео картой. |
Автор: | Vitone [ 19 июн 2009 15:56 ] |
Заголовок сообщения: | Re: glCopyTexImage2D: востановление поврежденных участков экрана |
В общем, решил все статические объекты сохранять в текстуру, а перемещаемые блоки рисовать поверх нее. Работает относительно быстро, несмотря на слабую видяху и большой размер текстуры, в общем, меня бы это удовлетворило, если бы текстура не содержала черный цвет (иногда с небольшой полоской сверху слева, залитая текущим цветом) вместо скрина экрана. Привожу код. Инициализация текстуры при изменении размеров формы: Код: 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; } На ошибки проверял - их нету. Что может быть не так? У меня подозрение, что та полосочка - и есть наложенная текстура, но почему тогда она таких размеров и однородным цветом? |
Автор: | Vitone [ 19 июн 2009 17:32 ] |
Заголовок сообщения: | Re: glCopyTexImage2D: востановление поврежденных участков экрана |
Немного изменил функцию генерации структуры: Код: private void InitTexture() { Gl.glEnable(Gl.GL_TEXTURE_2D); if (RenderTex!=0) Gl.glDeleteTextures(1, ref RenderTex); 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, size, size, 0, Gl.GL_RGB, Gl.GL_UNSIGNED_BYTE, null); Gl.glDisable(Gl.GL_TEXTURE_2D); } То есть, перед созданием новой текстуры, удаляем старую. После этого изменение размеров формы перестало сопровождаться сильными тормозами (но они есть), а текстура вместо скрина всегда содержит мусор. |
Страница 3 из 5 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |