Москвич-408 — элегантность, ставшая классикой

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

  1. ml64

    ml64 Member

    Публикаций:
    0
    Регистрация:
    29 окт 2017
    Сообщения:
    69
    Друзья, сегодня хочу поговорить об автомобиле, который для многих из нас является не просто машиной, а настоящим произведением инженерного и дизайнерского искусства.
    Речь, конечно же, о Москвиче-408.

    FR_07.jpg

    Историческая справка


    Первый экземпляр собрали в 1964 году, а серийное производство стартовало осенью того же года. Автомобиль выпускался на МЗМА (позднее АЗЛК) в Москве, а с 1966 года — и на Ижевском автозаводе.

    Right_01.jpg

    Дизайн: революция на фоне эволюции


    Москвич-408 многое унаследовал от предшественников – моделей 403 и 407. Однако кузов 408-го был абсолютно новым и стилистически революционным. Если «Москвич-407» представлял собой классическую «круглую мыльницу» в стилистике 50-х годов, то 408-й предлагал совершенно иной подход — лаконичный, гармоничный и элегантный.
    В его облике читался «плоскостной» дизайн – прямые линии в сочетании с плоскими поверхностями. Фирменный «нос» с обратным наклоном радиаторной решётки и небольшими «капюшонами» над фарами стал настоящей визитной карточкой.
    Новаторский «Москвич» получил панорамные переднее и заднее стёкла и изящные вертикальные задние фонари «а-ля Чайка».
    На момент начала производства — осень 1964 года — «Москвич-408» выглядел очень современно, даже ультрамодно. Он ничуть не уступал своим зарубежным аналогам: американо-британскому Ford Cortina, французскому Renault 8/10 или немецкому Opel Kadett.

    RR_03.jpg

    Технические характеристики


    По технической части «Москвич-408» был вполне прогрессивен для своего времени:
    ПараметрЗначение
    Тип кузоваЦельнометаллический седан несущего типа
    Габариты4090 x 1550 x 1480 мм
    Колёсная база2400 мм
    ДвигательБензиновый, рядный 4-цилиндровый
    Мощность50 л.с.
    Коробка передачМеханическая, 4-ступенчатая (рычаг на рулевой колонке)
    Максимальная скорость120 км/ч
    Разгон до 100 км/ч29 с
    Снаряжённая масса990 кг

    Утрата элегантности: рестайлинг 1969 года


    C 6 декабря 1969 года с конвейера АЗЛК стали сходить видоизменённые 408-е и 412-е. Обе модели получили одинаковые изменения в рамках унификации:
    Легендарный криволинейный спидометр в стиле «спейс-эйдж» (космической эстетики) заменён на тривиальное заводское изделие.
    Изменилась крышка багажника.
    Но самое печальное - вертикальные задние фонари уступили место горизонтальным.
    Да, возможно, это было продиктовано производственной необходимостью. Но, коллеги, я позволю себе высказать крамольную мысль: это была потеря. Потеря той самой уникальной элегантности, того шарма, который делал «Москвич-408» узнаваемым с первого взгляда. Горизонтальные фонари сделали корму более обыденной, лишив её той изюминки, что была у вертикальных «чаек».

    Завершение эпохи


    Производство «Москвича-408» продолжалось до декабря 1975 года. На смену ему с февраля 1976 года пришло семейство «Москвич-2138». Так закончилась история одной из самых стильных советских малолитражек.
    RL_04.jpg
     

    Вложения:

    Последнее редактирование: 2 авг 2026 в 21:33
    Mikl___, GRAFik и Application нравится это.
  2. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    526
    ml64, SUPER !!! Прям образец для сложного проекта MASM64.
    У меня если что, дилетантский, наверно, вопрос, поэтому сильно не пинайте. :)
    Если у меня видеокарта не будет поддерживать Вулкан, ну и соответственно драйвер не заработает, то этот проект, который в этом треде ( Москвич-408 — элегантность, ставшая классикой ) возможно ли переделать под обычный стандартный OpenGL, чтобы на любых компьютерах запускался ? Или это нереально, т.к. много кода придётся переделывать ?
     
  3. ml64

    ml64 Member

    Публикаций:
    0
    Регистрация:
    29 окт 2017
    Сообщения:
    69
    Да, возможно.
    Это приложение состоит из четырёх независимых блоков:
    • app (всё, что связано с WinAPI),
    • vk (среда Vulkan),
    • obj (файлы 3D-модели .obj и .mat, а также парсеры вершин, нормалей, полигонов и материалов) и
    • SPIR-V (вершинный и фрагментный шейдеры).
    Достаточно заменить контекст vk на контекст OpenGL.
    У меня пока нет готового кода на MASM, но во вложении подходящий код на VBA.
    В теме РБМК и движок OpenGL на MASM объект рисуется по модели OpenGL 1.0 (как у NeHe), а во вложенном файле Immediate mode заменён на vertex arrays.
    Было ~65 000 вызовов DLL за кадр (glBegin / glVertex3f / glNormal3fv / glTranslatef / glMaterialfv) -> стало ~15. Вся сетка (11 520 квадов) рисуется одним glDrawArrays.
    И вот этой функции glDrawArrays можно передать данные, полученные от парсера .obj-файла:

    Код (Text):
    1. Call glVertexPointer(3, GL_FLOAT, 0, lpVerts)
    2. Call glNormalPointer(GL_FLOAT, 0, lpNorms)
    3. Call glColorPointer(3, GL_FLOAT, 0, lpCols)
    4. Call glDrawArrays(GL_QUADS, 0, gVertCount)
     

    Вложения:

    Последнее редактирование: 26 июл 2026
    Mikl___ нравится это.
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.268
    Уроки от NeHe на masm64
     
    Application нравится это.
  5. ml64

    ml64 Member

    Публикаций:
    0
    Регистрация:
    29 окт 2017
    Сообщения:
    69
    Да, и мой OpenGL микро-движок был основан на уроке 10 NeHe. Но это OpenGL 1.0:

    Код (C):
    1.     for (int loop_m = 0; loop_m < numtriangles; loop_m++)
    2.     {
    3.         glBegin(GL_TRIANGLES);
    4.             glNormal3f( 0.0f, 0.0f, 1.0f);
    5.             x_m = sector1.triangle[loop_m].vertex[0].x;
    6.             y_m = sector1.triangle[loop_m].vertex[0].y;
    7.             z_m = sector1.triangle[loop_m].vertex[0].z;
    8.             u_m = sector1.triangle[loop_m].vertex[0].u;
    9.             v_m = sector1.triangle[loop_m].vertex[0].v;
    10.             glTexCoord2f(u_m,v_m); glVertex3f(x_m,y_m,z_m);
    11.    
    12.             x_m = sector1.triangle[loop_m].vertex[1].x;
    13.             y_m = sector1.triangle[loop_m].vertex[1].y;
    14.             z_m = sector1.triangle[loop_m].vertex[1].z;
    15.             u_m = sector1.triangle[loop_m].vertex[1].u;
    16.             v_m = sector1.triangle[loop_m].vertex[1].v;
    17.             glTexCoord2f(u_m,v_m); glVertex3f(x_m,y_m,z_m);
    18.    
    19.             x_m = sector1.triangle[loop_m].vertex[2].x;
    20.             y_m = sector1.triangle[loop_m].vertex[2].y;
    21.             z_m = sector1.triangle[loop_m].vertex[2].z;
    22.             u_m = sector1.triangle[loop_m].vertex[2].u;
    23.             v_m = sector1.triangle[loop_m].vertex[2].v;
    24.             glTexCoord2f(u_m,v_m); glVertex3f(x_m,y_m,z_m);
    25.         glEnd();
    26.     }
    Для примера NeHe это было допустимо. Но современные 3D-модели содержат огромное количество полигонов. Например, этот "Москвич":
    И для отрисовки каждого полигона уже нельзя вызывать glBegin/glEnd.
    Теперь из вершин, нормалей, индексов и материалов формируются массивы, загружаются в G-RAM, и дальше с ними работает GPU.
    Поэтому Vulkan можно условно заменить только на OpenGL 4.0+ с VAO/VBO/EBO и шейдерами:

    Код (C):
    1. // Настройка VAO/VBO один раз
    2. glBindVertexArray(vao);
    3. glBindBuffer(GL_ARRAY_BUFFER, vbo);
    4. glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(Vertex), vertices.data(), GL_STATIC_DRAW);
    5. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
    6. glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(unsigned int), indices.data(), GL_STATIC_DRAW);
    7. // ... настройка атрибутов ...
    8. // Отрисовка каждого кадра:
    9. glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0);
     
    Последнее редактирование: 26 июл 2026
    GRAFik нравится это.
  6. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    526
    ml64, OpenGL у меня, скорее всего, не ниже 4.x, несмотря на возраст видеокарты, а вот Вулкан она не поддерживает. В связи с этим вопрос: если я вас попрошу переделать проект под мою видеокарту - вы мне откажете, потому что это сложно и долго или можете пойти на встречу, если я буду себя хорошо вести ? :)
     
  7. Application

    Application Moderator Команда форума

    Публикаций:
    1
    Регистрация:
    8 дек 2007
    Сообщения:
    973
    Если только не хорошо, а элегантно.
     
  8. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    526
    Согласен. Могу даже пошло и похабно, по отношению к Дефексекову. :)
     
  9. ml64

    ml64 Member

    Публикаций:
    0
    Регистрация:
    29 окт 2017
    Сообщения:
    69
    Без проблем, но сначала мне нужно закончить с Вулканом. Я сейчас пишу парсер материалов. Как только "Москвич" станет синим, а не радужным, я смогу переключиться на OpenGL.
    Но за это время Вы можете и сами это сделать - примерный код на VBA я дал. Перевести на ассемблер - дело техники.
    На Вулкане самое сложное - это следить за структурами. У OpenGL только одна большая структура - pfd. Так что там всё намного проще.
     
    Mikl___ нравится это.
  10. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    526
    Страшновато мне что-то самому это переделывать. Размер кода приличный для ассемблера, боюсь что-нибуть напутать. Лучше подожду вас. Мне же не горит, торопиться некуда.
     
  11. ml64

    ml64 Member

    Публикаций:
    0
    Регистрация:
    29 окт 2017
    Сообщения:
    69
    У меня "Москвич" уже синий (в смысле: парсер материалов в целом готов), но нет ни прозрачности, ни отражений.

    Сейчас вот так:
    FL_01.jpg


    А надо, чтобы было вот так:
    FL_02.jpg

    Так что придётся подождать
    --- Сообщение объединено, 28 июл 2026 ---
    Освещение надо добавить
    RR_01.jpeg

    Чтобы было вот так:
    RR_02.jpeg



     

    Вложения:

    • m408_35.zip
      Размер файла:
      450,4 КБ
      Просмотров:
      37
    Application и Mikl___ нравится это.
  12. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    526
    Ну, в общем, как я посмотрю, прям целая программа 3D MAX на MASM64 вырисовывается. :)
     
    Application нравится это.
  13. ml64

    ml64 Member

    Публикаций:
    0
    Регистрация:
    29 окт 2017
    Сообщения:
    69
    Исправил серьёзный баг, который мешал запускаться на интегрированных GPU.
    Ну и бонусом подправил цвета (пока не настроены Ambient, Specular и Transparency - всё имитируется одним Diffuse)

    FR_02.jpg
     

    Вложения:

    Mikl___ нравится это.
  14. ml64

    ml64 Member

    Публикаций:
    0
    Регистрация:
    29 окт 2017
    Сообщения:
    69
    Добавил возможность сохранять скриншоты
    Save.jpg
    Уау! Я написал свой первый рендерер.
    Раньше я рендерил в 3Ds max, ArchiCAD, Art-Lantis, Lumion, Revit, TwinMotion
    А теперь буду на своём движке. Вряд ли Заказчики оценят, конечно.
     

    Вложения:

    Последнее редактирование: 2 авг 2026 в 00:29
    Mikl___ нравится это.
  15. Application

    Application Moderator Команда форума

    Публикаций:
    1
    Регистрация:
    8 дек 2007
    Сообщения:
    973
    Теоретически можно из этих программ выбрать самые удобные/полезные функции, и интегрировать в свою программу.
    Может получиться что-то уникальное, чего никто никогда раньше не видел. Каждая такая программа это чья-то мысль.
     
    Mikl___ нравится это.
  16. ml64

    ml64 Member

    Публикаций:
    0
    Регистрация:
    29 окт 2017
    Сообщения:
    69
    Чтобы сделать это за конечное время, мне придётся перестать страдать фигнёй и написать всё на C++
    Дожму этот пример, как есть (осталось добавить парсер объектов, рассеянное и бликовое освещение, прозрачность), а там посмотрим.
    Писать приложение Vulkan на ассемблере - это настолько тупо, что мне даже нравится.
    А, он же ещё крутиться должен. Значит, ещё и обработчик клавиатуры с матрицами преобразований.
     
    Последнее редактирование: 2 авг 2026 в 02:02
    Mikl___ нравится это.
  17. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    526
    Ставьте VS 2026 Pro и за дело. В VS 2026 есть встроенный ИИ Копилот (или Копайло), может окажет какую-нибудь существенную помощь в вашем деле. Отказываться от современных технологий в 21 веке, по-моему, не стоит, а вот если вместо пользы будет один вред в виде глюков, то откатиться назад в прошлое, к MASM32 и Windows XP sp2, по-моему, никогда не поздно. :)
     
  18. ml64

    ml64 Member

    Публикаций:
    0
    Регистрация:
    29 окт 2017
    Сообщения:
    69
    Нет. Не дадут ЯВУ вот этого кайфа:

    Код (ASM):
    1.  
    2. ;Pattern: SPACE (20h), TAB (09h), CR (0Dh), LF (0Ah)
    3. mov eax,0A0D0920h
    4. movd xmm0,rax
    5. pcmpistri xmm0,xmmword ptr[rcx],0
    --- Сообщение объединено, 4 авг 2026 в 01:05 ---
    Код (ASM):
    1. ;-----------------------------------------------
    2. ; Skip Space, Tab, CR, LF using SSE4.2 pcmpistri
    3. ; Input:  RCX = pointer to string
    4. ; Output: RCX = pointer after whitespace
    5. ; Destroys: RAX, ECX (from pcmpistri), XMM0
    6. ; Requires: SSE4.2 (Nehalem+)
    7. ;----------------------------
    8. SKIP_WHITESPACES_SSE MACRO
    9. LOCAL lbl_Next, lbl_Done
    10.  
    11. ;Check for EOF
    12. cmp rcx,gpObjDataEnd
    13. jge lbl_Done
    14.  
    15. ;Save rcx since it's affected by vpcmpistri
    16. mov rdx,rcx ;RDX = current position
    17. ;Clear the container
    18. xor rcx,rcx ;Will be used as index (zero-initialized)
    19.  
    20. ;Pattern: SPACE (20h), TAB (09h), CR (0Dh), LF (0Ah)
    21. mov rax,0A0D0920h
    22. movq xmm0,rax
    23.  
    24. lbl_Next:
    25. ;Compare bytes at [RDX] against pattern in XMM0
    26. ;Mode 0: equal_any, positive polarity, implicit length
    27. vpcmpistri xmm0,xmmword ptr[rdx],0
    28. jc lbl_Done
    29. jz lbl_Done
    30.  
    31. ;ECX contains index of the first whitespace character
    32. add rdx,rcx ;Advance to the whitespace
    33. inc rdx ;Skip past it
    34. jmp lbl_Next
    35.  
    36. lbl_Done:
    37. mov rcx,rdx ;Restore rcx
    38. ENDM
     
    Последнее редактирование: 3 авг 2026 в 23:50
    GRAFik и Mikl___ нравится это.