Jump to content

  • Log in with Facebook      Sign In   
  • Create Account

Photo

Скоро можно будет отказаться от Borland С++ 3.1


  • Please log in to reply
45 replies to this topic

#21 гык-sse2 Posted 08 September 2010 - 12:41 PM

гык-sse2
  • Свои
  • 377 posts
  • Михаил Беляев

Когда аппаратное ускорение не работает за дело берется софтверный рендерер из mesa3D. Тебе же OpenGL 3 не нужен?

3 не нужен, его и моя видюха (7300LE) не поддерживает.
Сами GL, GLU, SDL работают, а вот на выводе текста через GLUT, работающем в мак ос и в винде, с программным и аппаратным ускорением, в линуксе программа вываливается.
Однако графические эффекты в настройках системы тоже не удается включить.
Медведь громит каны!

#22 гык-sse2 Posted 08 September 2010 - 17:39 PM

гык-sse2
  • Свои
  • 377 posts
  • Михаил Беляев
Можно библиотеки ставить в систему, а инклюды прямо в VS, а можно все на диск Z, дллки подкладывать в папки Debug и Release шаблона, а папки прописывать в настройках проекта. Как делать? PeepEvents сложно, это надо все переписывать с использованием только PeepEvents, глобальной очередью, к тому же строгие требования к циклу. Короче, получается как на glut, очень ограниченные возможности. Там bioskey реализовался с полпинка, но зато getch невозможен Так что bioskey только от нуля будет.

Edited by iMichael, 08 September 2010 - 18:11 PM.

Медведь громит каны!

#23 гык-sse2 Posted 09 September 2010 - 17:23 PM

гык-sse2
  • Свои
  • 377 posts
  • Михаил Беляев
bioskey сделал, но он требует в цикле дополнительной команды и запоминает только одну клавишу (буфер - одна переменная). Для обычного использования в девятом классе достаточно. Ну а тот, кому нужен bioskey(1) - это человек, пишущий Тектроникс, т.е. уже начавший программист. Одну команду вставить он уже может. Выявилась потребность в задержке - на полном экране работает очень быстро.
Медведь громит каны!

#24 гык-sse2 Posted 10 September 2010 - 16:55 PM

гык-sse2
  • Свои
  • 377 posts
  • Михаил Беляев
Сделал задержку... и увидел, что все совсем не так происходит.
В оконном режиме все ОК.
В полноэкранном двойная буферизация занимается ерундой:
Есть 2 буфера.
Вот я на один вывел текст, сделал SDL_GL_SwapBuffers. Он отобразился.
Но на втором буфере этот текст не появился! Рисую на втором куб. SDL_GL_SwapBuffers - куб появился, текст исчез. Еще раз меняю - куб исчез, тот текст появился.

Пока временное решение, несовместимое с delay (тоже по непонятной причине, но из-за этого мигает при задержке, хотя она не между рефрешами):
в инитграфе SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL,1);
после каждой операции вызывается void refreshscreen() {
SDL_GL_SwapBuffers();
if(isFullScreen)
SDL_GL_SwapBuffers();
}

Хм, вроде так и должно быть.

SDL_GL_SetAttribute() can be used to select double/single buffering, but
in OpenGL, you really don't want to do a dirty rectangle thing...clear
the color buffer every frame, redraw the whole scene and swap buffers.
All modern hardware expects this, it's cleaner to code, and in some
cases, it can be faster, since the GL knows it can discard some previous
state.

Но "всю сцену" я рендерить не могу, т.к. я не знаю, что напишет пользователь. Вопрос другой тогда - почему в окне работает?

Edited by iMichael, 10 September 2010 - 17:00 PM.

Медведь громит каны!

#25 гык-sse2 Posted 10 September 2010 - 17:04 PM

гык-sse2
  • Свои
  • 377 posts
  • Михаил Беляев
Хотя нет, на полном экране один буфер работает. Но он не работает в окне! Проблема решена, надеюсь, что этого не будет в винде. Шторт, не решена! Если поставить-таки cleardevice и delay в цикле, то тогда очень мало отображается на экране из того, что создается. Ладно, пусть в окне будет. По крайней мере, окно всегда можно закрыть (хотя бы через терминал), а вот из полноэкранного терминал не откроется. Уже перезагружался пару раз из-за этого.

