Дядя Миша писал: Проблема короткого варианта ещё и в том, что решительно невозможно понять, как применяются параметры - до указанного слова или же после.
В вышеприведённой записи они присутствуют и так и эдак.
Ну сделай ты уже чтобы параметры были на той же строке что и сентенция, а разные сентенции были на разных строках.
Для человека с гуманитарной жилкой совершенно не очевидно что в линейном переборе параметры после сентенции относятся к ней, они с таким же успехом могут относиться к следующей.
XaeroX Я раза три прочитал прежде чем заподозрил что это не просто набор слов. Сначала показалось что это какая-то повесть о превозмогании "трудно, выл и лизал"
Crystallize повесть об эмиграции. Нудный труд по вылизыванию котлов, призы в виде скидок по акциям, а потом увольнение и привет, котомка и просторы улиц с тёплыми вентиляционными решётками.
Добавлено 26-02-2025 в 00:55:
Цитата:
Дядя Миша писал: Если бы они поддерживались каждым блокнотом, то безусловно.
Crystallize писал: Сначала показалось что это какая-то повесть о превозмогании "трудно, выл и лизал"
И демоны тусклых квартир цедили из ран нашу боль!
Стращали охраной порядка, лизали Луной!
Ну да ладно, прежде чем прийти к чему-то определённому в будущей системе, неплохо бы определиться с тем, что мы уже имеем и понять, нужно ли это нам.
В халфе, в системе сентенций, как вы знаете, есть ПЯТЬ параметров, обозначенных буквами:
v - громкость
p - pitch
s - начало звука
e - конец звука
t - тайм-компрессия (вырезана в сорсе)
Все параметры выражены в процентах, от 0 до 200. Т.е. максимум можно выставить 200 процентов или множитель 2.
Исследование начнём прежде всего с самых загадочных параметров s и e,
действие которых самое очевидное. И, как вы догадались, здесь проценты не могут быть больше ста.
Разберём на примере - (s50) провоцирует проиграть файл, начиная с середины и до конца. (e50) - сыграть с начала и до середины.
То есть это нечто вроде ножниц, скиссора (который в переводе те самые ножницы и есть).
Пример использования
C++ Source Code:
BA_ATTACK0 barney/openfire(e50)
BA_ATTACK1 barney/openfire(s50)
Сентенции ссылаются на один и тот же файл, только первый проигрывается до середины, а второй - с середины. То есть технически в файле как бы зашито две фразы. В принципе, в самой халфе это почти неиспользуется. Есть вот такие забавные конструкции
C++ Source Code:
please(s0 e100)
Заведомо бессмысленные то есть. Начать с нуля процентов, играть до ста процентов.
Иногда вот такое попадается
C++ Source Code:
(s5)
Не знаю даже, можно ли как-то услышать, что воспроизведение началось с пяти процентов файла? Учитывая общую краткость сэмплов.
Вот такие ещё конструкции попадаются
C++ Source Code:
(s0 e100 t0)
Начать с нуля, проиграть до ста процентов, таймкомпрессия 0.
То есть сдвиг с начала практически не используется. Обрезание конечной части напротив юзается куда активнее, особенно в сентенциях грантов.
Рискну сделать небольшое предположение. Сентенции грантов идут в описании самыми первыми. Скорее всего именно этих монстров и сделали самыми первыми и всю систему тестировали именно на них, активно используя фичи, которые сделали "про запас". То есть все эти настройки не добавляли по необходимости, а наоборот - сделали изначально в рассчёте на активное применение. И на грантах показали как это будет выглядеть.
Есть ещё любопытное применение, на примере костюма
C++ Source Code:
HEV_D00 fvox/fuzz fuzz(p130), power_restored
Вот у нас произносится полная фраза Power restored.
А вот здесь:
C++ Source Code:
HEV_1P fvox/fuzz fuzz, power_restored(e30), ten percent
Обрезанная до 30 процентов, т.е. только слово Power. Переиспользование фразы. Видимо основной смысл в том, чтобы не лезть каждый раз в редактор и не плодить короткие копии. То есть небольшая оптимизация по памяти. Хотя звуки в принципе мало места занимают.
Так или иначе, в самой халфе эти фишки используются для следующих сентенций:
Гранты
Компьютер в лабораториях
Аварийные двери
HEV
Уровне-специфичные сообщения (как правило имеют составное имя из имени карты и номера сообщения).
Так же любопытно отметить, что сентенции для г-мена, учёных, барни и джины никакие параметры практически не используют, впрочем там и сентенции состоят из одного файла, как правило.
Добавлено 26-02-2025 в 11:17:
Продолжаю исследование. Система на самом деле очень капризная.
Вот я составил сентенцию
C++ Source Code:
TEST hgrunt/ (p200)clik,,, (p100)clik,,, (p50)clik
Ругается, что не может загрузить файлы. Зато вот так
C++ Source Code:
TEST hgrunt/clik(p200),,, clik(p100),,, clik(p50)
Работает. Следует так же отметить, что регулировка pitch работает только в небольших пределах и преимущественно вверх. То есть pitch = 50 звучит уже довольно уродливо, не говорю уже про pitch 10. Скорее всего реальный диапазон регулировки лежит между 70 и 130. Так же отмечу, что множественные запятые парсером игнорируются почему-то.
Добавлено 26-02-2025 в 11:38:
Очень вязкая система на самом деле. Вот так:
C++ Source Code:
TEST hgrunt/heavy!(v50) heavy
Первый звук звучит на половинной громкости, а второй - на полной
А вот так
C++ Source Code:
TEST hgrunt/heavy! (v50) heavy
Первый звук звучит на полной громкости, а второй - на половинной.
Догадались в чём дело? Да, во втором случае есть пробел. Питонисты будут в восторге, я полагаю. Но ни один нормальный человек вникать в эту чушь не станет.
Добавлено 26-02-2025 в 12:24:
Давайте подведём некие промежуточные итоги.
Хотя вышеприведённые параметры и можно крутить на первый взгляд в широких пределах, они либо ограничены физическими размерами файла, либо частотными характеристиками звукового тракта.
То есть, к примеру сделать определённую фразу в два раза громче не факт что получится, а вот в два раза тише - можно.
Тримминг с начала сэмпла использется в одном-единственном месте.
Тримминг в конце сэмпла как правило чаще, он как бы помогает "глотать" окончание слова, добавляя экспрессии.
Громкость для экспресии фраз не используется на удивление, только для амбиентных звуков, как бы подчёркивая их удалённость. Кстати да, громкость от 0 до 100, т.е. выше ста не используется.
Питч используется более активно, от 50 до 130 примерно.
Но тут опять же, это скорее уместно для всяких компьютеров, чем для персонажей. Например для симуляции поломки техники.
Плохо то, что питч применяется фиксированно к слову и не может меняться, например, на протяжении проигрывания всей фразы плавно. Точнее говоря такой функционал есть, но в рамках ambien_generic. А вот внутри описания сентенции подобное задать невозможно.
Добавлено 26-02-2025 в 12:29:
Ну и таймкомпрессия наконец. Это кстати весьма прикольная штука, позволяющая растягивать или укорачивать слова, не меняя их тон.
Не понимаю, почему её выбросили в Source. И кстати её нет в OpenAL почему-то. Печально.
Но эта одна из тех вещей, которая бы реально могла разнообразить сентенции.
(t40) отделённая пробелами означает дефолтный параметр, т.е. применяющаяся ко всем последующим словам и фразам.
А следующая сразу за какой-либо фразой - применяется только к ней.
Прикол в том, что нельзя прописать к примеру
C++ Source Code:
hgrunt/ (t40)
Это трактуется как ошибка. Надо писать непременно
C++ Source Code:
hgrunt/(t40)
Вообщем довольно неоднозначно.
У меня вообщем-то были мысли заменить это дело на какую-то более интуитивную систему, ну например использовать орфографию для задания тех или иных эффектов, но по здравом размышлении я всё же отказался от этого. Во первых, очевидно, если я захочу добавлять новые параметры, исчезнет простота и лёгкость, превратится в визуальное нагромождение.
Во вторых люди порой любят именно крутить константы. Так что пусть их крутят. Но неоднозначность убрать необходимо я считаю.
Мне кажется надо сделать следующее:
1. параметры внутри круглых скобок следует отделить запятыми для наглядности, чтобы это больше было похоже на вызов функции с параметрами. Примерно так (p130, v70, e95).
2. Чтобы больше не зависеть от пробелов и не запоминать когда пробелы нужны, а когда не нужны, ввести чёткие правила расстановки:
2.1 параметры всегда пишутся после слова, к которому применяются
2.2 для обозначения дефолтных параметров используется ключевое слово default
2.3 допускается явный промежуток после указания пути к папке со звуками
C1A0_8 dadeda (e95) coded message for captain black, command and(s0 e100 t0) communication center(e100)
Стало:
C++ Source Code:
C1A0_8 vox/ dadeda default(e95) coded message for captain black, command and(s0, e100, t0) communication center(e100)
На что тут обратить внимание. Ну во первых в халфе была папка по умолчанию vox. Мне такой хардкод не нужен, поэтому папку следует каждый раз указывать явным образом. В вызове (s0, e100, t0) добавились запятые. Ну и ключевое слово default.
На первый взгляд изменения чисто косметические, но их важность в том, что они не оставляют пространства для разночтения.
Так же, можно попробовать заменить слово default на какой-либо спецсимвол например, поскольку это слово само по себе может потенциально путать. Этот момент я ещё обдумаю.
Дядя Миша писал: Здесь нужен не аниматор а интуитивно считываемые спецсимволы.
Но я пока ещё не готов сказать точно.
Ты когда то говорил что некоторые разработчики вместо того чтобы решить проблему на корню, начинают городить огород поверх. Не кажется что здесь у тебя такой же случай? Такие вещи должен в целом отрабатывать секвенсер, а не кучка прибитых гвоздями команд
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
На данный момент я сохраню совместимость. А потом посмотрим.
Добавлено сегодня в 09:59:
Пока что не стал предпринимать радикальных шагов, ограничился двумя нововведениями:
1. можно написать hgrunt/ (p110) с пробелом после слэша и это будет работать. В оригинале просто выдавало непонятную ошибку. То есть
hgrunt/(p110) эквивалентен hgrunt/ (p110). Это касается только второго токена в декларации, который задаёт рабочую папку для звуков сентенции.
Здесь изначально присутствовала неоднозначность, поскольку по логике вещей мы задаём дефолтный параметр для всей сентенции, а значит нам его надо отделить пробелом, но оригинальный парсер почему-то ругался когда мы отделяли пробелом путь к папке от параметров и вообще ничего не грузилось. Теперь оба варианта валидны.
2. внутри круглых скобок, между объявлением параметров теперь допустимо ставить запятую, пример (p110, v50, t30). Раньше так было нельзя, можно было писать только (p110 v50 t30). Теперь допустимы оба варианта. Вариант с запятой больше похож на параметры функции, а значит и более нагляден.
Старый вариант оставлен ради совместимости.
В принципе на этом пока что и всё. Более радикальные изменения вероятно будут с появлением новых возможностей в звуковом движке, например, если я перведу его на OpenAL.
Добавлено 03-03-2025 в 10:11:
Ну чтож, приступил к имплементации Core Profile. Дело это ответственное, поэтому сперва надо как следует ознакомиться с документацией:
Цитата:
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.
Иными словами начиная с версии 3.2 гарантированно поддерживаются только Core Profile и нормально работают только они. Разумеется профиль совместимости есть во всех драйверах, но там особого ничего не гарантируется. Что мы и наблюдаем, собственно.
Добавлено 03-03-2025 в 10:18:
Цитата:
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.
Отсюда становится понятным, что доступность старых фичей теперь следует проверять через специальное расширение GL_ARB_compatibility, тогда как типичный способ проверки может вернуть поддержку, но при этом в режиме совместимости фича просто не включится. Ну например потому что драйверописатели не успели её включить в профиль совместимости. Но формально, повторюсь, железо её поддерживает. Этим в особенности славился Intel и я никак не мог понять что за чертовщина. Ну вот теперь стало понятно. Хотя в имплементации Core Profile эта информация нам никак не поможет, но хотя бы ответ на старый вопрос получен.
Добавлено 03-03-2025 в 10:19:
Так же, как видите, минимальная версия GL, с которой вообще начались эти профили - как раз 3.2. И инстансинг присутствует начиная с этой версии.
Так что возможно именно версию 3.2, а не 3.3 следует сделать в качестве базовой, ну впрочем посмотрим.
Чтобы не лезть каждый раз в спецификацию, я вынесу сюда список всего, что было удалено из Core Profile и прокомментирую. Итак, поехали:
То что не рекомендуется к использованию:
Цитата:
Wide lines -LineWidth values greater than 1.0 will generate an INVALID_-VALUE error
Насколько я понимаю, предлагается самостоятельно отрегулировать толщину линии через пользовательский шейдер. У меня почти везде используется значение 2.0, но это только для вывода отладочной геометрии.
Цитата:
Global component limit query - the implementation-dependent values MAX_VARYING_COMPONENTS and MAX_VARYING_FLOATS.
Движок считывает этот параметр и может показать пользователю в консоли при вводе команды r_info. Но сам никак его не использует. Так что можно просто выбросить без проблем.
Добавлено 03-03-2025 в 10:50:
Цитата:
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*.
С этим у меня нет проблем, об этой особенности я давно знал, поэтому новые объекты всегда генерирую через соответствующую функцию. Для интерисующихся сообщу, что раньше было можно задавать номер напрямую, что к примеру делал Кармак в Quake. Теперь такое поведение работать не будет. Здесь мне ничего менять не нужно, проблемы нет.
Добавлено 03-03-2025 в 10:52:
Цитата:
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.
Эту фишку кстати использовал GoldSource для более эффективного хранения текстур с палитрой. Суть была в том, что палитра отделялась от основного изображения и совмемещалась с ним во время рендеринга. Ну впрочем её уже довольно давно выбросили, а я никогда и не использовал. Так что с этим тоже всё в порядке.
Добавлено 03-03-2025 в 11:03:
Цитата:
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.
А тут конечно проблема. После версии 1.2 синтаксис сильно поменялся, мне предстоит переписать абсолютно все шейдеры на версию 320.
Собственно, учитывая тот факт, что шейдеры придётся переписывать, я и не старался их как-то сильно оптимизировать или хорошо оформить их код.
Но теперь уже можно переписать набело, так сказать. Собственно шейдеры я могу начать переписывать уже прямо сейчас, не переключаясь на Core Profile. Чтобы не иметь сразу несколько точек нестабильности в процессе перехода.
Добавлено 03-03-2025 в 12:14:
Цитата:
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.
Ну тут понятно - никаких бегинов больше нет. У меня это используется для вывода отладочной геометрии, а так же для отрисовки HUD и меню. Тут сложнее в том смысле, что вывод геометрии теперь обязан иметь пользовательский шейдер (в режиме совместимости используется шейдер, встроенный в драйвер и эмулирующий FFP). И здесь уже сложнее, поскольку рендер Ксаша не предполагает рендеринг минуя систему материалов, а система материалов в свою очередь затачивалась под 3D рендеринг, который резко отличается от 2D рендеринга. Для 3D достаточно один раз настроить все материалы и дальше просто подавать это на вход тесселятора, пусть рисует. В 2D так не получится - у нас же нет Z-буффера, значит порядок отрисовки важен. Мы по прежнему можем батчить секвенции, написать эмулятор бегинов, да я собственно это давно уже сделал, однако оптимизировать секвенции уже не имеем права - то есть вывод именно в таком порядке, в котором он был задан пользователем.
И что характерно, для 2D рендеринга возможности системы материалов практически не нужны. Там как правило одна текстура и переключение режимов блендинга. Из чего вытекает нехитрый вывод, что нам не нужно создавать материал на каждую загруженную 2D картинку. Это нам скорее наоборот будет только мешать. Но при этом желательно всё же предусмотреть подобную возможность. Например, если мы захотим снабдить наших спрайтовых персонажей нормал-мапой по новомодной технологии, описанной на хабре. То есть в норме всё равно должна быть у нас возможность подключать к выводу 2д геометрии любые шейдеры. Это и так отвечает поставленным мною задачам максимальной кастомизации, поэтому надо реализовать в любом случае. Но повторюсь, тут нельзя просто скопировать поведение материалов из 3D конвейера. Хотя материалы в сущности будут те же самые.
Добавлено 03-03-2025 в 12:19:
Цитата:
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
Аналогично вышесказанному. На данный момент используется в отладочной отрисовке, чтобы избежать написания дополнительного шейдера. Для транслейтов-ротейтов и прочих операций с матрицами давно написана имплементация, но на данный момент это ещё используется для 2D рендеринга, который использует FFP. Что логично. Легко выбрасывается. Единственный момент, который я недопонял - это с клип-плейнами. Ну если они нужны только в вершиннике, то ок.
Добавлено 03-03-2025 в 12:35:
Цитата:
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, который прилинкован к VAO. Все механизмы для этого у меня есть, давно отлажены, но ещё не везде используются. Проблем с этим нет.
Добавлено 03-03-2025 в 12:36:
Цитата:
Rectangles -Rect*.
Никогда в жизни это не использовал и не интерисовался зачем оно нужно.
Добавлено 03-03-2025 в 12:37:
Цитата:
Current raster position RasterPos*andWindowPos*, and all associated state.
Использование glRasterPos видел очень давно в примерах от NeHe для вывода 2D текста. Больше нигде не видел. Сам не использую.
Добавлено 03-03-2025 в 12:38:
Цитата:
Two-sided color selection Enable target VERTEX_PROGRAM_TWO_SIDE; OpenGL Shading Language builtins gl_BackColor and gl_BackSecondaryColor; and all associated state.
Тоже не юзал никогда.
Добавлено 03-03-2025 в 12:40:
Цитата:
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
Никогда не использовал, хотя для отладки возможно кое-где и мог бы.
Добавлено 03-03-2025 в 12:42:
Цитата:
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.
Очень очень обидно что выбросили толщину линии. Ну или на словах не выбросили, а по факту оно не работает. Это нужно только для отладочной отрисовки, но слишком тонкие линии могут растворяться в геометрии, поверх которой они выводятся. Я возможно введу консольную переменную для регулировки толщины этих линий, вдруг у кого-то да заработает? Мало ли.
Добавлено 03-03-2025 в 12:44:
Цитата:
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.
Квады выбросили. Эту задачу решает мой собственный эмулятор бегинов, который уже написан. Некритично.
Добавлено 03-03-2025 в 12:48:
Ну чтож, для начала вышеперечисленного вполне достаточно. Там дальше ещё довольно много пунктов, но я полагаю, что сперва надо реализовать то, о чём уже написано. А потом двигаться дальше.
И начну я с добавления кастомных материалов для 2D отрисовки, а так же для отрисовки отладочной. Чтобы всю геометрию перенести в VAO.
Добавлено 03-03-2025 в 13:38:
Впрочем нет. Начну я с ревизии отладочной визуализации. Как вы наверное уже догадались, в процессе имплементации той или иной подсистемы я по быстрому городил дебаг-отрисовку, чтобы убедиться что всё работает правильно. На бегинах, естественно. Часть этой отрисовки уже давно потеряла свой контекст, она никому не нужна, к тому же у меня есть уже структурированная отладочная отрисовка, которая в дальнейшем и предполагается к использованию. А часть отрисовки у меня вообще сделана функциями, взятыми ещё из P2:Savior. Понятно что оно ни на что не влияло, но это как раз прекрасный повод выбросить не нужные режимы отладочной визуализации, а нужные - структурировать в единую систему. Которая в дальнейшем и будет переведена на динамически обновляемый VBO.
Настала пора подвести промежуточные итоги. В деле перехода на Core Profile у нас аналогичная ситуация, когда одно цепляется за другое и порядок работы строго определён. Поэтому я возился целых пять дней и на данный момент смог только избавиться от пары glBegin\glEnd.
Но, как вы понимаете, это одна из самых важных вещей. Дальше уже должно пойти полегче. Кроме ситуации с альфа-тестом, вот этот момент меня прям дико вымораживает.
Итак, я структурировал и упорядочил всю отладочную отрисовку и перевёл её на динамический VBO, который на данный момент тем не менее всё равно использует фиксированный функционал для отрисовки. Так же я полностью сбатчил всю 2д-геометрию, к которой относятся видеоролики, худ, меню, отладочная отрисовка и консоль. Теперь всё это обновляется с частотой 60 герц. И VBO обновляется с такой же частотой. Бегинов в коде больше нет.
А вот отрисовка без шейдеров - есть. Разумеется мне не хотелось бы просто подключить туда некие встроенные шейдеры, это негибко. Нужно всё это тоже реализовать через систему материалов. И тут конечно надо подумать.
Если для отладочной отрисовки какие-то особенные материалы и не нужны, то для 2д они очень даже пригодятся. Чтобы иметь возможность подключать разные кастомные эффекты, например. Со шрифтами вопрос решается удобно, каждому шрифту можно дать свой материал. А как быть с одиночными картинками? Этот вопрос ещё предстоит проработать.
Итак, следующая задача - перевод абсолютно всей отрисовки на шейдеры и материалы.
Ну да, UI тоже шейдеры нужны. И ещё сразу вопрос на засыпку, будет ли возможность подключать .ttf шрифты? Потому что те шрифты что есть сейчас, никуда не годятся, они мыльные.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
XaeroX писал: В волатиле битмаповые шрифты, и вполне чёткие. Секрет в нормальном растеризаторе
Подскажи где взять такой.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!