Ну чтож, перевёл отладочную отрисовку на VAO + VBO + шейдеры.
Из менеджера VBO выбросил кучу жуткого кода, написанного в 2019-м году, там килобайт 50 шаблонов было, чтобы в компайл-тайм конструировать какие-то дефолтные типы фиксированных вертексов, причём я уже и сам крайне смутно помнил как там всё это работает. Ну и соответственно больше это не нужно, код стал чище и понятнее.
Мне осталось только переработать систему отладочной отрисовки, которая рендерит линии. Это многоцелевая система, она используется для совершенно разных задач. С её помощью рисуются каркасы хитбоксов, ббоксы, стрелочки контактов ну и всё такое прочее аналогичное.
Важной особенностью системы является то, что отладочную отрисовку не надо вызывать каждый кадр. Она будет рендерится пока эти линии пользователь не удалит явным образом. То есть тут не совсем тривиальная вещь. Когда с этой системой разберусь, можно будет наконец двигаться дальше по документу.
Я это сделал! Теперь XashNT абсолютно всё рендерит через VAO+VBO (IBO опционально). Самые сложные задачи, которые повлекли за собой и рефакторинг, и даже, как вы знаете - изменение формата шрифтов успешно решены. Давайте ещё раз пройдемся по тому списку и посмотрим что было сделано.
Добавлено 15-03-2025 в 19:40:
Цитата:
Profiles define subsets of OpenGL functionality targeted to specific application domains. OpenGL 3.2 defines two profiles (see below), and future versions may introduce additional profiles addressing embedded systems or other domains. OpenGL 3.2 implementations are not required to support all defined profiles, butmust support the core profile described below.
В процессе имплементации выяснилось несколько неприятных вещей. Так в частности различные встройки от Intel умеют максимум в OpenGL 3.1 на Windows и OpenGL 3.3 на Linux. Почему такое происходит сказать затрудняюсь, тем не менее - вот. Причём в режиме совместимости они могут возвращать абсолютно любую бредятину, рапортуя о поддержке всего на свете, тогда как по факту ничего подобного. Ну может они пытаются это проэмулировать? Этот момент предстоит ещё выяснить. Но пока что я для себя определил базовую версию Core Profile как 3.1. Там правда нет инстансинга, но всё остальное работать будет.
Цитата:
OpenGL 3.2 is the first version of OpenGL to define multiple profiles. The core profile builds on OpenGL 3.1 by adding features described in section H.1. The compatibility profile builds on the combination of OpenGL 3.1 with the special GL_ARB_compatibility extension defined together with OpenGL 3.1, addingthe same new features and in some cases extending their definition to interact with existing features of OpenGL 3.1 only found in GL_ARB_compatibility. It is not possible to implement both core and compatibility profiles in a single GL context, since the core profile mandates functional restrictions not present in the compatibility profile. Refer to the WGL_ARB_create_context_profile and GLX_ARB_create_context_profile extensions (see appendix J.3.68) for information on creating a context implementing a specific profile.
Вот тут к слову опять непонятно. Значит ли это, что в версии 3.1 нет никакого Core Profile? Или может быть мне необходимо как бы придерживаться Core версии через самоцензуру? Пока непонятно, но я не исключаю такой момент. Главное чтобы работало у всех.
Цитата:
Wide lines -LineWidth values greater than 1.0 will generate an INVALID_-VALUE error
Барнес сказал, что эту фичу никто не выбросил, но работают только фиксированные значения, например 2.0 или 4.0. Ну хорошо, я как раз 2.0 и использую. Большего мне и не нужно. Так что пусть остается. В крайнем случае сделаю какую-нибудь проверку.
Добавлено 15-03-2025 в 20:01:
Цитата:
Global component limit query - the implementation-dependent values MAX_VARYING_COMPONENTS and MAX_VARYING_FLOATS.
Это выбросил. Да оно собственно и не использовалось никогда. Хотя и было выведено в систему материалов, где тоже никогда не использовалось.
Цитата:
Application-generated object names - the names of all object types, such as buffer, query, and texture objects, must be generated using the corresponding Gen* commands. Trying to bind an object name not returned by a Gen* command will result in an INVALID_OPERATION error. This behavior is already the case for framebuffer, renderbuffer, and vertex array objects. Object types which have default objects (objects named zero), such as vertex array, framebuffer, and texture objects, may also bind the default object, even though it is not returned by Gen*.
Ещё раз всё проверил - таких имён у меня нет, всё генерируется через glGen.
Цитата:
Color index mode - No color index visuals are supplied by the window system-binding APIs such as GLX and WGL, so the default framebuffer is always in RGBA mode. All language and state related to color index mode vertex, rasterization, and fragment processing behavior is removed. COLOR_INDEX formats are also deprecated.
Этого у меня и не было.
Цитата:
OpenGL Shading Language versions 1.10 and 1.20. These versions of the shading language depend on many API features that have also been deprecated.
Да, здесь предстоит масштабная работа по переписыванию всех шейдеров. Собственно, это и есть ближайшая задача по продолжению миграции на Core Profile. И кстати версию шейдеров придётся выбирать либо 130, либо 140. Пока ещё не решил.
Цитата:
Begin/End primitive specification -Begin, End, and EdgeFlag*; Color*, FogCoord*, Index*, Normal3*, SecondaryColor3*, TexCoord*, Vertex* Vertex*; and all associated state.Vertex arrays and array drawing commands must be used to draw primitives. However, VertexAttrib* and the current vertex attribute state are retained in order to provide default attribute values for disabled attribute arrays.
Успешно избавился - больше нигде не используется. Собственно именно эта задача и отняла у меня больше всего времени, спровоцировала изменение RenderAPI в Шоте, изменение формата шрифтов и затронул кучу подсистем, которые пришлось отрефакторить. По времени - больше недели. И это несмотря на то, что в 3D весь рендеринг давно уже использует VAO + VBO + Shader. Но по крайней мере я сделал всё правильно, а не наговнял по быстрому. Теперь в рендеринге 2д-изображений появилась поддержка материалов, шейдеров и открылась куча новых возможностей.
Цитата:
Edge flags and fixed-function vertex processing ColorPointer, EdgeFlagPointer, FogCoordPointer, IndexPointer, NormalPointer, SecondaryColorPointer, TexCoordPointer, VertexPointer, EnableClientState, DisableClientState, and InterleavedArrays, ClientActiveTexture; Frustum, LoadIdentity, LoadMatrix, LoadTransposeMatrix, MatrixMode, MultMatrix, MultTransposeMatrix, Ortho, PopMatrix, PushMatrix, Rotate, Scale, and Translate; Enable/Disable targets RESCALE_NORMAL and NORMALIZE; TexGen* andEnable/Disable targets TEXTURE_GEN_*, Material*, Light*, LightModel*, and ColorMaterial, Shade-Model, and Enable/Disable targets LIGHTING. VERTEX_PROGRAM_TWO_SIDE, LIGHTi, and COLOR_MATERIAL; ClipPlane; and all associated fixed-function vertex array, multitexture, matrix and matrix stack, normal and texture coordinate, lighting, and clipping state. A vertex shader must be defined in order to draw primitives. Language referring to edge flags in the current specification is modified asthough all edge flags are TRUE. Note that the FrontFace and ClampColor commands are not deprecated, as they still affect other non-deprecated functionality; however, the ClampColor targets CLAMP_VERTEX_COLOR and CLAMP_FRAGMENT_COLOR are deprecated
Из всего вышеперечисленного у меня осталась только загрузка матриц, т.к. надо в шейдерах перевести умножение на те, что приходят из пользовательских юниформов. Сама система материалов конечно же предоставляет такую возможность, однако ещё не во всех шейдерах это прописано. Ну тут как и с переписыванием самих шейдеров - код движка не затрагивается. С клип-плейнами я пока что ещё вообще не разбирался, т.к. непонятно как их задавать. Но полагаю это будет несложно сделать.
Цитата:
Client vertex and index arrays - all vertex array attribute and element array index pointers must refer to buffer objects. The default vertex array object (the name zero) is also deprecated. Calling VertexAttribPointer when no buffer object or no vertex array object is bound will generate an INVALID_OPERATION error, as will calling any array drawing command when no vertex array object is bound.
Тут всё в порядке - всё лежит в соответствующих массивах VBO.
Цитата:
Rectangles -Rect*.
По правде говоря, ксаш даже эти экспорты никогда не подтягивал, ни новый ни старый.
Цитата:
Current raster position RasterPos*andWindowPos*, and all associated state.
Аналогично ректанглам. Не использовалось.
Цитата:
Two-sided color selection Enable target VERTEX_PROGRAM_TWO_SIDE; OpenGL Shading Language builtins gl_BackColor and gl_BackSecondaryColor; and all associated state.
Не использовалось.
Цитата:
Non-sprite points Enable/Disable targets POINT_SMOOTH and POINT_SPRITE, and all associated state. Point rasterization is always performed as though POINT_SPRITE were enabled
Не использовалось. Я вообще от греха подальше выбросил рендеринг GL_POINTS. Да и нет в нём никакой особенной необходимости. Вот линии нужны, а точки нет.
Цитата:
Wide lines and line stipple -LineWidthis not deprecated, but values greater than 1.0 will generate an INVALID_VALUE error; LineStipple and Enable/Disable target LINE_STIPPLE, and all associated state.
Повторюсь - вроде бы как работает. Ну может только на Нвидии. Проверим.
Цитата:
Quadrilateral and polygon primitives - vertex array drawing modes POLYGON,QUADS, and QUAD_STRIP, related descriptions of rasterization of non-triangle polygons, and all associated state.
На данный момент ксаш оперирует только двумя типами примитивов - GL_LINES и GL_TRIANGLES. Так что и здесь всё в порядке.
Добавлено 15-03-2025 в 20:04:
Определим список новых задач, с учётом вышенаписанного (я всё это так подробно пишу, потому что может кому-нибудь ещё пригодится, да мало ли).
1. Избавиться от LoadMatrix
2. Избавиться от "йопанных клипплейнов"
3. Переписать все шейдеры ну как минимум на версию 130 (судя по всему версии 130 и 140 мало чем отличаются друг от друга).
Когда же и эти задачи будут выполнены, можно будет переходить уже к новым пунктам в документе.
Поскольку следующая масштабная задача - это переход на новую версию шейдерного языка, то имеет смысл почитать спецификацию этого самого языка. Оставлю здесь ссылки:
Здесь, как вы видите старый добрый принцип всё ещё в действии - подставляя в адрес просто другие циферки попадаешь на правильную страничку.
Добавлено вчера в 13:08:
Переход на новую версию шейдерного языка - это как бы вложенная подзадача в рамках миграции, поэтому давайте разберём, что же именно устарело с предидущей версии 120.
Цитата:
Use of the keywords attribute andvarying (use in and out).
Вот этот момент меня к слову и выбесил больше всё в своё время. Просто так на ровном месте бери да заменяй модификаторы на новые. Ну ладно, что тут сделаешь.
Цитата:
Use of gl_ClipVertex (use gl_ClipDistance)
Вот эту словесную конструкцию я не понял если честно. То есть понятно, что gl_ClipVertex устарел. Но здесь что предлагается? Использовать gl_ClipDistance вместо этого? Или gl_ClipDistance тоже устарел?
Но вот на сайте хроноса написано следующее:
Цитата:
gl_ClipDistance — provides a forward-compatible mechanism for vertex clipping
То есть я должен самостоятельно рассчитать уравнение плоскости от кастомной клип-плоскости и записать его в gl_ClipDistance. Ну ок, это без проблем вообще. Основная идея, как я понимаю, заключается в том, чтобы не пришлось самостоятельно кидать эту переменную во фрагментник, делать там условие с дискардом. OpenGL эту работу сам выполнит.
Цитата:
Use of gl_FragData and gl_FragColor (use user-defined out instead).
Ага, ну про это я тоже в курсе. Надо самостоятельно забиндить выходные атрибуты. Это нужно для более гибкого управления MRT, как я понимаю.
Цитата:
Built-in attributes. Use user-defined vertex inputs instead.
Тут проблем нет - у меня все атрибуты юзер-дефайнед.
Цитата:
Fixed function vertex or fragment stages mixed with shader programs. Provide shaders for all activeprogrammable pipeline stages.
Известная штука - ранее можно было объявить только один из двух шейдеров, а второй OpenGL брал по умолчанию с фиксированным функционалом. Теперь всё надо объявлять явным образом. Именно так я всегда и делал.
Цитата:
All built-in texture function names. See new names.
Вот это тоже тварство. Взяли все имена фетчинга в текстуру попеределывали. Ну ладно, чтож тут сделаешь.
Цитата:
Use of the built-in varyings gl_FogFragCoord and gl_TexCoord. Use user-defined variable instead
Первое никогда не юзал, а второе успешно выбросил, если и было.
Цитата:
The built in function ftransform. Use the invariant qualifier on a vertex output instead
Эту функцию я тоже не юзаю, хотя и в курсе про нее конечно.
Built-in coloring: gl_FrontColor, gl_FrontSecondaryColor, gl_Color, gl_SecondaryColor,gl_BackColor and gl_BackSecondaryColor
Не юзаю.
Добавлено вчера в 13:28:
Теперь давайте посмотрим, что же добавилось в версии GLSL 140 по сравнению с версией 130.
Цитата:
Add uniform blocks and layouts to be backed by the application through buffer bindings
Честно говоря не очень понял тут. То ли в 1.3 эту поддержку убрали, а в 1.4 снова добавили, но мне надо чтобы шейдер неявно пронумеровал атрибуты, а приложение просто взяло эти индексы - это важная часть системы материалов, которая позволяет выбрасывать из загружаемого VBO неиспользованные атрибуты и таким образом экономить видеопамять.
Цитата:
Rectangular textures, including the closure of the functionality indicated by the originaltexture_rectangle extension, the gpu_shader4 extension and the 1.3 version of GLSL
А вот это действительно важная вещь. Поясню почему. Дело в том, что некоторые вендоры на некоторых версиях драйверов (Интел, ага) непременно требуют, чтобы включение расширений происходило на начальных строках исходного текста шейдера. Из чего следует нехитрый вывод - я уже толком не могу это написать прямо в теле шейдера и в произвольном месте. Лучше всего это автоматически включить в тело шейдера. Вот тут-то и кроется засада! У меня нет механизмов для четкого определения что я использую ректангл-текстуру! То есть было бы гораздо лучше, если бы она просто поддерживалась в базе, да и всё. Поэтому имеет смысл сразу целиться на версию GLSL 140. Версия 140 - это как раз OpenGL 3.1, то есть именно то что и нужно. Тут всё в порядке.
Цитата:
Texture buffers
Не юзал, но возможно и буду. Дело такое.
Цитата:
Add gl_InstanceID for instance drawing
Ага, вот именно с версии 140 он уже в базе. Это отличная новость.
Но прикол в том, что glDrawElementsInstancedBaseVertex поддерживается только с версии 3.2. Взрыв мозга!
Цитата:
Don't require writing to gl_Position
Пока что ничего не могу сказать по этому поводу. Разумеется я всегда записываю результат в gl_Position. Ситуации, когда этого не требуется, у меня не возникало вроде.
Добавлено вчера в 13:35:
Следующий шаг: посмотрим что удалено в версии 1.4 по сравнению с 1.3. Т.е. для версии 1.3 они были просто нежелательны к использованию, но всё ещё продолжали работать, а тут их совсем удолили нахрен.
Цитата:
Use of gl_ClipVertex. Use gl_ClipDistance instead
Тут понятно, так и сделаю.
Цитата:
Built-in vertex shader inputs.
Не юзаю, тут всё хорошо.
Цитата:
Built-in uniforms except for depth range parameters
Наверное это всё что начинается с префикса gl_, разумеется за исключением gl_VertexID и gl_InstanceID.
Цитата:
Built-in interface between vertex and fragment: gl_TexCoord, gl_FogFragCoord, and all the colorvalues.
Не юзаю.
Цитата:
Built-in two-sided coloring.
Не юзаю.
Цитата:
Fixed functionality for a programmable stage. Supply shaders for all stages currently being used.
Не юзаю.
Цитата:
ftransform(). Use invariant outputs instead.
Не юзаю.
Добавлено вчера в 13:40:
Про версию шейдеров 150 кратко скажу, что там добавились геометрические шейдеры, а так же фетчинг для MSAA, но мне пока что это всё не нужно.
Тут бы с текущим разобраться, так сказать. В версию шейдеров 330 я тоже заглянул - по сравнению с версией 150 там ничего удалено не было, но добавился ARB_explicit_attrib_location который мне не нужен.
Итак, рабочий вариант - целимся на GL 3.1 и версию шейдеров 140.
Правда здесь есть две очевидных несуразности.
1. Инстансинг поддерживается только с версии GL 3.2
2. В OpenGL 3.1 вообще нет Core Profile.
Но в любом случае выбросить всё старое можно и не переключаясь на Core Profile - между прочим профит от исключения вызовов фиксированного конвейера из кода реально есть. Продолжаю работу.
Добавлено вчера в 14:19:
PS. Маленькая поправка: gl_ClipDistance можно будет использовать не раньше перехода на версию 130 или 140. На версии 120 этого сделать не даёт даже NVidia.
Супер! Работа проделана большая. А что такое VAO и IBO?
Цитата:
Дядя Миша писал: Да откуда ты понабрался этой пакости?
Что значит "прикрутить свои форматы" ? А может ты тогда заодно прикрутишь вообще всё, и операционную систему впридачу, и компьютер сам соберёшь и кремний из песка тоже добудешь, я правильно понимаю?
Я просто вижу что ты пишешь движок-эмулятор для других игр. И в этом контексте возможность подключать форматы этих игр была бы к месту, чтобы не искать исходники. Понятно что эта фича не для каждого, но зато тебе не нужно будет таскать все нужные тебе форматы во всех играх, а сделать их подгрузку для конкретной игры индивидуально. Чисто архитектурно я считаю это изящное решение.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Много текста, это, конечно, здорово. Хотелось бы увидеть, что и как движок на данный момент рисует. Особенно в свете последних требовательных игр, типа Инди Джонса и второго Свалкера. У меня от обоих видюха в 2k разрешении просто задыхается. А картинка на уровне первого Деда под спайсом, только текстуры чётче. Вот и не понятно, на что мощности компа расходуются.
Ku2zoff писал: Много текста, это, конечно, здорово. Хотелось бы увидеть, что и как движок на данный момент рисует. Особенно в свете последних требовательных игр, типа Инди Джонса и второго Свалкера. У меня от обоих видюха в 2k разрешении просто задыхается. А картинка на уровне первого Деда под спайсом, только текстуры чётче. Вот и не понятно, на что мощности компа расходуются.
На скриншотах будет думаю тоже самое. А вот производительность покажет только будующий бетатест.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Vertex Array Object и Index Buffer Object. VBO хранит вертексы, IBO хранит индексы, VAO ссылается на VBO + IBO + раскладку вертекса в памяти для этих буфферов.
Цитата:
FiEctro писал: Я просто вижу что ты пишешь движок-эмулятор для других игр
Я не пишу движок-эмулятор для других игр, очевидно же. Это приятная побочная возможность, но не более того. Старые игры помогают отладить движок и сделать его стабильным и проверенным в реальных условиях.
Цитата:
FiEctro писал: но зато тебе не нужно будет таскать все нужные тебе форматы во всех играх, а сделать их подгрузку для конкретной игры индивидуально
Движок в любом случае работает только со своими форматами, которые спроектированы специальным образом. Единственное место, где это может понадобиться - это на этапе загрузки исходников уровней. Ну и возможо ещё поддержка вальвовских форматов текстур. Обычно с собственным форматом текстур мало кто заморачивается, тут скорее исключение.
Цитата:
FiEctro писал: Чисто архитектурно я считаю это изящное решение.
Возьми движок от ночных водолазов, как он там называется. Вот эта помойка умеет работать с любыми форматами, потому что там просто половину кода от старой игры копируют на некую базу и таким образом получают совместимость. Разумеется движок, сконфигурированный для q1 и для q2 таким образом - это две разные версии движка, между которыми нет ничего общего. Особенно приятно всё это поддерживать, я полагаю.
Цитата:
Ku2zoff писал: Хотелось бы увидеть, что и как движок на данный момент рисует
Дядя Миша писал: Движок в любом случае работает только со своими форматами, которые спроектированы специальным образом. Единственное место, где это может понадобиться - это на этапе загрузки исходников уровней. Ну и возможо ещё поддержка вальвовских форматов текстур. Обычно с собственным форматом текстур мало кто заморачивается, тут скорее исключение.
Движок работает с треугольниками и текстурными координатами, а что там за форматы ему как то фиалетово. Ну по крайней мере в Юнити/Анрилах так И никто там движок не пересобирает.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Дядя Миша писал: В таком случае напиши простенькую программку, которая в цикле рендерит треугольники - вот тебе и готов движок
Так вон в хл1 же триапи был, насколько я помню им так же можно было рисовать что угодно. Не удивлюсь если там можно будет даже ему геометрию из какого нибудь .obj или .fbx скормить. Ещё я помню Сразу Рашен прикручивал .tga текстуры к клиенту халфы.
Вот в новом Ксаше тоже чего такого не хватает. В Юнити например есть мешрендер и физик меш, которые принимают на входе теже треугольники (откуда угодно, хоть из файла, хоть проценурные), и можно ими рисовать в движке всё что захочешь. Тоже самое и с текстурой. Создаешь вызов процедурной текстуры и заполняешь её пикселями процедурно или из файла, хранишь в памяти и рисуешь где угодно. Но это ты уже вроде как реализовал.
Этих инструментов уже с головой хватит чтобы при наличии пользовательского самописного загрузчика при загрузке карты сгенерировать геометрию, колизию и текстуры из форматов которые изначально не поддерживались.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!