Edited by iMichael, 10 September 2010 - 17:16 PM.

Медведь громит каны!

#26 гык-sse2 Posted 11 September 2010 - 6:27 AM

гык-sse2
  • Свои
  • 377 posts
  • Михаил Беляев

Copying and swapping both get the next frame on the screen. You only care about the difference if you are doing incremental updates of the frames. If SDL_Flip() is copying buffers, the back buffer always has a copy of the last frame that was drawn. If SDL_Flip() is doing page swapping, the back buffer usually contains the next-to-last frame. I say usually because double buffering can be implemented using a hidden third buffer to reduce the time spent waiting for the buffer swap to happen. You can find out what kind of swapping is being done by watching the value of the back buffer pointer (screen->pixels in hardware.cpp) to see if it changes and how many different values it has. If it never changes, then SDL_Flip() is copying the pixels. If it toggles back and forth between two values, then page swapping is being used.

Действительно, может копировать, а может и не копировать.
Медведь громит каны!

#27 гык-sse2 Posted 11 September 2010 - 6:27 AM

гык-sse2
  • Свои
  • 377 posts
  • Михаил Беляев

Copying and swapping both get the next frame on the screen. You only care about the difference if you are doing incremental updates of the frames. If SDL_Flip() is copying buffers, the back buffer always has a copy of the last frame that was drawn. If SDL_Flip() is doing page swapping, the back buffer usually contains the next-to-last frame. I say usually because double buffering can be implemented using a hidden third buffer to reduce the time spent waiting for the buffer swap to happen. You can find out what kind of swapping is being done by watching the value of the back buffer pointer (screen->pixels in hardware.cpp) to see if it changes and how many different values it has. If it never changes, then SDL_Flip() is copying the pixels. If it toggles back and forth between two values, then page swapping is being used.

Действительно, может копировать, а может и не копировать.

Вот теперь решена - с одним буфером glFlush().
Двойную выключил совсем.

Edited by iMichael, 11 September 2010 - 6:37 AM.

Медведь громит каны!

#28 KiberGus Posted 11 September 2010 - 17:04 PM

KiberGus
  • Genius loci
  • 6561 posts
  • Алексей Гусейнов
А зачем там вообще д:ойная буферизация? Она нужна чтобы не мигало при перерисовке всей сцены. Так оно и в досе мигало. Более того, сцену никто не перерисовывает. Можно использовать один буфер и в него же и рисовать по мере поступления команд.
Зато, обладая единственной в мире подводной орбитальной группировкой спутников глонасс...
gentoo.gif

#29 гык-sse2 Posted 11 September 2010 - 17:25 PM

гык-sse2
  • Свои
  • 377 posts
  • Михаил Беляев

А зачем там вообще д:ойная буферизация? Она нужна чтобы не мигало при перерисовке всей сцены. Так оно и в досе мигало. Более того, сцену никто не перерисовывает. Можно использовать один буфер и в него же и рисовать по мере поступления команд.

