1. Пересадил на последнюю редакцию движка. 2. Заменил x87 на SSE, так понятнее и человеку, и машине (оставил только fsincos). 3. Развернул полигоны, чтобы не мерцали. 4. Добавил свет 5. Выставил камеру Мышкой всё двигается, как в CAD-системах: с зажатой левой кнопкой - поворот камеры, с зажатой правой кнопкой - поворот объекта, с зажатым колесом - перенос камеры, прокрутка колеса - наезд камеры, двойной щелчок колесом - исходное положение С клавиатуры: стрелки, PagUp, PageDown - движение камеры, WSADQE - движение объекта (разница заметна при поворотах после смещения, см. координаты на статус-баре), пробели первое нажатие Esc - сброс в исходное положение, второе нажатие Esc - выход, F1, Ctrl+W - акселераторы. Под Windows 11 (Core i3, NVIDIA 1650) всё нормально ATI Rage Mobility-M1 под Windows Me гонит пургу со скоростью 37 FPS: --- Сообщение объединено, 28 сен 2026 в 09:24 --- Вот такой движок на MASM 32. А парсера как не было, так и нет
На моём музейном экспонате процессора и Windows 10 Pro x64 - всё ок ! Скорость 325 FPS и действительно стало красивее и лучше ( подсветка и т.п. ). Вот что значит - профессиональный подход к делу! Вопрос с управлением поворота вокруг оси снимается - разобрался. Просто стало чуть по-другому - нужно правую кнопку мыши удерживать. Так что - всё ок!
Я пересветил, на самом деле. У света три компонента: рассеянное, диффузное и бликовое. Я сделал рассеянное и диффузное слишком ярким, а бликовое не делал. Сейчас исправил. Стало равномернее. Но почему ATI Rage Mobility-M1 ломает полигоны - не знаю. Надо разбираться. --- Сообщение объединено, 28 сен 2026 в 14:04 --- Так и не нашёл, в чём проблема у ATI Rage Mobility-M1. Но зато попутно сделал много улучшений, например единый источник света с тремя компонентами, а не три по одному в одном месте. И обогатил лог: --- Сообщение объединено, 28 сен 2026 в 14:07 --- Она у меня работает под Windows Me на драйвере версии 1.1.0, написанном под Windows 95. Ну хоть не бета.
А мой самый первый файл то же самое или работает ? --- Сообщение объединено, 28 сен 2026 в 15:04 --- Казалось бы, куда ещё лучше, но последний вариант действительно, самый лучший. Правда FPS чуть просел с 325 на 290, ну это по-моему, ерунда ( в смысле, не критично ).
Да, то же самое. ATI Rage Mobility-M1 у меня почему-то не пересекает плоскости. Почему - не пойму. Всё перепроверил. Вот самый простой пример - пересечение куба и пола: Буфер глубины даже не скрывает оси внутри куба. --- Сообщение объединено, 28 сен 2026 в 18:11 --- Разобрался. Надо было сделать так: Код (ASM): ;gluPerspective Arguments fovy real8 45.0 zNear real8 100.0 ;Было 1.0 zFar real8 100000.0 ;Было 1000000.0 Я закладывал универсальные значения (от миллиметра до километра) На старой видеокарте z-буфер не справлялся. А сейчас мой старичок выдаёт вот такую красоту! GRAFik, спасибо за алгоритм!
Движок под х32 готов! Вот они, возможности ассемблера - исполняемый файл размером 17 килобайт: Регистрация класса окна и цикл сообщений Меню с акселераторами Полная инициализация OpenGL-контекста с выбором пиксельного формата Алгоритмическая сборка геометрии по заданной таблице элементов Конвейерная отрисовка массивов glDrawArrays 3D-навигация с помощью клавиатуры и мыши SSE-процедуры умножения и поворота матриц камеры и объекта Динамически обновляемый статус-бар из шести частей Конвертер из IEEE-754 в десятичное ACSII-представление Счётчик тактов и FPS Логгер с форматированием десятичных чисел Диалоги About и Close, разбор кодов ошибок Свобода от CRT и сторонних библиотек. И всё это запускается на процессоре Intel 2000 года: Движок MASM32 - это не порт ранее опубликованного 64-битного движка. Это самостоятельная программа - кстати, более грамотно построенная, т.к.: использует раздельные матрицы проекции, камеры и объекта, рисует массивами с помощью конвейера glDrawArrays, а не отдельными вызовами glBegin/glEnd
ml64, так теперь нужно сделать такую же грамотно построенную 64-х битную версию, с учётом всех спецификаций win. 64 ABI и т.д. и т.п. Если, конечно, у вас найдётся время для этого. Я бы даже мог тоже в этом поучавствовать, если бы у вас, допустим, была бы проблема со временем, для выяснения каких-нибудь деталей и тонкостей, связаных с той же 64-х битной спецификацией.
Да, и я её уже делаю. Вы тоже можете параллельно механически перевести Вашу анимированную программу с х32 на х64. Это совсем не рутина, а по-настоящему творческая работа. Там много интересного, например: а) использование новых инструкций, например, haddps, которой очень не хватало в SSE1, б) использование неразрушающих инструкций, которые экономят регистры, в) переупаковка из xmm-регистров в ymm-регистры, г) замена локальных переменных на регистры, т.к. их в 2 раза больше на х64 - следовательно, мы меньше обращаемся к памяти, а это критически важно в циклах и при пересчёте матриц. Что касается меня, то мне интересна история OpenGL (что я делаю сейчас): ОС3264OpenGL1.04.0КонвейерglDrawArraysVBOДоступAPI, display listsШейдерыТ.е. я готовлю движок OpenGL-64 к восприятию шейдеров, чтобы туда можно было загрузить "Москвич" и вообще всё, что угодно, в формате .obj. --- Сообщение объединено, 29 сен 2026 в 18:49 --- К вопросу о display lists Не знаю, как перевести - дословно: "списки отображения", по сути - прекомпилированные функции, т.е. своеобразный кэш В дисплей-листах можно прекомпилировать непосредственные обращения glBegin/glEnd, но использование их с glDrawArrays запрещено спецификацией, т.е. это не наш случай. С методических целях я запёк установки света в дисплей-лист, но ощутимого прироста FPS это не дало. Спойлер: Дисплей-лист Код (ASM): BuildLightingDisplayList proc push 4864h ;GL_COMPILE push LIST_LIGHTING call glNewList ;2.1. Setup Lighting invoke glEnable,0B50h ;GL_LIGHTING invoke glEnable,4000h ;GL_LIGHT0 push offset lightAmbient push 1200h ;GL_AMBIENT push 4000h ;GL_LIGHT0 call glLightfv push offset lightDiffuse push 1201h ;GL_DIFFUSE push 4000h ;GL_LIGHT0 call glLightfv push offset lightSpecular push 1202h ;GL_SPECULAR push 4000h ;GL_LIGHT0 call glLightfv ;2.2. Set Materials to Lighting push 1602h ;GL_AMBIENT_AND_DIFFUSE push 408h ;GL_FRONT_AND_BACK call glColorMaterial push 0B57h ;GL_COLOR_MATERIAL call glEnable push offset lightSpecular push 1202h ;GL_SPECULAR push 0408h ;GL_FRONT_AND_BACK call glMaterialfv push 3f000000h ;0.5 push 1601h ;GL_SHININESS push 0408h ;GL_FRONT_AND_BACK call glMaterialf call glEndList ret BuildLightingDisplayList endp Спойлер: Вызов дисплей-листа Код (ASM): ;Compute Projection, Camera and Object Matrices call GetDefaults ;Pre-compile the Display List: ;3.1. Setup Lighting ;3.2. Set Materials to Lighting call BuildLightingDisplayList ;Apply Defaults call ResetScene Сборка во вложении.