РБМК и движок OpenGL на MASM

Тема в разделе "WASM.OpenGL", создана пользователем ml64, 25 апр 2026.

  1. ml64

    ml64 Active Member

    Публикаций:
    0
    Регистрация:
    29 окт 2017
    Сообщения:
    112
    1. Пересадил на последнюю редакцию движка.
    2. Заменил x87 на SSE, так понятнее и человеку, и машине (оставил только fsincos).
    3. Развернул полигоны, чтобы не мерцали.
    4. Добавил свет
    5. Выставил камеру

    Мышкой всё двигается, как в CAD-системах:
    • с зажатой левой кнопкой - поворот камеры,
    • с зажатой правой кнопкой - поворот объекта,
    • с зажатым колесом - перенос камеры,
    • прокрутка колеса - наезд камеры,
    • двойной щелчок колесом - исходное положение
    С клавиатуры:
    • стрелки, PagUp, PageDown - движение камеры,
    • WSADQE - движение объекта (разница заметна при поворотах после смещения, см. координаты на статус-баре),
    • пробели первое нажатие Esc - сброс в исходное положение,
    • второе нажатие Esc - выход,
    • F1, Ctrl+W - акселераторы.

    Под Windows 11 (Core i3, NVIDIA 1650) всё нормально

    Voxel_01c.jpg

    ATI Rage Mobility-M1 под Windows Me гонит пургу со скоростью 37 FPS:

    Voxel_01c_old.jpg
    --- Сообщение объединено, 28 сен 2026 в 09:24 ---
    Вот такой движок на MASM 32.
    А парсера как не было, так и нет
     

    Вложения:

    • Voxel_01с.zip
      Размер файла:
      40 КБ
      Просмотров:
      19
    Последнее редактирование: 28 сен 2026 в 09:12
    MaKsIm и GRAFik нравится это.
  2. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    558
    На моём музейном экспонате процессора и Windows 10 Pro x64 - всё ок ! Скорость 325 FPS и действительно стало красивее и лучше ( подсветка и т.п. ). Вот что значит - профессиональный подход к делу!

    Вопрос с управлением поворота вокруг оси снимается - разобрался. Просто стало чуть по-другому - нужно правую кнопку мыши удерживать. Так что - всё ок! :)
     
    Последнее редактирование: 28 сен 2026 в 09:51
    ml64 нравится это.
  3. ml64

    ml64 Active Member

    Публикаций:
    0
    Регистрация:
    29 окт 2017
    Сообщения:
    112
    Я пересветил, на самом деле.
    У света три компонента: рассеянное, диффузное и бликовое.
    Я сделал рассеянное и диффузное слишком ярким, а бликовое не делал.
    Сейчас исправил. Стало равномернее.
    Но почему ATI Rage Mobility-M1 ломает полигоны - не знаю. Надо разбираться.
    --- Сообщение объединено, 28 сен 2026 в 14:04 ---
    Так и не нашёл, в чём проблема у ATI Rage Mobility-M1.
    Но зато попутно сделал много улучшений, например единый источник света с тремя компонентами, а не три по одному в одном месте.
    И обогатил лог:
    --- Сообщение объединено, 28 сен 2026 в 14:07 ---
    Она у меня работает под Windows Me на драйвере версии 1.1.0, написанном под Windows 95. Ну хоть не бета.
     

    Вложения:

    • voxel01d.zip
      Размер файла:
      191,1 КБ
      Просмотров:
      21
    • Voxel32_01h.zip
      Размер файла:
      40,2 КБ
      Просмотров:
      19
    MaKsIm и GRAFik нравится это.
  4. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    558
    А мой самый первый файл то же самое или работает ?
    --- Сообщение объединено, 28 сен 2026 в 15:04 ---
    Казалось бы, куда ещё лучше, но последний вариант действительно, самый лучший. Правда FPS чуть просел с 325 на 290, ну это по-моему, ерунда ( в смысле, не критично :) ).
     
  5. ml64

    ml64 Active Member

    Публикаций:
    0
    Регистрация:
    29 окт 2017
    Сообщения:
    112
    Да, то же самое.
    ATI Rage Mobility-M1 у меня почему-то не пересекает плоскости. Почему - не пойму. Всё перепроверил.
    Вот самый простой пример - пересечение куба и пола:
    ErrorCube.jpg
    Буфер глубины даже не скрывает оси внутри куба.
    --- Сообщение объединено, 28 сен 2026 в 18:11 ---
    Разобрался. Надо было сделать так:
    Код (ASM):
    1. ;gluPerspective Arguments
    2. fovy real8 45.0
    3. zNear real8 100.0 ;Было 1.0
    4. zFar real8 100000.0 ;Было 1000000.0
    Я закладывал универсальные значения (от миллиметра до километра)
    На старой видеокарте z-буфер не справлялся. А сейчас мой старичок выдаёт вот такую красоту!
    GRAFik, спасибо за алгоритм!

    VoxelCompaq.jpg
     
    MaKsIm и GRAFik нравится это.
  6. ml64

    ml64 Active Member

    Публикаций:
    0
    Регистрация:
    29 окт 2017
    Сообщения:
    112
    Движок под х32 готов!
    Вот они, возможности ассемблера - исполняемый файл размером 17 килобайт:
    • Регистрация класса окна и цикл сообщений
    • Меню с акселераторами
    • Полная инициализация OpenGL-контекста с выбором пиксельного формата
    • Алгоритмическая сборка геометрии по заданной таблице элементов
    • Конвейерная отрисовка массивов glDrawArrays
    • 3D-навигация с помощью клавиатуры и мыши
    • SSE-процедуры умножения и поворота матриц камеры и объекта
    • Динамически обновляемый статус-бар из шести частей
    • Конвертер из IEEE-754 в десятичное ACSII-представление
    • Счётчик тактов и FPS
    • Логгер с форматированием десятичных чисел
    • Диалоги About и Close, разбор кодов ошибок
    • Свобода от CRT и сторонних библиотек.
    И всё это запускается на процессоре Intel 2000 года:
    CompaqRBMK.jpg

    Движок MASM32 - это не порт ранее опубликованного 64-битного движка.
    Это самостоятельная программа - кстати, более грамотно построенная, т.к.:
    • использует раздельные матрицы проекции, камеры и объекта,
    • рисует массивами с помощью конвейера glDrawArrays, а не отдельными вызовами glBegin/glEnd
     

    Вложения:

    • RBMK32_083.zip
      Размер файла:
      42,1 КБ
      Просмотров:
      12
    Последнее редактирование: 29 сен 2026 в 16:26
    MaKsIm и GRAFik нравится это.
  7. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    558
    ml64, так теперь нужно сделать такую же грамотно построенную 64-х битную версию, с учётом всех спецификаций win. 64 ABI и т.д. и т.п. Если, конечно, у вас найдётся время для этого. Я бы даже мог тоже в этом поучавствовать, если бы у вас, допустим, была бы проблема со временем, для выяснения каких-нибудь деталей и тонкостей, связаных с той же 64-х битной спецификацией.
     
  8. ml64

    ml64 Active Member

    Публикаций:
    0
    Регистрация:
    29 окт 2017
    Сообщения:
    112
    Да, и я её уже делаю.
    Вы тоже можете параллельно механически перевести Вашу анимированную программу с х32 на х64.

    Это совсем не рутина, а по-настоящему творческая работа. Там много интересного, например:
    а) использование новых инструкций, например, haddps, которой очень не хватало в SSE1,
    б) использование неразрушающих инструкций, которые экономят регистры,
    в) переупаковка из xmm-регистров в ymm-регистры,
    г) замена локальных переменных на регистры, т.к. их в 2 раза больше на х64 -
    следовательно, мы меньше обращаемся к памяти, а это критически важно в циклах и при пересчёте матриц.

    Что касается меня, то мне интересна история OpenGL (что я делаю сейчас):
    ОС​
    32​
    64​
    OpenGL​
    1.0​
    4.0​
    Конвейер​
    glDrawArrays​
    VBO​
    Доступ​
    API, display lists​
    Шейдеры​
    Т.е. я готовлю движок OpenGL-64 к восприятию шейдеров, чтобы туда можно было загрузить "Москвич" и вообще всё, что угодно, в формате .obj.

    --- Сообщение объединено, 29 сен 2026 в 18:49 ---

    К вопросу о display lists


    Не знаю, как перевести - дословно: "списки отображения", по сути - прекомпилированные функции, т.е. своеобразный кэш
    В дисплей-листах можно прекомпилировать непосредственные обращения glBegin/glEnd, но использование их с glDrawArrays запрещено спецификацией, т.е. это не наш случай.
    С методических целях я запёк установки света в дисплей-лист, но ощутимого прироста FPS это не дало.

    Код (ASM):
    1. BuildLightingDisplayList proc
    2.  
    3. push 4864h ;GL_COMPILE
    4. push LIST_LIGHTING
    5. call glNewList
    6.  
    7. ;2.1. Setup Lighting
    8. invoke glEnable,0B50h ;GL_LIGHTING
    9.  
    10. invoke glEnable,4000h ;GL_LIGHT0
    11.  
    12. push offset lightAmbient
    13. push 1200h ;GL_AMBIENT
    14. push 4000h ;GL_LIGHT0
    15. call glLightfv
    16.  
    17. push offset lightDiffuse
    18. push 1201h ;GL_DIFFUSE
    19. push 4000h ;GL_LIGHT0
    20. call glLightfv
    21.  
    22. push offset lightSpecular
    23. push 1202h ;GL_SPECULAR
    24. push 4000h ;GL_LIGHT0
    25. call glLightfv
    26.  
    27. ;2.2. Set Materials to Lighting
    28. push 1602h ;GL_AMBIENT_AND_DIFFUSE
    29. push 408h ;GL_FRONT_AND_BACK
    30. call glColorMaterial
    31.  
    32. push 0B57h ;GL_COLOR_MATERIAL
    33. call glEnable
    34.  
    35. push offset lightSpecular
    36. push 1202h ;GL_SPECULAR
    37. push 0408h ;GL_FRONT_AND_BACK
    38. call glMaterialfv
    39.  
    40. push 3f000000h ;0.5
    41. push 1601h ;GL_SHININESS
    42. push 0408h ;GL_FRONT_AND_BACK
    43. call glMaterialf
    44.  
    45. call glEndList
    46. ret
    47.  
    48. BuildLightingDisplayList endp

    Код (ASM):
    1. ;Compute Projection, Camera and Object Matrices
    2. call GetDefaults
    3.  
    4. ;Pre-compile the Display List:
    5. ;3.1. Setup Lighting
    6. ;3.2. Set Materials to Lighting
    7. call BuildLightingDisplayList
    8.  
    9. ;Apply Defaults
    10. call ResetScene

    Сборка во вложении.
     

    Вложения:

    • rbmk32_084.zip
      Размер файла:
      42,6 КБ
      Просмотров:
      9
    Последнее редактирование: 29 сен 2026 в 18:53
    MaKsIm и GRAFik нравится это.