по совтверному рендереру:
http://www.cs.unc.edu/~olano/papers/2dh-tri/
http://devmaster.net/forums/topic/1145-advanced-rasterization/
http://software.intel.com/en-us/articles/rasterization-on-larrabee/
http://www.gamedev.net/blog/1390/entry-2253995-software-rasterize… ther-updates/
Кстати, об FPS: что-то тут не так...
void Core::ShowFPS() { static double time = 0; static int fps = 0; static wchar_t fps_text[32]; time += delta_time; fps += 1; if( time > 1) { wsprintf( fps_text, L"Soft Render v 0.001 FPS = %d", fps); SetWindowText( window->GetHwnd( ), fps_text); fps = 0; time = 0; } }
Скачал br. fps = 80
Подлетел к кубу вупор. fps просел и прога зависла. Win 7, seleron 2.4
Try
> Кстати, об FPS: что-то тут не так...
Наверное не так.
Но оно показывает цифры, которые отражают производительность программы.
ПРАВКА: почему это он фпс не показывает?
Функция вызывается в каждом кадре и накапливает значения фпс.
Как только прошла одна секунда - фпс показывается, а счетчик сбрасывается.
delta_time вроде как в секундах возвращает время. Время за один кадр.
MadMax
> Скачал br. fps = 80
Потому что это неправильный куб
Вот тебе обезьянка.
MadMax
> Подлетел к кубу вупор. fps просел и прога зависла. Win 7, seleron 2.4
Она не висла. Просто она делила на ноль или на отрицательную величину.
Это пагубно сказывается на работе программы.
Теперь я запилил отсечение в процессе растеризации. Все работает, но это не решение проблемы.
Вообще это не простая тема.
PVSector
Спасибо за ссылки.
Может быть, модель куба неправильная?
у меня такой работал нормально:
typedef U16 SIndex; enum { NUM_VERTICES = 8 }; static const Vec3D positions[ NUM_VERTICES ] = { Vec3D(-1.0f, -1.0f, -1.0f ), Vec3D( 1.0f, -1.0f, -1.0f ), Vec3D( -1.0f, 1.0f, -1.0f ), Vec3D( 1.0f, 1.0f, -1.0f ), Vec3D( -1.0f, -1.0f, 1.0f ), Vec3D( 1.0f, -1.0f, 1.0f ), Vec3D( -1.0f, 1.0f, 1.0f ), Vec3D( 1.0f, 1.0f, 1.0f ) }; enum { NUM_CUBE_SIDES = 6 }; enum { NUM_TRIANGLES = NUM_CUBE_SIDES*2 }; enum { NUM_INDICES = NUM_TRIANGLES*3 }; static const SIndex indexData[ NUM_INDICES ] = { 1, 0, 2, 2, 3, 1, // -Z 1, 3, 7, 7, 5, 1, // +X 1, 5, 4, 4, 0, 1, // -Y 0, 4, 6, 6, 2, 0, // -X 2, 6, 7, 7, 3, 2, // +Y 4, 5, 7, 7, 6, 4 // +Z };
Pokimon
> Просто она делила на ноль или на отрицательную величину.
Буду в следующий раз знать, что прежде чем делить на отрицательную величину, надо поменять ей знак. Покимин же сказал :)
Zefick
> Буду в следующий раз знать, что прежде чем делить на отрицательную величину,
> надо поменять ей знак. Покимин же сказал :)
Деление на отрицательную величину означает проецирование вершин, находящихся сзади камеры.
Это как-бы не верно. Их нужно отсекать. Сегодня этим займусь.
PVSector
> Может быть, модель куба неправильная?
Я уже нашел ошибку.
> Софтварный рендер
Надо понимать, что OpenGL убог и не достоин использоваться в движке нового поколения, поэтому альтернативы написанию собственной графической библиотеки нет? :)
Клас, прочел. Мне очень нравиться! Pokimon - пили дальше.
Zefick
> Надо понимать, что OpenGL убог и не достоин использоваться в движке нового
> поколения, поэтому альтернативы написанию собственной графической библиотеки
> нет? :)
Это не библиотека - это рендер.
Играл в первый Half-Life - там тоже такой есть.
На самом деле, это огромный плюс в твоем понимании, что такое графика и как она работает. Пока сам такую штуку не напишешь, чувствуешь, что знаешь далеко не все.
И потом, это дает очень хорошее умение делать продуманый интерфейс, чтобы опять же как и в том же Half-Life совмещать на одной сцене два или больше рендера (аппаратных или программных).
И еще есть вопрос: 50 - ФПС при очистке страницы? Очень специфично, я программно добивался около 800 фпс при "простом" блитере, соответственно с очисткой страницы, без блитера было бы больше. Ассемблер не использовал.
Процессор был P4 3Ghz (L2 cache: 2mb)! Может я что-то не так понял?
Тема в архиве.