В предыдущей части было очень много написано о проблемах, такова уж цена новых технологий.
Теперь самое время поговорить об открывающихся возможностях, и о том, зачем вообще был нужен этот переход от дисплейных списков на VBO.
Как уже было сказано ранее — основное преимущество перед glBegin/glEnd и VBA заключалось в хранении данных в видеопамяти, что позволяло GPU мгновенно получать доступ к данным, не дожидаясь пока CPU доставит их по достаточно медленной шине и простоев, связанных с таким ожиданием. Но аналогичный результат можно было получить и через дисплейные списки, суть которых как раз и была в том, чтоб набор команд ОГЛ, в том числе и команд рисования, скомпилировать в один пакет, загрузить его в видеопамять и там выполнить эти же инструкции.
Мало того, в дисплейный список можно было помещать не только команды рисования, но и команды установки состояний ОГЛ, таких как бинд текстур, установка свойств материалов, задание трансформаций и т.д. (мы к этому еще вернемся, когда будем рассматривать проблемы создания GUI). Кроме этого, в дисплейном списке выполнялось еще много чудесных вещей, таких как оптимизация геометрии под pre-/post-TL cache мы поговорим позже, сейчас мы рассмотрим ключевые моменты, почему все же стоит использовать VBO, не смотря на все описанные ранее проблемы.
VBO и DisplayList
Первая ключевая особенность это возможность менять часть (или все) данных прямо в видеопамяти. Представь что вы сделали классический пример со снеговиком, скомпилировали его в дисплейный список, а теперь вам вдруг понадобилось приподнять ему нос, для этого нужно всего-то передвинуть одну-единственную вершину, но используя дисплейный списки мы были вынуждены из-за одной вершины полностью перекомпилировать весь дисплейный список со всей геометрией и всеми командами.
А теперь представьте себе что мы хотим чтоб он постоянно двигал носом, что в этом случае делать? В таких случаях мы, скрипя зубами, разбивали модельку на несколько частей, одну часть запихивали в дисплейный список, вторую, которую нужно было обновлять, помещали в буфер VBA, обновляемый на каждом кадре, или вообще рисовали через glBegin/glEnd. Сделали? Молодцы, а теперь нам нужно поморгать глазками.
В результате для динамически изменяемых моделей использование дисплейного списка было неприменимо, и вместо него приходилось использовать те самые glBegin/glEnd, или более новый (но так же нагружающий шину) VBA. Вот тут-то VBO раскрывается во всей красе, имея доступ ко всем вершинам модели мы можем изменить любую из них, что происходит практически мгновенно. В худшем случае скорость обновления приближается к скорости работы VBA.
Естественно, обойти стороной такую возможность я не мог, потому в VBOMesh вы можете манипулировать с данными на низком уровне, обновляя как отдельные вершины так и полностью перестраивая буфер VBO. Так же эта возможность используется разными частями модуля, к примеру при выводе системы частиц или GUI. Более подробно об этом будет сказано при рассмотрении соответствующего функционала.
#2 Minecraft с нуля на C++ — VAO и VBO
Второй важный момент — раздельные буферы вершинных атрибутов. Это фактически не имело аналогов (кроме VBA). Идея заключается в том, что мы можем хранить в видеопамяти несколько наборов данных, к примеру два набора текстурных координат или несколько наборов буферов цвета, или несколько наборов вершинных координат.
Тогда для того, чтоб «переодеть» актера достаточно подключить второй текстурный буфер, что заключается в изменении всего одного индекса. Чтоб перекрасить автомобиль — достаточно так же поменять один индекс, чтоб заставить снеговика повернуть голову — так же нужно поменять один индекс. Таким образом можно реализовать морфинг, можно реализовать смену «одежки» или раскраску юнитов, можно реализовать разные состояния GUI, сделать развивающийся плащ или флаг и многое другое. Все это выполняется мгновенно, так как все данные уже находятся в видеопамяти и за счет разделения этих буферов между несколькими объектами существенно экономится память.
В отличии от GLScene в моем модуле все идентификаторы буферов VBO доступны для чтения/записи. Это конечно перекладывает ответственность за корректность идентификаторов буферов на пользователя, но открывает перед пользователем новые перспективы.
Третий важный момент — возможность представления геометрии в виде текстуры и наоборот.
Существует так называемая технология «r2vb» (render to vertex buffer), включающая в себя технологии VBO + PBO + FBO + MRT. Идея заключается в том, что используя PBO (Pixel Buffer Object) можно представить буфер VBO в виде текстуры (и как следствие — можно использовать его в фрагментном шейдере) и наоборот, используя FBO можно прямо в фрагментном шейдере сгенерировать буфер VBO.
Примером такого использования может быть «аппаратная тесселяция», нет, не та, для которой нужно иметь современную видеокарту. Это полноценная аппаратная тесселяция (так как геометрия формируется на GPU в фрагментном шейдере), но работающая на всех видеокартах с поддержкой ОГЛ 1.5+
Так же интересный момент использования такой технологии это скелетная анимация, в этом случае в вершинном шейдере просчитывается вся скелетная анимация и на выходе мы получаем готовую модельку.
Все описанные технологии представлены в движке, боле подробно в последующих сообщениях.
В следующей части я рассмотрю вопросы оптимизации VBO.
Источник: vbomesh.blogspot.com
что такое vbo в майнкрафт
Все остальные параметры прибавляют отзывчивости буквально по крохам. Настроить майнкрафт на максимальную производительность и объяснить, что означает каждый параметр, вот цель данной статьи.
Проверялось всё на версии 1.10.х
Как настроить графику в Майнкрафт
За основу взят чистый клиент Майнкрафт, без модов и текстур. Собственно такие настройки выставил у себя для комфортной игры.
Чтобы увидеть количество фпс в игре, нужно нажать F3.
Графика: Детально или Быстро
На моем ПК, изменение этого параметра, меняет фпс в районе 10-20, особенно это заметно во время дождя.
При включении Детально будут появляться частицы дождя и прозрачность листвы.
При выставлении Быстрая данные эффекты отображаться не будут.
Мягкое освещение
Использование этой настройки влияет на качество теней в Майнкрафт. По умолчанию она включена и стоит на максимуме.
Если у вас слабая видеокарта, то отключение мягкого освещения, может неплохо прибавить FPS.
3D анаглиф
Включение этой настройки может потребоваться, только когда вы захотите лицезреть игровой мир с 3D-эффектом через очки. Этот параметр понижает фпс очень и очень прилично.
Интерфейс
Тут каждому свое. На производительность не влияет. Отвечает за отображение всех иконок, интерфейса, менюшек.
Яркость
На количество фпс так же не влияет. Но влияет на комфорт игры.
Частицы
Грубо говоря, это те самые спецэффекты, которые делают игру невыносимой на слабых компьютерах. Особенно в моменты, когда идет массовое сражение и «дым столбом стоит». Это дождь, пузыри, следы, искры и прочее. Все это можно отключить выставив эту настройку в Меньше
Но есть и минусы, не всем комфортно играть с таким фпс и с небольшой задержкой при нажатии на клавиши. Но наша задача набрать максимальное фпс, поэтому оставляем Выкл.
Прорисовка
Дальность прорисовки чанков. В игровом мире 1 чанк равен 16*16*256 блоков (Ш*Д*Г). Как только чанк прорисовывается и игрок попадает в него, сразу же для него грузятся все мобы, предметы и другие объекты. Данный параметр очень сильно влияет на производительность. Как настроить ее, здесь каждый должен подобрать себе значение и найти компромисс между красотой в игре и хорошим фпс.
Частота кадров
Данная настройка позволяет не грузить видеокарту по полной. Меньше нагрева, меньше шума. Попробуйте выставить это значение процентов на 30% ниже от вашего среднего фпс. Задумка кроется в том, чтобы у видюхи хватало ресурсов на обработку новых сцен и не было резких просадок и фризов. Т.к. у нее будет определенный запас по производительности.
Данный совет не относится к тем у кого 5-10-15 кадров в секунду. Для вас это значение должно стоять максимум.
Покачивание камеры
Когда персонаж перемещается, камера покачивается. Это лишнее. Выкл.
Индикатор атаки
Время перезарядки сильного удара. На свое усмотрение.
Облака
Данная настройка влияет на фпс, желательно ее Отключить или выставить в положение Быстрая. Тогда они будут прорисовываться, но плоскими. У нее есть полезная функция, облака всегда движутся на запад, что позволяет по ним ориентироваться на местности.
Полноэкранный режим
Все мы привыкли играть в игры в таком режиме. Но если видюха слабенькая, то переключение на оконный режим, может повысить фпс на 20-30 значений.
Уровни детализации
Сглаживание текстур. Вся нагрузка по работе сглаживаний ложится на видеокарту. Поэтому если она бюджетная и чихать на качество картинки, отключайте данный параметр.
Тени сущностей
Появляются тени от персонажей, мобов, предметов. Влияет на производительность. Выкл.
Вот и рассмотрели все варианты как настроить Майнкрафт стандартным способом. Хотя большинство параметров и так интуитивно понятны, но именно 4 настройки, указанные в начале статьи, больше всего влияют на производительность.
Что-то про VAO/VBO, шейдеры
CumingSoon
Местный стендапер
Также, VBO представляет из себя массив ака буфер данных, находящийся в видеопамяти.
Q: Что такое VAO?
А: Всё очень просто, это массив, содержащий буферы с данными(те самые VBO), а также последовательность индексов(о них позже).
Допустим, рисуется параллелограмм(выше картинка). Поскольку ОГЛ рисует треугольниками, то наш параллелограмм распадается на 2 треугольника. Каждая из 4 вершин может иметь: позицию(3 координаты), UV-координаты(2 координаты). Значит, VAO будет следующим(тут вершины повторяются, поскольку мы описываем треугольники, а каждому из них нужно указать три вершины в опр. порядке):
-VAO
—Pos0
—UV0
//второй треугольник
—Pos2
—UV2
Итого, 6 * (3 + 2) = 30 чисел.
Вместо того, чтобы загружать каждый раз данные о вершине, мы загрузим разово все вершины и последовательность, в которой эти вершины будут рисоваться(индексы). Тогда VAO примет вид:
—indices[0, 1, 2, 2, 3, 1]
Итого, 4 * (3 + 2) + 6 = 26 чисел. Экономия в 4 числа.
— Всего?!
Да, всего. Но мы ведь рисуем лишь два треугольника, а какова будет экономия, если нарисовать 2-3к треугольников?
Local Space: локальное пространство фигуры. Думаю, всё понятно, да?
World(global) Space: мировое пространство фигуры. Тут тоже всё ясно, так?
View(camera) Space: пространство в камере. В мире компьютерной графике вращается не камера, а вершины фигур, смещаются также вершины. Камеры нет, это всё ложь.
Clip Space: если вы используете перспективную проекцию, то более далёкие фигуры будут меньше, чем ближние; параллельные прямые начинают сходится. Но можно задать ортогональную проекцию. Тогда все фигуры будут одинаковых размеров, будто б не удалены; параллельные не сходятся. О построении матриц проекции:
http://ogldev.atspace.co.uk/www/tutorial12/tutorial12.html
http://www.songho.ca/opengl/gl_projectionmatrix.html
¿Deberías mantener los VBO encendidos o apagados en Minecraft? (11.23.21)
Cada videojuego ofrece diferentes opciones y configuraciones que tienen un efecto sobre cómo se ve el juego y cómo se desarrolla realmente. Por ejemplo, establecer la configuración de textura demasiado alta permite al jugador cargar texturas de alta calidad en su juego. Del mismo modo, reducir algunas configuraciones le da al jugador un aumento de rendimiento.
VBOs activados o desactivados en Minecraft
Al acceder a la configuración de Minecraft, es posible que haya notado una opción llamada «VBO». Es una de las muchas opciones que puedes encontrar dentro de tu configuración de gráficos / video en los videojuegos. La mayoría de los jugadores no tienen mucha idea de lo que son los VBO, por lo que preguntan si deberían encenderlos o apagarlos.
Lecciones populares de Minecraft
Hoy, Discutiremos esto en detalle para ayudarlo a saber si debe mantenerlo encendido o apagado. Entonces, ¡vayamos directo a eso!
¿De qué se trata la configuración de VBO?
Para aquellos de ustedes que no lo saben, las VBO son básicamente una configuración de video que son las siglas de Vertical Buffer Object. Es una función de OpenGL que es responsable del tipo de procedimiento o método que utiliza el juego para cargar los datos de los vértices (incluido el posicionamiento, el vector y el color).
Tiene un efecto sustancial en tu rendimiento real del juego. Ofrece una forma más inteligente de cómo el juego representa algunas escenas en el juego. Esta es también la razón por la que puedes notar que el juego funciona mejor en algunas situaciones en comparación con el renderizado inmediato.
Si simplificáramos aún más las cosas, cuando tienes la opción desactivada, todo el mundo en Minecraft será cargado incluso cuando no puede verlo. Por otro lado, cuando los VBO están activados, partes innecesarias del mundo que no puedes cargar.
¿Deberías activarlo?
Si ha entendido qué son los VBO, debería quedar bastante claro que activar esta configuración para algunos usuarios les daría un gran impulso en FPS. Una cosa importante a tener en cuenta es que cuando lo tengas encendido, cambiarás la mayor parte de la carga del juego a la GPU en lugar de a la CPU.
Por lo tanto, también puede depender de su sistema si puede aprovechar al máximo la opción activada. Para algunos usuarios, es posible que ni siquiera tenga ningún efecto en su rendimiento. Todo lo que tienes que hacer es intentar activar y desactivar la opción y comparar si notas una diferencia en el rendimiento de tu juego. Si es así, definitivamente debería mantenerlo encendido.
Conclusión
Aquí encontrará todo lo que necesita saber sobre si debe mantener las VBO encendidas o apagadas. Asegúrese de leer bien el artículo para comprenderlo completamente.
Источник: voipscan.ru
VBO/Не биндит текстуру
Собсна, рендерю модель калака через вбо(ферст пикрелейтед проблемы)
Делаю так:
public static void render(TexturedModel model) < // shader.start(); prepareTexturedModel(model); // shader.loadSkyColour(RED, GREEN, BLUE); // shader.loadLight(light); // shader.loadViewMatrix(Minecraft.getMinecraft().thePlayer); GL11.glDrawElements(GL11.GL_TRIANGLES, model.getRawModel().getVertexCount(), GL11.GL_UNSIGNED_INT, 0); unbindTexturedModel(); // shader.stop(); >private static void prepareTexturedModel(TexturedModel model) < RawModel rawModel = model.getRawModel(); GL30.glBindVertexArray(rawModel.getVaoID()); GL20.glEnableVertexAttribArray(0); GL20.glEnableVertexAttribArray(1); GL20.glEnableVertexAttribArray(2); ModelTexture texture = model.getTexture(); if (texture.isHasTransparency()) < disableCulling(); >GL13.glActiveTexture(GL13.GL_TEXTURE0); GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture.getID()); > private static void unbindTexturedModel()
Почему то не хочет биндить текстуру
Если убрать
GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture.getID());
Рендер вообще исчезает. Айдишник продебажил — texture.getID() выдает 98
Текстура так же грузится
Еще наблюдаю артефакты когда смотрю вниз (пикрелейтед 2)
Краснеет типа
Кто за вбо шарит плез помощь
Вложения
1594649663404.png
138.8 KB · Просмотры: 43
1594649768814.png
256.2 KB · Просмотры: 41
Dahaka
Потому что, когда компилишь дисплей лист скорее всего используешь тесселятор, который в свою очередь использует всякие ClientState функции (glEnableClientState, glVertexPointer, glColorPointer, . ). Они и говорят драйверу, откуда взять позицию, текстурную координату и т.п.
С VBO подход немного другой. Ты можешь только сказать какого типа данные лежат по такому-то смещению в буфере и привязать к индексу атрибута, а затем использовать в шейдере, как угодно.
И вообще, без батчинга примитивов нет смысла использовать VBO и шейдеры, если нет жесткой необходимости. Производительность станет только хуже, плюс убьешь возможность использования шейдеров оптифайна.
Dahaka
2,505 80 397
Шейдер включи
Дайте тазик, кровь из глаз
fukkivdan
1,139 26 150
Шейдер врубил онли фрагментный (не думаю что мне нужен вертексный)
Но он не мой, поэтому я пока его еще не трогал. Разве он нужен?
Вложения
1594662042500.png
121.2 KB · Просмотры: 30
fukkivdan
1,139 26 150
Юзаю только фрагментный шейдер (скрин дропнул) и попытался сделать так
public static void render(TexturedModel model)
Калак стал всегда черным, хнык
Текстура все равно не биндится на него
Вложения
1594663161779.png
7.1 KB · Просмотры: 22
Dahaka
2,505 80 397
Как это не нужен? Откуда драйвер поймет, какие данные нужно использовать для текстурных координат?
Дайте тазик, кровь из глаз
fukkivdan
1,139 26 150
Спойлер: Вертексный шейдер (одолжил)
in vec3 in_position;
in vec2 in_textureCoords;
varying vec2 pass_textureCoords;
#if LIGHTING
varying vec4 pass_diffuse;
void pointLight(in int i, in vec3 eye, in vec3 normal, inout vec4 diffuse) vec3 VP = vec3(gl_LightSource.position);
diffuse += max(0.0, dot(normal, VP));
>
#endif
varying vec2 pass_lightCoord;
void main(void) gl_Position = gl_ModelViewProjectionMatrix * vec4(in_position, 1.0);
pass_textureCoords = in_textureCoords;
#if LIGHTING
vec3 normal = normalize(gl_NormalMatrix * gl_Normal);
vec3 eye = vec3(0.0, 0.0, 1.0);
vec4 diffuse = vec4(0.0);
pointLight(0, eye, normal, diffuse);
pointLight(1, eye, normal, diffuse);
pass_diffuse = min(diffuse, vec4(1.0));
#endif
Спойлер: Фрагментный шейдер
uniform sampler2D texture;
uniform sampler2D lightMap;
varying vec2 pass_textureCoords;
#if LIGHTING
varying vec4 pass_diffuse;
#endif
varying vec2 pass_lightCoord;
void main() vec4 pixel = texture2D(texture, pass_textureCoords);
pixel.xyz *= texture2D(lightMap, pass_lightCoord).xyz;
#if LIGHTING
pixel.rgb = (0.4 + pass_diffuse.xyz * 0.6) * pixel.rgb;
#endif
При применении получается плоскость вместо норм модели (скринчееек)
fukkivdan
1,139 26 150
Да и вообще впринципе, почему я без шейдера не могу забиндить текстуру? Почему если я ее не бинжу, то рендер модели просто пропадает?
Dahaka
2,505 80 397
Да и вообще впринципе, почему я без шейдера не могу забиндить текстуру?
Почему не можешь забиндить? Можешь.
Почему если я ее не бинжу, то рендер модели просто пропадает?
Не знаю, зависит от состояния. Может предыдущая текстура такая.
Входным атрибутам в шейдере задал индексы?
Советую начать с малого и разбираться понемногу, а не тупо копипастить чужой код и спрашивать, почему не работает.
Дайте тазик, кровь из глаз
Hexagone
Тоже постоянно сталкиваюсь с этим артефактом. Возможно, для модельки этот размер текстуры слишком большой или мелкий, но это не точно.
Последнее редактирование: 14 Июл 2020
Wake me up when it’s all over
fukkivdan
1,139 26 150
Почему не можешь забиндить? Можешь
Вообще я не хочу пока юзать шейдеры ибо с ними не разобрался, но не думаю, что шейдер Агра как то плох.
Просто я не могу понять, почему не накладывается текстура, хотя на тех же дисплей листах все круто (как обычно0)0)
Гуглеж такой проблемы так же чет не выдал результатов
Dahaka
2,505 80 397
Потому что, когда компилишь дисплей лист скорее всего используешь тесселятор, который в свою очередь использует всякие ClientState функции (glEnableClientState, glVertexPointer, glColorPointer, . ). Они и говорят драйверу, откуда взять позицию, текстурную координату и т.п.
С VBO подход немного другой. Ты можешь только сказать какого типа данные лежат по такому-то смещению в буфере и привязать к индексу атрибута, а затем использовать в шейдере, как угодно.
И вообще, без батчинга примитивов нет смысла использовать VBO и шейдеры, если нет жесткой необходимости. Производительность станет только хуже, плюс убьешь возможность использования шейдеров оптифайна.
Источник: forum.mcmodding.ru