Да все уже, убрал двойную. Просто у меня одинарная вообще не работала, как оказалось - забыл glFlush();
Сейчас другая проблема - в Mac OS X нормальный ptscanf написал, а в винде нет vsscanf:( долго гуглил, в результате получил только то, что придется писать gets и sscanf. А это неудобно.
Медведь громит каны!

#30 гык-sse2 Posted 12 September 2010 - 10:41 AM

гык-sse2
  • Свои
  • 377 posts
  • Михаил Беляев
Сделал еще один неудобный способ ввода - через поток gin. Причем gout не работает. Т.е. нужно получить указатель на поток, в цикле (как и для bioskey) catchevents();, которая заносит все с клавиатуры в поток, и потом читать из потока, причем нет никакой гарантии, что юзер уже ввел данные. Зато переполнения буфера не будет.

Edited by iMichael, 12 September 2010 - 10:41 AM.

Медведь громит каны!

#31 starcev Posted 13 September 2010 - 17:36 PM

starcev
  • Свои
  • 448 posts
  • . .
хм.. полезная вещь, можно на гуглкод положить, авось популярность обретёт. ибо многим привычно все делать в родной vs

#32 гык-sse2 Posted 13 September 2010 - 17:43 PM

гык-sse2
  • Свои
  • 377 posts
  • Михаил Беляев
Итак, вот она. Не на гуглокоде и не на assembla.com, на котором я уже работал над мониторинговыми плагинами (см. applelife.ru, под ником гык-sse2), а в обычном архиве. С инструкцией по установке и настройке (html), пока только под Visual Studio 2008 и только на 32-битных Windows, т.к. у 64-битных папка C:\Program Files (x86) и C:\Windows\SysWOW64 по-моему.

Attached Files


Медведь громит каны!

#33 starcev Posted 14 September 2010 - 16:13 PM

starcev
  • Свои
  • 448 posts
  • . .

Visual Studio 2008 и только на 32-битных Windows

какое недоразумение. и почему же именно я поставил недавно именно 64!

#34 гык-sse2 Posted 14 September 2010 - 16:16 PM

гык-sse2
  • Свои
  • 377 posts
  • Михаил Беляев

какое недоразумение. и почему же именно я поставил недавно именно 64!

Да нет, на 64 тоже должно работать, только там папка установки Visual Studio отличается, поэтому инсталлятор не сможет установить. Посмотрите, какие у вас пути, и отредактируйте .cmd-файл (и выложите, запакую в архив, как install64.cmd)
Медведь громит каны!

#35 гык-sse2 Posted 22 September 2010 - 14:02 PM

гык-sse2
  • Свои
  • 377 posts
  • Михаил Беляев
В Ubuntu уже тоже все работает, причина была в пропущенном glutInit. Не знаю, почему оно работало в остальных ОС. Изменен initgraph - теперь ему нужны еще и argc и argv.
Медведь громит каны!

#36 гык-sse2 Posted 22 September 2010 - 16:45 PM

гык-sse2
  • Свои
  • 377 posts
  • Михаил Беляев
А вот и обновление. Теперь есть установочный скрипт для Ubuntu. Исправлена ошибка glutInit, изменены параметры у initgraph (теперь у int main обязательно должны быть параметры int argc и char** argv!), обновлена недодокументация.

Attached Files


Edited by гык-sse2, 22 September 2010 - 17:02 PM.

Медведь громит каны!

#37 гык-sse2 Posted 25 September 2010 - 14:35 PM

гык-sse2
  • Свои
  • 377 posts
  • Михаил Беляев
Поток (точнее, он не поток, а просто объект с операторами << и >>) ptio (замена cin и cout): Coming Soon.
Медведь громит каны!

#38 гык-sse2 Posted 25 September 2010 - 16:30 PM

гык-sse2
  • Свои
  • 377 posts
  • Михаил Беляев
А можно как-то сдвинуть все, что уже нарисовано на окне, наверх на 13 пикселей? (Как делает cout<<'\n'; если места на экране нет, то он двигает и консольный вывод, и графику). Или оно нигде не сохраняется? А то баг серьезный: при \n на последней строке происходит clrscr(), и все теряется. Пользователь не видит, что вернула программа. Также в следующей версии: textattr. Он будет влиять на весь вывод текста, кроме outtext и outtextxy.

Edited by гык-sse2, 25 September 2010 - 16:53 PM.

Медведь громит каны!

#39 KiberGus Posted 25 September 2010 - 17:00 PM

KiberGus
  • Genius loci
  • 6561 posts
  • Алексей Гусейнов
Боюсь, что OpenGL на такие извращения не рассчитан. Но есть команды чтения и записи значения пикселя в буфере. Можно попиксельно сдвинуть. Для тех программ, которые пишут лицеисты этого вполне достаточно.
Зато, обладая единственной в мире подводной орбитальной группировкой спутников глонасс...
gentoo.gif

#40 гык-sse2 Posted 25 September 2010 - 17:42 PM

гык-sse2
  • Свои
  • 377 posts
  • Михаил Беляев
Опа! Нашел, рассчитан!
http://www.talisman....CopyPixels.html
Пока не работает, буду разбираться.

Edited by гык-sse2, 25 September 2010 - 17:51 PM.

Медведь громит каны!




1 user(s) are reading this topic

0 members, 1 guests, 0 anonymous users