Gamedev

Ответить в тред Ответить в тред
Check this out!
OpenGL thread 7 Аноним 27/06/20 Суб 09:02:43 6789451
image.png 134Кб, 1296x758
1296x758
Рисуй треугольник!
Треугольник сам себя не нарисует!

Спрашиваем, сами же решаем проблему, сами же отписываемся. Постим книжечки, гуглим, учим математику. Посылаем нахуй за легаси.
Читаем шапку перед тем как задать очередной тупорылый вопрос.

Добро пожаловать. Снова.

Шапка треда:
https://gist.github.com/2ch-gd-opengl/26b94fc6f16100af730d84a3d8bbd557
Аноним 27/06/20 Суб 09:11:41 6789462
Перекатил чтобы задать вопрос.
Пишу ray casting игру на sdl2, но увы, она не тянет 7к полигонов даже на этапе поиска пересечений. Посмотрел на glsl и это то, что мне нужно - описываешь входные вектора, что-то с ними делаешь и возвращаешь выходные. Но проблема в том, что все гайды, которые я видел, рисуют треугольники а не проводят вычисления на видеокарте.
Я бы хотел загрузить все полигоны в видеопамять и когда нужно, запускать glsl код, который будет принимать лучи, а возвращать координаты пересечений лучей с полигонами, чтобы я через sdl2 наложил текстурки. Как это сделать?
Аноним 27/06/20 Суб 16:05:53 6789873
>>678946
> Я бы хотел загрузить все полигоны в видеопамять и когда нужно, запускать glsl код, который будет принимать лучи, а возвращать координаты пересечений лучей с полигонами, чтобы я через sdl2 наложил текстурки. Как это сделать?

Тебе скорее всего надо надо треугольниками оперировать, а мешами (наборами треугольников). Лучи пересекают меш - записываешь в какой-нибудь массив baseVertex этого меша, а потом glDrawElementBaseVertex где последний аргумент и есть тот baseVertex

Хотя это уже не рейкастинг совсем
Короче, проще найти готовый пример
Аноним 27/06/20 Суб 16:35:11 6789944
Аноним 28/06/20 Вск 12:32:35 6791175
Аноним 29/06/20 Пнд 19:54:36 6794136
>>679117
OpenGL сам за тебя выбирает, куда писать данные. А static/dynamic draw — просто подсказки для OpenGL.
Аноним 23/07/20 Чтв 19:31:58 6846667
>>678945 (OP)
Ты почему о перекате в предыдущем треде не сообщил?

...хотел задать вопрос, но пофиг уже
Аноним 23/07/20 Чтв 21:50:54 6847248
Аноним 24/07/20 Птн 07:54:58 6848679
Аноним 24/07/20 Птн 07:56:10 68486810
>>678946
>Перекатил чтобы задать вопрос
Долбоеб, а в предыдущем треде объявить не мог?
Аноним 24/07/20 Птн 15:23:56 68495711
>>684868
Кстати двачую - была идея переименовать в тред графических технологий (сразу для всех opengl/directx и других api), и чтобы тут же разбирались детали реализации всяких теней/отражений. Тред отдельно по opengl не нужен.
Аноним 27/07/20 Пнд 15:06:27 68586812
Для Opengl pipelines (glGenProgramPipelines) можно задавать отдельно стейты вроде блендинга, куллинга и т.д., как в вулкане или эта шняга только для шейдерных стадий. Рендер стейт по прежнему один и глобальный?
Аноним 28/07/20 Втр 11:29:45 68615613
>>678946
Вычисления на видеокартах с помощью шейдеров называется GPGPU. Гугли opengl gpgpu example или типа того.
А вообще для вычислений на картах нормальные люди используют openCL или cuda если поддерживается.
Аноним 28/07/20 Втр 12:08:36 68616914
>>686156
>openCL
Выдаёт на 30% меньшую производительность, чем вычислительный шейдер. Можно просто один в один скопировать код и размеры всяких рабочих групп. Это было на древней нвидия-карточке десятилетней давности, и я думал что это просто потому что opencl был в новинку - но даже на свежей карточке прошлого года со свежим драйвером такой же результат.
Аноним 28/07/20 Втр 12:18:49 68617015
Антуаны, а где почитать по пайплайну?
Мне нужен форвард/деверенд, шобы заебись было, но я в душе не ебу где про это читать. А может кто-то за меня написал отдельную либу пайплайна? Или нужно воровать код у существующих движков?
Аноним 28/07/20 Втр 12:28:20 68617316
>>686169
Ну, зависит от задачи, и одинаковый код не факт что будет хорошо работать и там и там. Для СЛ-я мб эффективнее юзать какие-то встроенные функции.
Аноним 28/07/20 Втр 12:49:55 68618317
>>686173
Было бы интересно посмотреть хоть на одну задачу, где cl выдаст более хорошие результаты. Там даже матриц вроде как нет и нужно вручную их делать.
Аноним 28/07/20 Втр 16:27:21 68625718
Аноним 02/09/20 Срд 00:19:29 69679519
Как установить это говно на шинду? Я проебался с линковкой 4 часа.
Аноним 02/09/20 Срд 01:50:31 69680720
>>696795
Разобрался. Завтра ждите от меня движок нового поколения.
Аноним 02/09/20 Срд 22:57:27 69693921
Аноним 03/09/20 Чтв 00:37:48 69696422
>>696939
Так, пока можно задавать цвет бекграунда.
Завтра буду писать обертки под draw линий и меши. А потом учить прогу их грузить с файлов.
Аноним 04/09/20 Птн 16:20:31 69724623
Посоветуйте литературу по линейной алгебре.
05/09/20 Суб 14:04:27 69733524
>>697246
Нашёл из прошлого треда.
Аноним 02/10/20 Птн 16:32:26 70184925
Ну что, треугольниковёрты? Нашли уже работу мечты? Разрабатываете ли моднейший кластерный рендерер на вулкане? Пишите ли будоражащие вайтпаперы для сигграфа? Похвастайте хоть.
Аноним 02/10/20 Птн 21:02:06 70190726
>>701849
Освоил опенгл достаточно чтобы делать свою говно-игру без обёрток в виде движков.
Аноним 25/10/20 Вск 23:57:49 70632927
Reticulating Splines...
Аноним 28/10/20 Срд 22:43:43 70685128
>>701849
Мне вообще не доставляет, забил хуй на это говно
Аноним 29/10/20 Чтв 14:43:02 70691429
>>706851
How dare you!
CG - вообще единственная смывов, оправдывающая кодинг.
Аноним 29/10/20 Чтв 16:27:41 70693030
>>706914
> смывов
Нихуя я косой, сразу не заметил, а теперь и не знаю, что за слово должно было быть.
Короче - только cg и оправдывает унылое байтоёбство.
Аноним 29/10/20 Чтв 16:53:47 70693431
>>706851
Сам ты говно. Что ты тут делаешь, раз забил?
Аноним 30/10/20 Птн 12:50:00 70704232
>>706914
Что оправдывающая? Тебе нравится смотреть на вращающийся кубы? Оргазм получаешь? Или тебе нравится делать свой велосипедный движок и смотреть как коряво он работает? Тоже наслаждение внеземное получаешь ? (ты ведь сам его сделал! Какой ты молодец! И совсем не говно получилось!)
Аноним 30/10/20 Птн 14:52:35 70707633
изображение.png 103Кб, 1020x795
1020x795
заебумбыч
Аноним 30/10/20 Птн 16:21:06 70708434
>>707076
Ты новичок? Теперь учи как делать карты теней. Сам же видишь, что свет попадает туда где его не должно быть.
Аноним 31/10/20 Суб 14:40:28 70719035
>>707084
Нет, я не семейство фторфосфорорганических азоторганических отравляющих веществ нервно-паралитического действия
Аноним 12/11/20 Чтв 18:58:24 70931036
>>707042
Всё так: люблю вращать кубы и руками собирать сраные икосаэдры, покрывать их жырным слоем кривых шейдеров с циклами и динамическими ветвления ми. Густо поливать подливой теней с алиасингом и акне, медленным ссао и шумными фейковыми отражениями.
А разве вы не любите?
Аноним 13/11/20 Птн 18:23:30 70950837
Аноним 13/11/20 Птн 18:47:06 70951938
Аноним 13/11/20 Птн 18:50:24 70952139
>>709310

> руками собирать сраные икосаэдры

Тебе кроносы дали glTF, пердоль!, Пердоль, блядь, нет не хотим, хотим руками из байтов флотами сладкий хлеб набирать.
Аноним 14/11/20 Суб 10:54:03 70963840
>>709519
Как раз хотел вебгл начать изучать. Разобрался с основами шейдеров тут thebookofshaders.com
Аноним 14/11/20 Суб 14:14:37 70966541
>>709638
> thebookofshaders.com
Хуита недописанная.
Аноним 14/11/20 Суб 15:35:38 70967742
Аноним 14/11/20 Суб 17:01:20 70970543
Аноним 17/11/20 Втр 12:04:21 71015644
>>709705
Неплохо! Наверное. А что нибудь в нормальном, текстовом виде есть?
Аноним 17/11/20 Втр 12:06:45 71015845
Пишу по туториалу, там у чувака не GLFW, а у меня GLFW. Он начал писать профайлер, у него время кадра меньше миллисекунды, а у меня - 16 мс. Этот фреймлок в ОпенГЛе выставляется или в GLFW?
Аноним 17/11/20 Втр 13:17:35 71018346
Аноним 17/11/20 Втр 13:18:17 71018447
>>710158
Похоже у тебя vsync включается по дефолту. glfwSwapInterval(0) поставь в месте, где контекст настраиваешь.
Аноним 18/11/20 Срд 23:52:35 71037748
kal.mp4 20781Кб, 640x640, 00:00:43
640x640
Бампану своим шейдером
Аноним 22/11/20 Вск 17:04:25 71098249
Управление ресурсами.
Кто как задумывался над этим? Самый простой способ это делать классы текстур, буферов, шейдеров и тд.
Но потом придётся думать над копированием и уничтожением объектов.
А тут как-то раз решил почитать исходники месы (драйвер свободный для графики) и натолкнулся на мысль, что управление ресурсами можно попробовать не раздавать разным классам, а делать всё в одной (GLContext или типа того). Он же может и следить также за учётом ссылок.
Аноним 24/11/20 Втр 18:11:03 71131950
Аноним 24/11/20 Втр 18:14:17 71132051
Аноним 24/11/20 Втр 19:05:56 71132852
>>711320
Нет. Для этого нужна DirectStorage API (часть DirectX), и то она будет доступна только в следующем году.
Аноним 24/11/20 Втр 19:13:29 71132953
>>711319
Ты ослеп или одурел?
Аноним 24/11/20 Втр 19:49:31 71133054
>>711320
RTX видяха и PCIE4 материнка под ССД
Аноним 24/11/20 Втр 19:57:55 71133255
>>710982
У меня в графическом движке есть просто структуры (классы) для текстур, которые содержат указатель на данные и их формат (ширина, высота, байт/флоат). Когда используется опенгл-бекенд, он на лету подхватывает текстурки и если у них нет GLuint текстуры, то генерирует и юзает её. При удалении текстурки вызывается коллбек опенгл-бекенда, удаляющий GLuint имя текстуры.
Аноним 24/11/20 Втр 20:27:36 71133656
>>711332
ты умеешь смотреть сколько памяти на видяхе юзается?
Аноним 24/11/20 Втр 21:58:05 71135857
>>711328
Это из-за того, что у нвидии проприетарные драйвера?
Аноним 24/11/20 Втр 22:53:47 71136058
>>711358
>Это из-за того, что у нвидии проприетарные драйвера?

Это из-за того что МС сама башляет бабки вендорам, сама продвигает и контролирует.

А кронос - это джентельменский клуб для попиздеть и изобразить антимонопольную альтернативу.
Аноним 30/11/20 Пнд 15:15:32 71225459
Аноним 30/11/20 Пнд 22:12:16 71234560
Как вкотиться из дженерик байтоёбство в пиксельебство?
Написать свой разудалый говнофреймворк с парой тройкой модных технологий и форсить на собесах гитхабом? Дрочить теорию и надеяться, что проскочишь, а там какнить втянешься?
Аноним 01/12/20 Втр 00:16:56 71235961
Аноним 01/12/20 Втр 08:48:55 71239562
>>712359
Пушто некоторым тяжело работать в столь абстрактной сфере, как программинг без визуализации своих трудов.
Кому-то норм херачить в банках и перекладывать цифири в бездонных бэкэндах. Кому-то прельстиво, если их код имеет визуальный результат.
Если персонально: работал над десктопными приложениями для отображения инфы аля убогий ГИС. И в бекенде работал. Второе невероятно печальнее, хоть и понимаешь, что дело может и даже более полезное, чем первый случай.
Такие дела, байтаны.
Аноним 01/12/20 Втр 10:53:13 71240663
>>712395
Ты хочешь поменять одно низкоуровневое говно на другое. Сказано же, что в вулкане надо 1000 строчек, чтобы треугольник нарисовать. По-твоему это весело?
Аноним 01/12/20 Втр 11:08:31 71240764
>>712406
>Сказано же, что в вулкане надо 1000 строчек, чтобы треугольник нарисовать
Только это не правда.
1к строк кода - создают устройство, проверяют технические фичи, создают слои, и т.д. и т.д. То есть не имеют никакого отношения к выводу треугольника
Аноним 01/12/20 Втр 13:28:50 71241165
>>712407
Тем не менее, человеку с опытом в бэке (востребованном и хорошо оплачиваемом) вкатываться с нуля в область сложную и не нуждающуюся в большом количестве кватывальщиков, как-то не разумно.
Аноним 01/12/20 Втр 17:22:32 71242966
>>712411
Если хочешь не сойти с ума от выжигания глазонек, то в один непрекрасный момент придётся задуматься о выборе денежка vs уровень радости от работы.
Зря чтоль об этом вашем выгорании столько написано.
Аноним 01/12/20 Втр 18:57:30 71244167
>>712429
Я считаю, что выгорание происходит не от того, чем ты занимаешься, а от того, насколько интенсивно ты этим занимаешься, и таким образом выгореть можно от чего угодно, хоть от байтоебства, хоть от типа "творческой" 3д графики.
>Зря чтоль об этом вашем выгорании столько написано.
А сколько еще написано о рабах геймдев индустрии, перерабатывающих сверх нормы за несопоставимо низкую зарплату.
Аноним 01/12/20 Втр 21:58:13 71247968
>>712441
Так за гейдев я и не радею. Есть более практичные сферы, связанные с визуалом типа тренажёрных систем. Проблема, что таких продуктов на порядок меньше перекладывания чиселок.
Аноним 02/12/20 Срд 01:26:29 71250169
Аноним 02/12/20 Срд 01:36:30 71250370
>>712479
Работаю в таком, задачи действительно интересные, как по мне. Единственное что раздражает это требования по поддержке довольно древнего железа.

Бтв насчёт того что визуальный результат приятнее не согласен. Базы данных/распределенные хранилища(и другая байтоебля) тоже очень классно, хотя опыта у меня в этом у меня меньше. Мне кажется в бекенде скучно делать какую-нибудь бизнес логику, бесконечное прокидывание всякого от бека к фронту.
Ещё у меня ненависть к парсерам, но кому-то вроде нравится...
Аноним 02/12/20 Срд 11:47:47 71254871
>>712503
Так дай совет по вкату.
Аноним 17/12/20 Чтв 02:47:49 71532872
>>712548
Хз, изучаешь то что интересно, подаешься на вакансии куда интересно, если нет привычки решать задачки на время может быть полезен литкод или аналоги
Аноним 18/12/20 Птн 05:18:06 71550873
Пилю скелетную анимацию, возникли проблемы с моделями для теста. У меня нет пока загрузчика, а писать свой крайне лениво до момента, пока не получу рабочий код постановки меша в позу

Где можно взять простую заскиненную модельку + скелет из пары костей в читабельном для человека виде для отладки?
Аноним 18/12/20 Птн 05:27:55 71550974
>>715508
Ладно похуй возьму из головы/напишу экспортер для блендера
Аноним 18/12/20 Птн 06:07:16 71551175
>>715508
sketchfab например, отфильтруй по бесплатным моделям

>>715509
Прикрути assimp или fbx sdk, это не сложно. У fbx sdk громоздкий api, но в комплекте есть пример как прочитать из файла все что в нем есть.
Аноним 04/01/21 Пнд 12:22:20 71838776
Допустим я рисую одну картинку просто треугольниками, а вторую генерирую фрагментым шейдером при помощи реймаршинга, вместе с depth буффером.
Как мне наложить вторую картинку на первую, используя её depth-буфер?
Аноним 05/01/21 Втр 11:30:18 71854477
>>718387
Как ты пишешь в depth buffer? Это условный буффер, то есть просто текстура или АПИшный depth buffer?

>Как мне наложить вторую картинку на первую, используя её depth-буфер?
Просто рисуй дополнительным проходом и используй в нем картинку реймарчинга в качестве текстуры и сэмплевай с нее. Я не знаю на сколько у тебя там сложная сцена, но вообще ты это можешь одним проходом рендерить. После того как отрисовал основную сцену, следует дравкалл квада для реймарчинга. В этом случае не надо к нему текстуру привязывать, а можешь сразу в фрагмент шейдере реймарчить. При этом читай актуальную глубину пикселя из до этого отрисованой сцены и сравнивай ее с глубиной куда попал реймарч. Если глубина меньше, заначит рисуешь пиксель реймарчинга, а если нет, то просто пропускаешь пиксель с discard;
Аноним 05/01/21 Втр 12:08:34 71855178
>>718387
Еще забыл добавить: Перед дравкаллам квада для реймарчинга отключи тест глубины с glDisable(GL_DEPTH_TEST), чтобы не было проблем с рисованием поверх. Глубину ты и так сам в фрагмент шейдере тестишь. Потом в цикле перед основной сценой не забудь снова включить glEnable(GL_DEPTH_TEST).
Аноним 05/01/21 Втр 19:32:44 71865179
16094023778260.png 2Кб, 64x32
64x32
У меня вопрос, допустим нужно нарисовать тайл пикрил без сглаживания. Если его рисовать методом обычного спрайта в виде квадратной сетки вершин, то он рисуется нормально, если же сетка вершин будет подогнана под форму, то на краях образуется сглаживание краёв. Вопрос как сделать чтобы нормально он рисовался без сглаживания? Сделать сетку на 1 пиксель больше? И вообще интересно насколько оптимизация по форме спрайта влияет на производительность?
Аноним 06/01/21 Срд 02:29:28 71874080
>>718387
Во фрагментном шейдере стреляния лучами, просто запиши глубину в gl_FragDepth.
Аноним 06/01/21 Срд 09:44:04 71876481
>>718387
Ты уже разобрался? Напиши хоть, что конкретно ты делаешь или скриншот выложи.
Аноним 06/01/21 Срд 13:18:43 71880282
>>718651
Что у тебя там сглаживается? MSAA что ли включил? Или ты хочешь типа пиксель-арт стайл? Тогда в функцие glTexParameteri() поставь у мин и маг фильтра последний параметр на GL_NEAREST вместо GL_LINEAR. Сделай скриншот, так будет понятнее, что у тебя там не так.
Аноним 06/01/21 Срд 13:20:47 71880383
>>718764
Пока не занимался этим. Я просто не сразу подумал, что можно сразу в реймаршинг-шейдере глубину проверять. Через gl_FragDepth или юниформить текстуру с глубиной в шейдер, потом разберусь и, может, скриншот выложу.

Вообще я хотел для своей следующей игры вокруг некоторых объектов сделать полупрозрачные сферы и другие объекты, между которыми происходит smooth union и они слипаются.
Аноним 09/01/21 Суб 13:10:33 71949784
out.mp4 17375Кб, 1460x860, 00:00:33
1460x860
>>718764
Сделал. Конечно, офигел от этого всего, джва часа разбирался куда что прикрепить. В связи с особенностями моих графического и ГУИ движков сделал так: рендерю в квадрат, закрывающий весь экран реймаршинг сцену, при этом передаю ей текстуру, в которую срендерил depth buffer основной сцены.
Зато теперь можно сделать красивые эффекты. И вообще, я раньше не думал о том, что можно вот так миксить быструю опенгл-сцену и красивую реймаршинг-сцену.
Аноним 10/01/21 Вск 19:25:20 71981685
>>719497
Прикольно смотрится. Можешь еще немного фонга на эти сферы добавить. Нормали сферы в реймарчинге легко высчитываются: точка поверхности - центр сферы = вектор нормали. А дальше фонг шейдинг как в обычном шейдере.

>И вообще, я раньше не думал о том, что можно вот так миксить быструю опенгл-сцену и красивую реймаршинг-сцену.
Ну собственно еще есть компьют шейдеры, в которых можно сложные эффекты просчитывать, а потом совмещать с обычным фреймбуфером, в том числе реймарчинг и рейтрейсинг.
Аноним 11/01/21 Пнд 14:13:53 72001686
out0.mp4 3289Кб, 1460x860, 00:00:07
1460x860
out1.mp4 3726Кб, 1460x860, 00:00:08
1460x860
>>719816
Да, фонг это хорошо, но для моего эффекта не подходит, слишком перегруженным кажется.
И в реймаршинг же нормали вычисляются одинаково для всей сцены:
vec3 SceneNormal(vec3 ori) {
return normalize(vec3(SceneSDF(vec3(ori.x + NORM_EPSILON,ori.y,ori.z),vec3(0,1,0)).d - SceneSDF(vec3(ori.x - NORM_EPSILON,ori.y,ori.z),vec3(0,1,0)).d,
SceneSDF(vec3(ori.x,ori.y + NORM_EPSILON,ori.z),vec3(0,1,0)).d - SceneSDF(vec3(ori.x,ori.y - NORM_EPSILON,ori.z),vec3(0,1,0)).d,
SceneSDF(vec3(ori.x,ori.y,ori.z + NORM_EPSILON),vec3(0,1,0)).d - SceneSDF(vec3(ori.x,ori.y,ori.z - NORM_EPSILON),vec3(0,1,0)).d));
}
Аноним 11/01/21 Пнд 20:01:09 72008787
>>720016
>И в реймаршинг же нормали вычисляются одинаково для всей сцены
То что я панисал, это быстрое решение для обычной сферы. А твоя жирная функция с шестью сэмплами высчитывает нормаль с помощью градиента. Ну для сложной геометрии только так, да.

Не по теме: у тебя камера дерганая из-за резких движений мышки. На видео это не приятно смотрится в качестве презентации. Для плавного передвижения камеры ты можешь добавить управление аналог-стиками геймпада. Или для клавомыши захуячить свой алгоритм сглаживания движения камеры. Мы же любим свои велосипеды писать, правильно? :)
Аноним 12/01/21 Втр 09:22:21 72018688
Изучаю Batch Rendering
и у меня вопрос по поводу функций:
glGenVertexArrays и glCreateVertexArrays
какие в них различия?
Аноним 12/01/21 Втр 12:24:19 72022589
Аноним 13/01/21 Срд 10:45:10 72041990
Вопрос по поводу матриц, где их лучше считать? Просто у меня вычисления в коде и в шейдер передаётся уже итоговая матрица, у других же наоборот, в шейдер передаются несколько матриц и они там считаются.
Аноним 13/01/21 Срд 13:04:49 72045991
>>720419
Твой вариант лучше, т.к. видеокарта не считает n раз одну и ту же матрицу, берет готовую. Обычно у других матрицы комбинируются по всякому и их для этого передают раздельно
Аноним 14/01/21 Чтв 10:42:56 72063892
Изучаю Cherno и у него там есть пример
https://www.youtube.com/watch?v=bw6JsLnx5Jg&list=PLlrATfBNZ98f5vZ8nJ6UengEkZUMC4fy5&index=3
шейдер вида:
uniform sampler2D colorTexture[2];
Код:
glBindTextureUnit(0, texture1);
glBindTextureUnit(1, texture2);
Но как я понял это под 4.5 версию работает, у меня же 4.3.
Как биндить текстуру в нужный текстурный слот на моей версии?
Аноним 14/01/21 Чтв 10:52:55 72064293
>>720638
Кажется разобрался как надо:
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture1);

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, texture2);
Аноним 14/01/21 Чтв 19:34:14 72073594
>>720638
>Cherno
Наш человек кстати.
Аноним 16/01/21 Суб 19:55:37 72150195
>>720735
Персонаж фильма "вратарь галактики"?
Аноним 17/01/21 Вск 01:18:15 72165296
Аноним 21/01/21 Чтв 19:36:24 72286597
Сап графончики, я тут внезапно решил обмазаться ретро OpenGL'ем, ну там fixed pipeline, draw lists, GL_ARB_texture_env_combine и так далее. Прост сделать пару демок на Си, посмотреть чем деды увлекались в годы моего детства. Посоветуйте годных мануалов? Гугл выдаёт кучу битых ссылок, с трудом нашёл рабочий архив NeHe и ещё поглядываю на демки humus.name. Но чёт не густо. Может есть какие-то олдскульные книги на эту тему? Уверен тогда только так делились инфой. Сейчас пытаюсь найти первые издания OpenGL Red Book. Есть смысл? Или везде только шейдеры и тому подобное?
Аноним 22/01/21 Птн 23:43:44 72315798
>>722865
"Расширения OpenGL" погляди, там есть асм-подобные шейдеры и даже nv_register_combiners, и только потом переход к легаси-версиям glsl. Она за 2005 год вроде бы.
>обмазаться ретро
Если совсем ретро по типу gluNurbsSurface - то такое я только в красной книге видел, и я листал вот эту или очень похожую версию: https://studfile.net/preview/2807154/
Аноним 22/01/21 Птн 23:45:33 72316599
>>722865
А, да, ещё книга Краснова по opengl для делфи.
К ней ещё архив с демками есть, вот с этими буферам выбора и другими функциями которые никто никогда и нигде не использовал.
Аноним 24/01/21 Вск 05:20:11 723431100
>>723157
Спасибо что напомнил о Борескове, анончик. Нашёл всё что нужно у него на сайте в разделе старых статей.
Аноним 25/01/21 Пнд 13:18:24 723670101
>>722865
Чем бы человек не обмазывался, лишь бы...

Изучать OGL старых версий в 2021-м году - это стрелять себе в ногу. OGL 3.1 не просто так родили на свет. Везде уже только шейдеры, только хардкор. Можно конечно почитать чего там творили в прошлом и как выкручивались с multitexture extension для блендинга нескольких текстур для одного материала без использования шейдера. Но это все уже далеко далеко в прошлом.

ПС: отдельный изврат без четкого определения - это использовать расширение для шейдеров и при этом продолжать пользоваться FFP функциями. В 2009-м году - прокатывало.
Аноним 26/01/21 Втр 12:44:53 723835102
>>723670
Пост не читал, лишь бы ответить? Пчел явно обозначил, что он осознанно именно fixed function хочет потеребонькать. Почему? Ради лулзов, очевидно.
Аноним 26/01/21 Втр 13:43:31 723840103
Аноним 27/01/21 Срд 04:20:12 723954104
>>723670
Вот ты душнила, я задал конкретный вопрос, даже цель описал да, для лулзов. Но нет, надо вставить свой охуительный совет. Чего сразу не написал что "в 2021-м году кодать -- это стрельба себе в ногу, игру надо мышкой на готовых ассетах в Юнити делать"?

>>723835
Двачую, именно что для лулзов.

>>723840
Окей, с дедами загнул конечно.
Алсо по ссылке как раз OpenGL, возможно ты хотел запостить какие-то софтварные рендеры или рейкастер какой?
Аноним 27/01/21 Срд 11:05:18 723965105
>>723954
>Алсо по ссылке как раз OpenGL, возможно ты хотел запостить какие-то софтварные рендеры или рейкастер какой?
Да, объебался немного - ОпенГЛ тогда был, но MGL и без него работает.
Аноним 29/01/21 Птн 05:00:12 724265106
Аноним 29/01/21 Птн 12:09:49 724286107
comp-graphics-1[...].jpg 137Кб, 866x1200
866x1200
Аноним 02/02/21 Втр 22:45:14 725552108
GLRED.png 314Кб, 920x1280
920x1280
Сап, ананасы.
Посвящаю сегодня эту хуйню самому себе, разработчикам стандарта, и всеобщей борьбе жабы с гадюкой.
Аноним 03/02/21 Срд 01:50:42 725612109
>>725552
велкам ту опенгл
Аноним 03/02/21 Срд 01:52:15 725613110
>>725552
вообще не представляю как этим говном можно пользоваться без тайпсейф обертки какой-нибудь
Аноним 03/02/21 Срд 11:36:39 725660111
>>725613
Какая обертка за меня проставит все параметры при аплоаде текстуры?
Аноним 04/02/21 Чтв 14:56:14 725936112
Анонче, где сейчас пишут шейдеры руками и можно ли как-то профит с этого получать? Не так давно нашёл канал The Art of Code, где показывают и объясняют как делать эффекты на GLSL, запуская это всё в Shadertoy. Посмотрел пару видео оттуда, что-то свое даже получилось сделать, хочу продолжить, или же это говно без задач на данный момент?
Аноним 07/02/21 Вск 08:28:06 726348113
>>725936
Везде пишут. Когда в уе или юнити ты создаешь материалы, ты по сути пишешь шейдеры.
Аноним 08/02/21 Пнд 04:10:01 726555114
>>725660
Вообще в glbindings вроде бы енумы вместо макросов, но не уверен, не юзал.
А вообще похуй, это не самое хуевое
Аноним 17/02/21 Срд 22:04:15 728269115
изображение.png 25Кб, 544x298
544x298
Всё что нужно знать про компилятор glsl на этой картинке.
Я что-то переписывал, и обнаружил что сильно фпс просел, хотя я ничего не менял. А там вот оно что.
То что побеждает четвёртый вариант это вообще какая-то петрушка.

Кто-нибудь может объяснить почему разница в два раза? Там же регистры сразу vec4 содержат, по идее - и ему без разницы умножать float или умножать vec4 на -1.


А ещё если в коде есть uniform и я его не использую, то glGetUniformLocation выдаёт -1 (ошибку), как будто юниформа не существует.
И если он входит в какое-то выражение с умножением на ноль по типу float y=x+0⚹<uniform> - то glGetUniformLocation так же выдаёт -1.
Аноним 17/02/21 Срд 22:17:12 728270116
>>728269
Да, ещё хотел спросить - glGetUniformLocation достаточно оптимизированный (кеширует имена-номера в хеш-таблице) и я могу его каждый кадр вызывать, или лучше сохранить полученный номер и обращаться по нему?
компилятор GLSL Аноним 18/02/21 Чтв 03:11:53 728301117
>>728269
Добавлю ещё.

Перенёс определение знака нормали в геометрический шейдер, и остались те же 37 с хвостиком фпс, то есть последний вариант для карточки то же самое, как и просто множить vec3 на float без проверок.

Ещё если использовать (gl_FrontFacing?1:-1)⚹nor - 32 фпс, если поменять на (gl_FrontFacing?1.0:-1.0)⚹nor - 37 фпс.
Это просто форменный беспредел.


Я смотрю на компилятор с++, который мне деление на 7 заменяет на комбинацию imul/sar/shr, а потом на это, где абсолютно (и самое главное численно) эквивалентный код работает с разницей больше чем в два раза по времени, и...
Это в самом деле нужно смотреть на все шейдеры и заменять условия и тернарный оператор на функцию хевисайда?
Аноним 18/02/21 Чтв 10:57:17 728331118
>>728269
Четвертый вариант побеждает потому что терарнарный оператор = branching. А branching мобильные GPU не любят
Аноним 18/02/21 Чтв 11:01:06 728334119
>>728301
>Это просто форменный беспредел.
Скорее всего теряется fps на преобразовании int во float.

Пробуй сделать как в четвертом варианте у тебя вот здесь >>728269
но вместо int(gl_FrontFacing) сделай float(gl_FrontFacing). По идее это еще тебе fps подкинет за шиворот
Аноним 18/02/21 Чтв 12:26:24 728347120
>>728269
>>728270
>>728301
1) Я правильно понимаю, что ты рисуешь двусторонние грани? Если так, то зачем? Просто в большинстве случаев это двойной overdraw. (Хотя это может быть система частиц?)
2) На каком устройстве ты все это запускаешь?
2.1) Компилятор glsl в принципе моложе чем gcc, и у каждого вендора он запросто будет собственный.
2.2) Даже в рамках одного вендора могут быть разные результаты на чипах разных поколений.
3) Функция Хевисайда - гуд. Step в glsl - существует с 1.20, следовательно сегодня может быть даже выполняется с одного опкода в АЛУ, хрен его знает, но если сокращает время вычислений - так даже лучше.
4) Про неиспользованные юниформы и -1 вместо location - да, регулярно наступал на эти грабли, тут компилятор glsl (по крайней мере на nvidia) оптимизирует, сука, тупо вырезая то, что не вносит вклад (в том числе умножается на ноль), поэтому когда я пишу шейдер с кучей входных параметров, то сначала я их все сваливаю в сложение в одну переменную, которую затем умножаю на эпсилон и прибавляю к результату.
5) Про float и int - да, печалька, что компилятор не делает автоматическое приведение констант к типу левой части. Я с давних пор пишу как завещал дедушка Кармак: везде где требуется вещественный тип - число пишется полностью, т.е. так - 1.0f.
6) Про GetUniformLocation:
6.1) Пруфов не будет, где-то читал, что тривиальные части состояния (т.е. не буферы, и не то, что вычисляется только на видеокарте) современный драйвер хранит у себя и возвращает не запрашивая устройство, но не очень в это верю и предпочитаю нужные части кешировать в своем приложении, все равно цепочка вызовов будет короче.
6.2) А зачем вообще его вызывать каждый кадр? Ты каждый кадр компилируешь программу заново из динамически составленных исходников? Сделай класс или структуру, которая будет хранить location вместе с хэндлдом шейдерной программы, ты же где-то и так его хранишь.
Аноним 18/02/21 Чтв 16:37:26 728430121
>>728334
>Скорее всего теряется fps на преобразовании int во float.
А зачем оно преобразует int во float? Компилятор с++ даже с -O0 подменяет int на float сам (там в обоих функциях загружается .LC0). Какая мотивация чтобы оставлять в шейдере int целочисленным числом, а не преобразовать по максимуму в конечный тип?
А если я там напишу (5+6+4) вместо (15) он тоже считать это будет каждый кадр? Нет, такое вроде бы сворачивает.

>float(gl_FrontFacing)
Уже попробовал, ничего не меняется.
Я же написал, что я в фрагментном шейдере вовсе убрал обращение к gl_FrontFacing (считаю знак нормали прямо в геометрическом) - и фпс те же 37, выше уже не подняться.


>>728331
Так оно само считает обе ветви и подставляет результат похожим способом. Третий вариант совпадает по фпс с четвёртым (после замены 1 на 1.0).


>>728347
1 - Листья на ветках.
2 - 1660 ti. Вообще было бы очень интересно, чтобы кто-то в шейдере поставил такую же заглушку и потестил так же у него работает компилятор glsl или нет. У меня есть другой комп постарше, но карточек амд у меня вовсе нету, чтобы проверить что на них.

2.1 - Предположу что ситуация такая же как с openCL. Ты можешь один в один одинаковый код написать на openCL и на куде/glsl (в вычислительном шейдере) - и openCL будет работать где-то в 1.3 раза медленнее. С одинаковым размером локальных групп и всем остальным полностью совпадающим. Думаю что это всё из-за того, что у нвидии нет особой мотивации совершенствовать компилятор openCL, а вот куду они хотят вылизать до максимума, чтобы там не преобразовывалось в каждой нити 1 в 1.0 без какого-либо смысла и цели. А вычислительному шейдеру glsl просто повезло, видимо. Могу демку откопать, запустишь и заценишь сам.

4,6 - со стороны кода решил на всякий случай (внутри оператора присваивания проверку на -1 добавил), чтобы не натыкаться каждый раз при отладке шейдера - и юниформы тоже у себя кеширую, вряд ли драйвер сильно быстрее может это у себя сделать, даже если он этим занимается.
>А зачем вообще его вызывать каждый кадр?
Незачем. После компиляции стоило бы сохранить номера и использовать только их. Ради удобства написания хочется использовать символьные имена переменных - и оператор обращения по индексу неплохо подходит. То есть на каждый шейдер не создаётся свой класс и не загромождает код.
Можно через шаблоны в компайл-тайме сделать, чтобы constexpr-функция во всех местах подменяла строку-идентификатор на номер в массиве - поэтому я пока забью и буду гонять строку в рантайме, а потом переделаю если все более актуальные проблемы буду решены. Всё-равно это нужно только ради эстетической красоты что мол код не делает ничего лишнего, хеш одной строки посчитать это меньше микросекунды наверное. Разница как между 60 и 59.996
Хотя впрочем если бы там было land_shader.sun={..} - то это тоже более чем норм, но не хочется держать отдельный файл со списком юниформов для каждого шейдера, где нужно будет вручную вносить изменения после любого изменений состава юниформов. И ещё во всех местах придётся поменять тип шейдера с общего на специальный с нужным набором юниформов. Может быть на какой-то итоговой версии так сделаю, но на время разработки - нет, спасибо.
Аноним 18/02/21 Чтв 16:40:52 728433122
>>728430
Картинки отвалились?
Аноним 18/02/21 Чтв 18:27:44 728454123
>>728430
Еще по поводу location для юниформов: если у тебя целевая платформа поддерживает OpenGL 4.3 или выше, или может быть чуть ниже, но содержит GL_ARB_explicit_uniform_location, то можно забить на glGetUniformLocation и использовать код типа layout(location = 1) uniform vec4 yobaColor;
Аноним 18/02/21 Чтв 19:18:37 728470124
>>728454
Благодарю, не знал. Прям от души благодарю, это решает многие неудобства, прямо сейчас перепишу всё.

Ещё в версии 2.1 не понимал зачем самплеру в шейдер необходимо передавать номер текстурного юнита, если это известно на стадии компиляции и там почти всегда 0/1/2, которые можно было бы константой в шейдере прописать. И очень обрадовался, когда это появилось в четвёртых версиях.

А про dsa вообще молчу - искренне не понимаю почему opengl с первых версий не сделан в куда более интуитивном dsa-стиле. По идее это же исключительно программная приблуда, которую можно полностью реализовать на программном уровне (что я собственно и делал поверх opengl в своих структурах) хоть в версии 1.1, верно? Точно не интересовался устройством opengl, но всегда казалось что глобальное состояние в opengl - это концепция только самого opengl, и железо об этом ничего не знает. Со стороны разрабов так вдвойне просто сделать возможность вместо смены глобального состояния и обращению к глобальному номеру текстуры связанным с GL_TEXTURE_2D добавить возможность обращаться просто по номеру текстуры.
Почему же тогда оно только в 4.5 появилась как часть стандарта?

4.3 вышло в 2012 году и поддерживается ещё более ранними карточками с драйверами помоложе. По ощущениям как будто ещё только вчера про геометрические шейдеры никто не слышал, а на половине компьютеров только ARB_vertex_program было. Так радовался, когда первую демку с фейерверком и отражениями сделал через асм-подобные шейдеры.

>>728433
Просто исчезают почему-то. Пробую ещё раз.
Аноним 19/02/21 Птн 14:36:30 728629125
Анончики, ищу header-only для создания окна (и клава мышью) под OpenGL с мультиплатформой?

Не, я понимаю что есть всякие SDL/glfw, но не хочется ничего компилировать, просто - прилинклюдить в свой проект и все
Аноним 05/03/21 Птн 10:39:42 731288126
>>728629
Послушай совета мудрого, SDL уже есть, и не ищи ничего больше, ты уже пришел куда надо, максимум - imgui еще прикрутишь, если надо поверх графики интерфейс рисовать, и все. Да, поебаться придется, но только один раз, пока сделаешь из этого что-то типа шаблонного проекта со всеми настройками для сборки. Собственно SDL не надо компилить - инклюдишь и потом поставляешь со сборкой его библиотеку (а если под никсы, то там библиотека уже обязана быть в системе), а с imgui можно работать как с header-only.

Кстати, как компилишь под виндой? Cygwin/MSYS или MSVC?
Аноним 06/03/21 Суб 03:51:12 731520127
>>728454
>layout(location = 1) uniform vec4 yobaColor
А это норм, что после этого перестаёт работать glGetUniformLocation, и всегда возвращает -1?
То есть если я указал номер явно, то по имени больше никак нельзя?
Аноним 06/03/21 Суб 04:06:33 731522128
>>731520
А, забейте, у меня в начале шейдера слишком малая версия и включить явно расширение в шейдере я тоже забыл.
В итоге glGetUniformLocation перестаёт работать, но по номеру 2 юниформ записывает нормально, лол. Если поставить 430 или включить, то всё работает.
Аноним 06/03/21 Суб 06:54:14 731530129
изображение.png 22Кб, 641x305
641x305
изображение.png 14Кб, 617x208
617x208
>>728347
>Пруфов не будет, где-то читал, что тривиальные части состояния (т.е. не буферы, и не то, что вычисляется только на видеокарте) современный драйвер хранит у себя и возвращает не запрашивая устройство
Потестил. Столбцы 1/2/3 - обращение через GetUniformLocation/обращение по номеру через layout/и взятия номера из обычной std::unordered_map<std::string,int>. Справа то же самое в цикле на 1000 повторов. Время в мс показано.
На второй картинке std::map, который при одном значении в таблице выигрывает.

В общем скорее всего если не упарываться constexp, то специально обученный код без всяких std::string для только максимального быстрого извлечения чисел из таблицы обгонит GetUniformLocation, но в остальном можно забить и юзать GetUniformLocation хоть в каждом кадре, если по какой-то причине впадлу прописать все числа на стадии компиляции.
Ну и 35 мкс для вызова 1000 GetUniformLocation+glUniform4f это энивей смешно. Разница как между 60.00 и 59.87 фпс. Для неадекватных 1000 вызовов.
Аноним 07/03/21 Вск 05:22:56 731635130
>>731530
Не согласен.

Я кешировал значение glGetUniformLocation - и получал довольно ощутимый прирост производительности (около 10%).
Аноним 07/03/21 Вск 06:20:49 731640131
>>731635
В какой структуре?
std::unordered_map отстаёт в три раза от glGetUniformLocation, std::map в полтора раза - ты в самом деле ради этой хуиты что-то ещё писал?
Имеется ввиду ситуация, когда ты каждый кадр получаешь идентификатор из строки.
Аноним 07/03/21 Вск 07:52:40 731641132
>>731640
>В какой структуре?
Я в int хранил
Типа такого:
при сборке шейдера
unsigned locPos = 0;
locPos = glGetUniformLocation(m_programId, "position");
И в мейнлупе:
glUniform4f(locPos , value.x, value.y, value.z, value.w);
Плюс сделал тест с 100к DIP (чтобы фпс было ниже 30 на моем железе) и сравнивал.

И кстати:

>Для неадекватных 1000 вызовов.
Не совсем неадекватно. Скорее реально. Как минимум каждому мешу нужно передавать матрицу трансформации каждый кадр. Видимых уникальных мешей может быть больше 1к. А к этому надо еще добавить дополнительные проходы рендера - deffered, тени, отражения и т.д. Там и до 10к может дойти
И это при условии что есть uniform constant и можно передавать множество переменных одним вызовом
Аноним 07/03/21 Вск 08:10:39 731644133
>>731641
Ещё раз повторю, что имеется ввиду ситуация, когда ты каждый кадр получаешь идентификатор из строки.
А не когда ты тупо int хранишь.
>при сборке шейдера
Это вторая колонка в моей таблице, когда я вызываю только glUniform по номеру заданному через layout.

Речь о том, насколько быстра glGetUniformLocation если использовать её каждый кадр. Про производительность glUniform речи не шло.
>Не совсем неадекватно. Скорее реально.
Матрица - это один юниформ. Ты вызовешь для неё один glGetUniformLocation, а не 1000.

Кажется ты не читал, но там выше же было обсуждение, что по хорошему нужно вызвать glGetUniformLocation только один раз при загрузке шейдера - но суть была в том, что а если вдруг не сохранять идентификатор униформа, то достаточно ли оптимизирована glGetUniformLocation?
И да, более чем достаточна, и вызов glGetUniformLocation+glUniform всего в три раза отстаёт от glUniform, и занимает меньше микросекунды.
Аноним 08/03/21 Пнд 14:18:34 731824134
Сап, как начать вкатываться в огл? Хочу замутить одну штучку на lwjgl
Где брать экзамплы и как рендерить кубики/пирамидки/призмы/другие примитивы?
Аноним 09/03/21 Втр 16:08:40 732061135
>>731644
>идентификатор из строки
А?
Аноним 10/03/21 Срд 06:58:15 732128136
>>731824
Learnopengl.com в оригинале или перевод на Хабре, гуглится
Аноним 11/03/21 Чтв 11:58:01 732368137
А может быть такое, что расширение в списке есть, но по факту не поддерживается или поддерживается не полностью?

Я отослал демку на тест знакомому, а она не работает - хотя я ничего редкого не использовал.
Дописал проверку расширений и версий - всё на месте. Выяснилась что проблема в простейшем геометрическом шейдере, который у меня даже на интеле работает. Какая-то неудачная версия драйвера с багом или почему такое может быть?
Аноним 11/03/21 Чтв 18:07:00 732475138
>>732368
Да, драйвера с багами в принципе бывают, периодически натыкаюсь на сообщения типа "обновил драйвер на свежую версию и все заработало", еще бывают сообщения о регрессе, т.е. "поставил прошлогоднюю версию - работает, ставлю свежую - не работает", но это намного реже.
Аноним 11/03/21 Чтв 22:00:24 732524139
>>678945 (OP)
Ребят, мне лень писать на форумы, поэтому спрошу здесь. Сразу оговорюсь, у меня ноуст с линуксом и nvidia пашет только через optirun -b virtualgl. Так вот, почему в играх у меня fps проседает на 15 по сравнению с cpu, хотя по идеи так не должно быть, но при этом на отдельных шейдерах, например на шейдере моря, явно заметно, что nvidia даёт нехилый буст к перфомансу - картинка идеально плавная.

Есть ещё один прикол. У меня при загрузке этого шейдера сразу кулер начинает работать во всю мощь (и это хороший признак, значит видюха работает), а в игре кулера не слышно. Может такое быть, что разраб прост софтварно какие-то ограничения поставил и не даёт моей видеокарте разогнаться на полную мощь, или у меня драйвер/бридж/(хуй пойми чё ещё) не так работает?
Аноним 12/03/21 Птн 08:18:15 732632140
>>732524
Что значит "при загрузке этого шейдера? Шейдер разве не за милисекунду загружается?
>а в игре кулера не слышно
На видеокарте есть разные блоки, и шейдер может упираться в какой-то не самый энергозатратный. Или например если у тебя узкое место - пересылка данных между карточкой и процессором, то возможно карточка будет довольно холодной (или наоборот, я без понятия - вдруг это самая горячая операция), потому что почти ничего не считает, а просто данные пересылает-принимает.
В общем не так уж невозможно написать шейдер, который будет выдавать 10 фпс и почти не прогревать карточку.

>Может такое быть, что разраб прост софтварно какие-то ограничения поставил
Нет, это шиза. Это не ограничения, а просто хуёвый код, скорее.
Аноним 12/03/21 Птн 09:18:17 732638141
>>732632
>при загрузке
Ну при работе имею ввиду. Но к слову об этой могу сказать, что когда я сидел на debian'е, тот же optirun давал небольшой прирост в фпс, ну или как минимум уж точно не ухудшал производительность. За всю подноготную не шарю этих графических api не шарю, но насколько я вычитал virtualgl работает не напрямую, а ориентирован как клиент-серверное приложение, мб это даёт свой оверхед. Хотя может ты за линуск и не шаришь, конечно, чё я тебя гружу
Аноним 12/03/21 Птн 18:56:01 732741142
Аноним 14/03/21 Вск 16:46:11 733176143
Ананасы, есть два вершинных буфера: 1 для вершин и их цвета (чанки карты), 2 для текстурных координат (у всех чанков одинаковые).
Как бы сделать так чтобы буфер для текстурных координат использовался для рисования всех чанков, а то выходит что один рисуется нормально, а остальные нет.
Аноним 14/03/21 Вск 17:54:29 733189144
изображение.png 19Кб, 1532x459
1532x459
>>733176
Показывай код.
https://pastebin.com/caw3xBVv
У меня всё работает как по маслу, буфер цветов отлично работает на других координатах. Просто замени glColorPointer на glTexCoordPointer или, вернее, на glVertexAttribPointer.

glEnableClientState не нужен в новых версиях что ли? Я его прописал думая, что он нужен из-за легаси - а у меня программа перестала вообще хоть что-то показывать после disable, как будто он изначально был включён для всех пунктов.
Аноним 14/03/21 Вск 17:57:49 733190145
>>733189
> У меня всё работает как по маслу
Потому что у тебя количество вершин в буферах одинаковое.
Аноним 14/03/21 Вск 18:02:12 733192146
>>733190
А не должно быть? Как это вообще работать должно, если тебе не хватает текстурных координат?
Я и говорю код показывай.
Аноним 14/03/21 Вск 18:14:12 733196147
>>733192
В первом буфере 145 вершин на каждый чанк т.е. 32на32 чанка это 21025 вершин
Во втором только 145 текстурных координат.

Соответственно из первого буфера и второго буфера считывается 145 вершин нормально, а дальше выходит хуйня.

Что тебе код-то даст? Ты же нихера в этом не понимаешь всё равно.
Аноним 14/03/21 Вск 18:30:45 733201148
Анон, помоги понять суть VBO. Насколько я понимаю на данный момент, VBO собой представляет некий массив с какими угодно данными о вершинах. Пока, насколько я понял, пайплайн с его участием происходит так:
1) Создаётся в OpenGL context некий абстрактный буфер общего назначения
2) Этот буфер общего назначения привязывается к GL_ARRAY_BUFFER, чтоб второй ссылался на первый
3) GL_ARRAY_BUFFER (его бэкер) функцией glBufferData заполняются данными и высылаются в реальный VBO в видеопамяти

Правильно ли я понимаю на данный момент, как это происходит?
Аноним 14/03/21 Вск 18:33:54 733202149
>>733196
Я то понимаю как раз, может быть не в этом, но в логике работы opengl и что он может/не может.
>Что тебе код-то даст? Ты же нихера в этом не понимаешь всё равно.
Поучусь. Без подкола - почему бы не смотреть на чужой код и не черпать оттуда удачные идеи при любой возможности?

Забинди текстурные координаты в начале, и бинди заново вершины указывая смещение последним аргументом в glVertexAttribPointer, и вызывай glDrawArrays на каждый чанк.
Или можешь сделать ssbo с текстурными координатами, а в шейдере вручную их доставать для нужного индекса, который вроде бы через gl_VertexID поступен.
Аноним 14/03/21 Вск 20:15:30 733219150
>>733201
VBO просто хранит данные и всё. Через glVertexAttribPointer ты указывает как эти данные интерпретировать.
Соответственно, создаёшь vertexarrayobject и биндишь его.
Создаёшь vbo на самом деле ты можешь создать его, залить в него данные когда угодно, биднишь, заливаешь данные.
Скажем, этот буфер хранит Vertex'ы некоего куба. Вершина состоит из vec3 позиция, vec2 координаты текстур, vec4 цвет.
glEnableVertexAttribArray( 0 ) // в шейдере это будет layout(location = 0) in vec3 inVertex;
glVertexAttribPointer( 0, sizeof( vec3 ), GL_FLOAT, GL_FALSE, sizeof( Vertex ), 0 );

glEnableVertexAttribArray( 1 ) // в шейдере это будет layout(location = 1) in vec2 inTexCoord;
glVertexAttribPointer( 1, sizeof( vec2 ), GL_FLOAT, GL_FALSE, sizeof( Vertex ), sizeof( vec3 ) );

glEnableVertexAttribArray( 2 ) // в шейдере это будет layout(location = 2) in vec4 inColor;
glVertexAttribPointer( 2, sizeof( vec4 ), GL_FLOAT, GL_FALSE, sizeof( Vertex ), sizeof( vec3 ) + sizeof( vec2 );


sizeof( Vertex ) это sizeof( vec3 ) + sizeof( vec2 ) + sizeof( vec4 )
Последний параметр в glVertexAttribPointer, это отступ в байтах от начала Vertex. Чтобы не ебаться с этим отсуптом, просто заранее пишешь в какие-то переменные отступ типа так:
https://pastebin.com/iQu2BDBX

Короче, говоря: VAO нужен чтобы запомнить какие атрибуты ты включил или отключил для какого буфера.
При биндинге VAO он сам биндит VBO и EBO (индексный буфер), устанавливает атрибуты и всё.
И тебе останется включить шейдер, забиндить текстуры и рисовать.

Аноним 15/03/21 Пнд 17:21:01 733371151
>>733176
Этот чувак шарит >>733202. Либо у тебя в буфере данные уже подготовлены для последовательного подсоса без дополнительных телодвижений со стороны гпу, либо распиливай на несколько вызовов. Сэкономить на повторах данных и на вызовах отрисовки не выйдет.
Аноним 15/03/21 Пнд 19:16:59 733391152
>>733219
Спасибо за разъяснение! Но есть один непонятный момент: вот этот "биндинг", который запоминает VAO. Никак в толк не возьму, что именно он запоминает. Насколько я понимаю, биндинг VBO - это просто создание пустого буфера и биндинг его на GL_ARRAY_BUFFER. Какой из этих шагов воспроизводит VAO?
Аноним 15/03/21 Пнд 19:29:27 733395153
>>733391
> икак в толк не возьму, что именно он запоминает.
Какие VBO ты забиндил, какие атрибуты включены или включены, и что они означают.

> Насколько я понимаю, биндинг VBO - это просто создание пустого буфера и биндинг его на GL_ARRAY_BUFFER
VBO это vertex buffer object, да это GL_ARRAY_BUFFER.
Создаётся он функцией glGenBuffer. Биндинг это вызов glBindBuffer.

> Какой из этих шагов воспроизводит VAO?
Биндинг glBindBuffer

Ты один VBO можешь использовать хоть в 10 разных VAO.
Аноним 15/03/21 Пнд 19:46:08 733397154
>>733395
>Какие VBO ты забиндил
Вот этот момент непонятен. Если есть один VBO - новый пустой буфер, забинденый на GL_ARRAY_BUFFER. Что там можно запомнить? Ведь данные мы заносим дальше через glBufferData, а на момент glBindBuffer в GL_ARRAY_BUFFER пусто.
Аноним 15/03/21 Пнд 20:00:32 733399155
[/b]
Аноним 15/03/21 Пнд 20:02:43 733402156
.png 36Кб, 590x799
590x799
>>733397
Биндинг это как бы его включение. Шейдеры будут читать данные из включённых буферов, если ты конечно правильно настроил аттрибуты (glEnableVertexAttribArray и glVertexAttribPointer)

> Что там можно запомнить?
Что ты включил конкретно вот этот вот буфер и что аттрибуты у него вот такие.
Данные тут не причём. Если же буфер пустой, то понятно что ничего не нарисуется.

Можешь считать что VAO это просто автоматизация действий: биндинг буфера, включение и установка атриубтов и всё.
Короче, вот тебе картинка с псевдокодом.
Что обведено красным VAO запоминает и делает за тебя каждый раз.
Аноним 15/03/21 Пнд 20:17:14 733403157
>>733402
То есть правильно ли я понял, что VAO за меня создаст пустой буфер, и его уже забиндит на GL_ARRAY_BUFFER?
Аноним 15/03/21 Пнд 20:19:13 733405158
>>733403
Чувак, тебе опенгл рано ещё. Тебе надо букварь для начала.
Аноним 15/03/21 Пнд 20:22:10 733406159
>>733405
Ну а где он возьмёт буфер, который забиндит функцией glBindBuffer? Я это пытаюсь понять.
Аноним 15/03/21 Пнд 22:01:55 733416160
>>733406
Внутри драйвера оглы хранится полное внутреннее состояние, которое в тч включает в себя так называемые точки подключения/биндинги. Назначение этим биндингам тех или иных буферов можно представить как простое присваивание 'указателя' на буфер. Vao в этом случае собственно и сохраняет часть внутреннего состояния, в частности и значения 'указателей' на подключённые буфера. В этом его основная польза - вся настроечная инфа относительно того, какие буферы к каким биндингам подключены и в каком формате из них нужно читать, содержится в одной сущности, которую активировать проще, чем всё по отдельности.
Аноним 16/03/21 Втр 01:47:34 733429161
16142125792940.jpg 88Кб, 1072x1080
1072x1080
Здравствуйте, господа математики.
Я к вам с вопросом. До этого никогда не писал на низкоуровневых библиотеках, Я C# разработчик. Извините, если вопрос не совсем по адресу.
Я ищу решение следующей проблемы. Опишу подробнее.
У меня есть плата raspberry Pi с установленным линуксом, ещё основная проблема это Arm64.
И мне нужно написать небольшую прогу, которая
1. пару раз в минуту обращается наружу хттп гет запросами, откуда получает json, парсит, и получает необходимые обьекты. И из них В общем, строки для последующей работы.
2. Полученные строки необходимо плавно(линейная интерполяция) рисовать и двигать по экрану, тем самым создавая такой красивый заанимированный графический интерфейсинтерфейс бегущих строк
Размер окна, в котором это нужно рисовать маленький(200х300).

Я до этого поста пробовал сделать на wpF+avalonia(кроссплатформенный wpF), оно работает, но бывают частые лаги. Я замерил интервалы отрисовки, когда вызывался Invalid окна, 90% кадров рисовались отлично с задержкой 15-16миллисекунд, а 10% кадров с задержкой 30 миллисекунд. В результате этих лагов выглядит криво. Как я гуглил, у многих такая же проблема, и разрабы avalonia пока не исправляют.

Мне посоветовали посмотреть в сторону SDL2, и я нашел нугет пакет для .Net core, но опыта в нём, соответственно, ноль. Опыта работы с линуксом околонуля.

Я бы написал все прекрасно на юнити и не парился по всему этому поводу, но в юнити нельзя собрать для линукс arm64.

Собственно тут я вижу два стула.
1. Подскажите, пожалуйста, какими средствами это лучше и быстрее сделать.
2. Если у кого-то есть опыт в этом деле и время быстро с этим помочь(именно линукс и именно arm64), то может договоримся за оплату.
Аноним 16/03/21 Втр 12:39:00 733488162
1615887539866.jpg 34Кб, 401x300
401x300
>>733429
> 1. пару раз в минуту обращается наружу хттп гет запросами, откуда получает json, парсит, и получает необходимые обьекты. И из них В общем, строки для последующей работы.
> 2. Полученные строки необходимо плавно(линейная интерполяция) рисовать и двигать по экрану, тем самым создавая такой красивый заанимированный графический интерфейсинтерфейс бегущих строк
> Размер окна, в котором это нужно рисовать маленький(200х300).
> Если у кого-то есть опыт в этом деле и время быстро с этим помочь
Выглядит как легкая задачка для Lazarus Free Pascal (это намёк на гуглинг, да)
Аноним 16/03/21 Втр 17:40:59 733545163
>>733416
То есть, прямо сохраняется id буфера, который привязан к GL_ARRAY_BUFFER?
Аноним 16/03/21 Втр 18:16:52 733552164
>>733545
И GL_ELEMENT_ARRAY_BUFFER тоже, и не только.
Аноним 17/03/21 Срд 07:59:40 733621165
>>733552
Спасибо, теперь понятнее. То есть я вызываю VAO, рисую с использованием его буфера и атрибутов, после рисования буфер очищается, через некоторое время я снова вызываю VAO и снова рисую в том же самом буфере и с теми же атрибутами.
Аноним 17/03/21 Срд 11:34:52 733632166
>>733621
У тебя в одном предложении три раза используется слово буфер, не знаю точно что ты имел в виду, так как это многозначное понятие в рамках OpenGL, его надо уточнять: буфер вершин, элементов, юниформов, кадра, и т.д.

Схема примерно такая должна быть:
1) сгенерировать VAO и подключить его, сгенерировать VBO и опционально буфер элементов, если ты используешь индексы вершин, и подключить их.
2) если у тебя статическая геометрия, то заполни VBO сейчас, либо же только задай его размер, а вместо данных будет нулевой указатель, и не забудь сразу задать указатели на атрибуты вершин (glVertexAttribPointer, glEnableVertexAttribArray).
3) далее можешь отключить только VAO (glBindVertexArray(0)) и делать все остальное.

Затем в каждом кадре:
1) подключаешь только VAO;
2) если геометрия динамическая, то заливаешь ее в текущий VBO (который уже подключен через VAO) - glBufferData, glBufferSubData (считается быстрее всего, если обновляешь небольшую часть буфера вершин), glMapBuffer (будет слоупочно), если статическая, то ничего не делаешь - она уже в буфере вершин;
3) подключаешь шейдерную программу, заполняешь юниформы;
4) рисуешь - glDraw-чего-то-там в зависимости от того, как именно рисуешь.

Если ты имел в виду еще где-то GL_FRAMEBUFFER, то это отдельная тема.
Аноним 17/03/21 Срд 14:37:21 733668167
>>733488
Открыл в гугле.
Там пизданешься с ума раньше, чем на винде соберешь в этом лазарусе для линукса арм64.
Аноним 17/03/21 Срд 14:52:05 733672168
>>733668
Таки да. Программирование - непростая штука. И программистам не просто так 300КК/нсек плотют. Хоть паскаль, хоть си/плюсы, хоть лисп, хоть фортран, если ты не шаришь - ты соснёшь.

Копи деньги на оплату специалиста.
Аноним 17/03/21 Срд 15:13:24 733679169
>>733668
У тебя там линукс крутится с иксами или без? По-разному можно сделать.
Аноним 17/03/21 Срд 19:03:37 733761170
>>733429
И всего-то?
Библиотека curl, cjson, stb_truetype (можно и freetype2), рисовать самым простым опенглом, а компилировать прямо на малинке.
У тебя же там иксы?
Незнаю, отчего могут быть лаги, но вряд ли это что-то нерешаемое.
Если готов оплатить, то могу сделать долларов за 40-80, кидай почту или телеграм.
Аноним 18/03/21 Чтв 07:45:52 733840171
Как рендерить жидкости? Не плоские поверхности с волнами, а симуляции, чтоб она перетекала через всякие каналы и прочие отверстия
Аноним 18/03/21 Чтв 11:38:57 733860172
>>733672
>300кк/нсек
Рыночек порешал прост, но по своей сути программисты - это обычные ремесленники, на ступень выше чёрнорабочих
Аноним 18/03/21 Чтв 11:41:52 733861173
Аноним 18/03/21 Чтв 12:48:25 733867174
>>733860
> по своей сути программисты - это обычные ремесленники
Повар тоже обычный ремесленник. Попробуй устройся в элитный ресторан шефом. Жду через неделю с пруфами.
Аноним 18/03/21 Чтв 15:25:57 733897175
Аноним 18/03/21 Чтв 17:34:49 733919176
>>733861
Я так понял это только для тех у кого карта от нвидии и кто может в куду, а есть симуляции для нищих? Мне фотореализм и абсолютная физическая достоверность не нужны. Если бы было что-то как в 2д симуляторах песка, только в полигонах - я был бы счастлив
Аноним 18/03/21 Чтв 18:10:17 733930177
>>733919
Можешь попробовать загуглить "SPH fluid", там простой код - если частицы по равномерной сетке раскидать, то на современном процессоре можно 50-200к в 60 фпс получить.
По этому же запросу есть демки, где из частиц прям поверхность получают - но как это делается я не знаю.
Аноним 21/03/21 Вск 11:53:16 734363178
>>678945 (OP)
Существует понятный гайд по установке glfw на линух?
Если нужно с исходников компилить то в какой директории? Сначала cmake или make? Где потом искать и подключать includ'ы?
Аноним 21/03/21 Вск 17:19:16 734442179
>>734363
А там есть какие-то сложности? Сделай build каталог на уровне каталога с сырцами
cd build
cmake ../sources
make install
Возможно что-то подшаманить в конфигурации, выбрать install каталог.
Аноним 21/03/21 Вск 21:14:38 734508180
>>734442
А какой путь потом к заголовочным файлам в редакторе указывать?
Аноним 22/03/21 Пнд 06:59:00 734556181
>>734508
Если install_path оставишь системным, то никакой, достаточно того, как в примерах на сайте либо показано, т.е. <GLFW/glfw3.h>
Вообще на сайте либы есть компайл-гайды нормальные. Или ингришь совсем не осилишь?
Аноним 22/03/21 Пнд 12:18:37 734578182
>>734363
Госпаде, я сейчас сижу на винде только потому что рабочий софт только на ней, и радуюсь, что в кои-то веки в винде MSYS работает почти искаропки (ы-ы-ы, pacman, без всяких сраных WSL, виндовые бинарники с легким привкусом линуха, ы-ы-ы), когда в линухах уже давно все было сделано как надо - поставил либу, если заголовки в отдельном пакете, то поставил и их, и просто все работает. А тут кто-то дрочит ручную сборку достаточно распространенной либы в линухах и спрашивает про пути. Маня, apt/yum/pacman/или-что-там-у-тебя сделал один раз и просто все работает, никаких путей не надо, не надо никаких cmake/make/zalupacake дрочить, codelite какой-нибудь навернул, сказал ему gcc найти на машине, зависимости из пакетного менеджера докинул, и ПРОСТО ВСЕ РАБОТАЕТ.
Аноним 22/03/21 Пнд 12:48:58 734592183
>>734578
И будет твоя прога только через msys.dll работать и фризить, такие пердоли...
Аноним 22/03/21 Пнд 13:20:43 734596184
ldd.png 47Кб, 604x482
604x482
>>734592
>msys.dll
Не угадал, пикрил.
Фризов пока не было.
Аноним 22/03/21 Пнд 22:23:17 734695185
>>734596
а ты mingw шный компилятор использовал или msys ный?
Аноним 22/03/21 Пнд 22:47:10 734698186
>>734695
>>734592
Очевидно он использовал mingw.
Msys компилятор нужно использовать только для разработки тулзов для самого msys.
Аноним 23/03/21 Втр 10:58:17 734747187
>>734695
>>734698
Пакеты без mingw-префикса можно юзать только если нету с префиксом, иначе придется потрахаться.
Аноним 23/03/21 Втр 11:56:39 734750188
>>734747
git только без префикса
Аноним 30/03/21 Втр 10:24:59 736035189
Может ли кто-то прояснить про bindless-текстуры? Вот я читаю то, что записано в вики у кроноса:

>Before a handle can be used in a bindless operation, the data associated with it must be made resident.

>Note that a handle is what is being made resident, not a texture. As such, if you have handles that refer to the same texture's storage, making one resident is not sufficient to use one of the other handles. Residency affects more than just the image data.

>Conceptually, image data being resident means that it lives within GPU-accessible memory directly. The amount of storage available for resident images/textures may be less than the total storage for textures that is available. As such, you should attempt to minimize the time a texture spends being resident. Do not attempt to take steps like making textures resident/unresident every frame or something. But if you are finished using a texture for some time, make it unresident.

То есть получается, что я не могу просто взять и сделать все свои текстуры сразу доступными для bindless, и надо фактически каждый кадр еще вычислять, какие из них будут использоваться, а какие нет, иначе драйвер может в любой момент сказать "чота памяти маловато", так?
Аноним 30/03/21 Втр 15:17:24 736091190
>>736035
Можешь, если они все в видеопамять влазят.
Если ты стримингом текстур не занимаешься, просто забей и все делай резидентными.
Аноним 30/03/21 Втр 18:58:59 736149191
Аноним 10/04/21 Суб 12:23:55 738128192
Только начал с этой хуйней разбираться, концептуально не понимаю.
Есть значит массив треугольников. Я его загоняю в VBO и они рисуются на своих координатах и все хорошо. Теперь я хочу двигать только один элемент из этого массива, и насколько я понял, менять координаты прямо в VBO - хуевая идея, надо как-то через вертексный шейдер и матрицу переноса в юниформу передавать. Но блядь как если у меня все треугольники одним дравколлом рисуются, и соответственно в шейдер я могу передать только одну матрицу, одинаковую для всех треугольников.
Аноним 10/04/21 Суб 13:28:20 738133193
>>738128
В зависимости от ситуации
1) Каждый треугольник - отдельный vbo, передавай матрицу и двигай как надо
2) Записывай в vbo новые координаты, при изменении
Аноним 10/04/21 Суб 13:57:23 738139194
>>738133
Да проблема в том, шо то што это хуйня.
1. Отдельные vbo - дохуя дравколлов.
2. Менять vbo - я хочу двигать объекты мышкой, получатеся буфер будет очень часто обновляться и тормозить карточку, не оптимально. И в интернетах пишут, что такие вещи надо матрицами делать.
Я нагуглили что-то про Instancing, но там либо ограниченное кол-во объектов, либо переносы тоже надо будет в буфер заносить и его менять
Это все варианты решения проблемы, тут же сверхразумы есть?
Аноним 10/04/21 Суб 14:23:05 738149195
>>738139
Говоря про треугольник, ты же упрощаешь задачу.
По факту у меня могут быть разные 3д модели, с миллионами треугольников. Совершенно логично, что каждая модель это отдельный vao/vbo со своими матрицами, и чтоб передвинуть одну модель относительно другой нужно менять ей матрицу.
Или у тебя единая сложная (допустим 2д) геометрия из отдельных треугольников, меняющая свою форму и количество треугольников. Тут никуда не деться от перегенерации vao.
Если у тебя куча однотипных моделей, ну инстансинг вполне пойдет, но опять же для каждого перемещения модели, придется менять данные в буфере, может только частично через glBufferSubData. Если моделей дофига, сделаешь несколько drawcallов.

Прямо таки стремиться к единственному drawcallу, конечно можно, но без фанатизма.
Аноним 10/04/21 Суб 15:03:22 738151196
>>738139
>я хочу двигать объекты мышкой, получается буфер будет очень часто обновляться и тормозить карточку, не оптимально
Какая-то дичь. Я не заметил заметной разницы между тем, чтобы рисовать из памяти, и тем, чтобы каждый кадр полностью обновлять все вершины в vbo. И при этом ты можешь рисовать несколько сотен тысяч вершин из оперативы, и любая карточка моложе десяти лет это скушает в реальном времени. А передавать можно только изменённые.
Вершины это почти последнее место, которое станет узким местом производительности.

>Это все варианты решения проблемы
Можешь для каждой вершины хранить индекс соответствующего объекта, а множество матриц преобразования хранить в ssbo (или ubo, но его я никогда не использовал - точно не обещаю что он подходит).
Один дравколл, при движении объекта меняется только одна матрица. Можно хоть каждый кадр полностью перезаливать в буфер все матрицы.


Просто по количеству объектов смотри. Если меньше тысячи разных vbo, то я бы их так и оставил - почему нет? Если больше и для каждого своя матрица, и при этом каждый объект состоит из малого числа редко обновляющихся вершин (которые привлекательно посчитать один раз поменяв vbo) - то уже замерял бы производительность, так ли медленны эти несколько тысяч вызовов и нужно ли их менять на glBufferSubData.
У меня во всех случаях производительность упирается в фрагментные шейдеры, который кушают 90% времени - а во всех остальных местах можно что угодно делать любым подходом, и это почти никак не влияет на производительность.
Аноним 10/04/21 Суб 15:06:54 738153197
Аноним 10/04/21 Суб 15:17:38 738155198
>>738151
Отдельные vbo (один vbo со множественными дравколлам) предпочтительнее, потому что ты их просто по пирамиде видимости можешь отсекать вовсе никаких вызовов не делая для невидимых объектов. Поэтому меня и не смутила бы даже тысяча разных vbo.
Просто необходимость объекты делить на чанки (кучи объектов расположенных примерно в одном месте) уже мотивирует использование разных vbo.
Если же у тебя есть одинаковые объекты расположенные в разных частях мира (стулья какие-нибудь, ящики, кусты) - тогда тебе в любом случае нужно использовать один vbo, и для разных кустов разные матрицы использовать. И да, несколько дравколлов. Сложно представить игру, где каждый стул уникальный и повторяющейся геометрии нет. Одинаковый стул из одного буфера всё ещё возможно нарисовать в разных местах одним дравколлом с использованием некоторых костылей - но они повредят как ясности кода (и возможности его изменения), так и производительности.

Можно конечно хоть вообще все данные хранить в одном буфере обновляя разные его части - но так ли тебе этот дрочь нужен ради 2% производительности? Лучше над игрой-геймплеем поработай или что ты там делаешь. Какая-то высокоуровневая оптимизация по типу отсечения по пирамиде видимости даст тебе на порядок больше, чем выбор между одним/множественными vbo и всеми другими подходами. Неверная точка приложения сил - если ты не просто учишься и экспериментируешь.
Аноним 10/04/21 Суб 16:07:36 738162199
>>738155
Да я только начал учить, просто вообще непонятно что оптимально, что нет, какие бест практисес, в туториалах про время исполнения тех или иных вещей не пишут почти.
Аноним 10/04/21 Суб 20:14:54 738187200
>>738151
Дум3 например каждый кадр пишет все вертексы-индесы в видеопамять заново. Но это не так много, где-то пара мегабайт. Сейчас конечно модели пожирнее, но и память и шины быстрее.
Аноним 10/04/21 Суб 20:29:13 738191201
>>738187
Только там всего по паре буферов на вершины\индексы\юниформы. Пока один рендерится, в другой пишется.
Аноним 11/04/21 Вск 07:04:24 738241202
Аноним 11/04/21 Вск 23:17:56 738344203
>>738128
Не заморачивайся сильно, от того что ты будешь буфер обновлять каждый кадр ничего ужасного не произойдет. Скорее всего будет быстрее чем всякие сложные шейдеры с бранчами.
Аноним 14/04/21 Срд 11:03:00 738659204
Двочаны помогите, я синтаксис glsl понять не могу.

Вот у меня есть
varying vec4 v_vColour;

У v_vColour есть r g b a - это цвет и а спрайта.
Мне нужно, чтобы в той точке, где альфа единица, альфа становилось равной 0

Но если я пишу
if v_vColour.a == 1.0 v_vColour.a = 0.0;
Мне пишет синтаксическую ошибку. А в чём ошибка? Как это в glsl делается?
Аноним 14/04/21 Срд 11:24:54 738660205
Всё, нагуглил. Надо писать
if (v_vColour.a == 1.0) {v_vColour.a = 0.0;}
Аноним 14/04/21 Срд 14:40:31 738683206
1.png 0Кб, 112x94
112x94
Теперь я могу вырезать контур игрока на спрайте света, если источник света находится позади него.
Но теперь я хочу уменьшить этот контур на 2 пикселя, сделав тем самым освещение спрайта игрока "по краям", добавив таким образом имитацию 3д света в 2д.
Аноним 15/04/21 Чтв 10:41:45 738777207
изображение.png 3Кб, 281x101
281x101
>>738660
Фигурные скобки не обязательны. Обязательны круглые скобки вокруг условия, и (если что) это не только glsl, но и обычный си.
Аноним 15/04/21 Чтв 10:43:41 738778208
Текс, разобрался в синтаксисе и даже понял как работать с координатами текстур.
Для того, чтобы не просто вырезать спрайт игрока, мне нужно не просто уводить в 0 альфу и цвет точек, у которых альфа равна 1.

Мне нужно проверять окружающие точки, и если справа-слева сверху-снизу у точки с альфой 1 альфа не 1, то вместо увода альфы в 0 копировать на себя одну из этих точек.

Получится много if.
Насколько я понял, в шейдере нужно избегать if

Есть какие-то методы? Типа умножения вектора на булин?
Аноним 15/04/21 Чтв 10:45:27 738779209
>>738777
Спасибо.

if (right != 1.0 || left != 1.0 || up != 1.0 || down != 1.0)
{

}

Так тоже вроде работает. Все условия скопом в скобках. По крайней мере на синтаксис не ругается.
Аноним 15/04/21 Чтв 11:04:47 738783210
изображение.png 11Кб, 668x181
668x181
Кстати, анончики, а есть какая-то ide для шейдеров?

Чтобы оно подсвечивало cross как встроенную функцию, а cross2sa подчёркивало красным - так как такой функции нет выше?

pycharm только типы по сути подствечивает, или простые ошибки как отсутствие скобок в if - но всё-равно можно допустить опечатку и искать её придётся вручную.
Аноним 15/04/21 Чтв 11:13:42 738786211
>>738778
>Насколько я понял, в шейдере нужно избегать if
Считай, что у тебя во всех случаях вычисляются обе ветви if.
То есть если у тебя написан код по типу if (p<0.001) {оче медленная функция} else {быстрая функция} - то работать он будет со скоростью оче медленной функции, даже если p почти всегда больше 0.001
Я не знаю как делают нормальные люди, но я вместо очень медленной функции записывал маску пикселей, после чего запускал медленный шейдер только для нужных пикселей.
Было бы интересно услышать как другие с таким справлялись.

Вот картинку погляди: >>728269
Аноним 15/04/21 Чтв 11:28:45 738789212
1.png 0Кб, 112x94
112x94
2.png 0Кб, 112x94
112x94
3.png 0Кб, 112x94
112x94
>>738786
В этом коде ты вместо того, чтобы вычислить размер текселя, испольшуешь шаг 0.0005 по иксу, что примерно соответствует размеру текселя на текстуре шириной 1920. Я уже сумел это понять

Но остальное я в твоём коде не понимаю.

Я собираюсь для каждой точки на сурфейсе, который рисуется шейдером проверять альфу.

У меня исходник пик 1. На нём свет с а<1.0 в каждой точке и силуэт игрока с a==1.0 в каждой точке.

В настоящий момент мой шейдер ifом проверяет равенство альфы единице, и если она равна, то обнуляет её, получая пик 2.

Теперь я хочу добавить спрайту игрока фейкового объёма, не делая всяких этих карт нормалей хотя может быть потом я их и сделаю, как знать, просто сделав две обводки его силуэта светом.

Здесь потребуется куча ifов
Аноним 15/04/21 Чтв 11:43:55 738791213
1.png 101Кб, 826x847
826x847
Ну вот оно даже получилось с 5ю ifами.

На 4 пикселя в глубину спрайт игрока подсвечивается окружающим светом.

Выглядит классно, если спрайт игрока просто чёрный на самом деле зелёный контур.
Но когда я вставляю настоящий спрайт, получается коряво.
Потому что вот эту подсветку на глубину в 4 пикселя надо "размазать". Во-первых усреднить по ближайшим 4ём пикселям по цвету и альфе, а во вторых поступательно уменьшать по a по мере удаления от края спрайта.

А это ещё куча ifов.
Аноним 15/04/21 Чтв 12:57:14 738802214
>>738789
>Я уже сумел это понять
Нет, это был просто фиктивный цикл, чтобы фпс упал до низких значений.

Я не очень понял что ты делаешь, но если у тебя 2д и разумное количество спрайтов, я бы без шейдера на процессоре один раз посчитал и загрузил.

>Ну вот оно даже получилось с 5ю ifами.
Нет бы код скинуть на пастебин какой-нибудь.
У тебя a принимает только два значения 0/1? Если да, то замени четыре нижних условия на:
texColor=texute2D(gm_BaseTexture,v_vTexcoord+4.0∙offsetx∙(-scan_rignt+scan_left)+4.0∙offsety∙(-scan_down+scan_up)) или что-то похожее.
Если нет, то всё-равно считай в четырёх условиях лишь текстурные координаты (которые v_vTexcoord+..), а потом один раз внизу вызывай texute2D с полученными координатами.

Условие на строке 20 можно переписать как texColor.a==1.0, ты же на 18 строке только что вызвал texute2D с теми же аргументами. Это настолько очевидно, что даже компилятор glsl сам может догадаться это оптимизировать.
Аноним 15/04/21 Чтв 14:10:53 738811215
Runner 2021-04-[...].webm 1318Кб, 742x418, 00:00:06
742x418
Runner 2021-04-[...].webm 1478Кб, 556x314, 00:00:10
556x314
1.jpg 95Кб, 1322x857
1322x857
>Я не очень понял что ты делаешь,
webm рилейтед

>Нет бы код скинуть на пастебин какой-нибудь.
Ну тут хоть какая-то разметочка есть

>texColor=texute2D(gm_BaseTexture,v_vTexcoord+4.0∙offsetx∙(-scan_rignt+scan_left)+4.0∙offsety∙(-scan_down+scan_up)) или что-то похожее.
Сейчас подумаю, как можно ifы сократить.

Пока додумался до пикрил. В шейдерах я полный нуб.


>Условие на строке 20 можно переписать как texColor.a==1.0, ты же на 18 строке только что вызвал texute2D с теми же аргументами. Это настолько очевидно, что даже компилятор glsl сам может догадаться это оптимизировать.

Да это я пока проверяю, как работать будет. Потом всё почищу-причешу. как сумею



В итоге я беру значение альфы света на расстоянии alpha_depth пикселей от пикселя с альфой 1.0 и если там прозрачно, то я этому пикселю выставляю альфу в зависимости от того, сколько прозрачных пикселей рядом с ним.

Если рядом с непрозрачным пикселем на расстоянии alpha_depth нет прозрачных пикселецй, значит пиксель не освещён и альфу ему ставлю 0.

На вебмках на тестовом спрайте глубина 4, на спрайте игрока глубина 8. Т.к. с глубиной 4 света на игроке почти не видно.

Не откажусь от советов мудрых, как сделать лучше.
Аноним 15/04/21 Чтв 14:30:11 738817216
>>738811
Сокращай не if, а сложность операций под if.

Вариант 1:
if (a==1.0)
color=texture2d(xy+16.0)
if (b!=1.0)
color=texture2d(xy-21.0)
--
Плохой вариант, два texture2d, две операции с xy

Вариант 2:
vec2 st;
if (a==1.0)
st=xy+16.0
if (b!=1.0)
st=xy-21.0
color=texture2d(st)
--
Лучше - две операции с xy, один texture2d

И на этом стоит остановиться.
Если у тебя а принимает только значения 1.0 и 0.0, то можно свернуть в одну строчку без условий (с использованием условного step, если у тебя float) - но это того не стоит, мне кажется. В финальной версии когда уже всё сделаешь, можешь напильником это обработать, чтобы 1% производительности получить (если он тут вообще будет) - но скорее всего будет несколько десятков более целесообразных задач в плане повышение производительности и общего качества программы.

Я бы ещё else расставил во всех местах, конечно. Ну так, на всякий случай - у тебя же значение texColor перезаписывается.
Меня люто триггерит твой код, где в случае если у тебя одновременно срабатывают alpha_up и alpha_left, результат будет такой же как просто с alpha_up, просто потому что он в коде расположен за alpha_left - при том что никаких выделенных направлений не должно быть.

Аноним 15/04/21 Чтв 15:20:15 738821217
>>738817
>где в случае если у тебя одновременно срабатывают alpha_up и alpha_left, результат будет такой же как просто с alpha_up, просто потому что он в коде расположен за alpha_left

Да-да, я в курсе. Прямо сейчас работаю над этим.
По идее надо суммировать свет на пикселе со всех направлений и как-то нормализовать.
И вообще брать за основу света не значение альфы в N пикселей от освещаемой точки, а усреднённую альфу в регионе рядом с ней. Иначе структура света заползает на игрока. Свет-то от фанариков вручную рисуется. Там "нормали", все дела. Когда таким светом на игрока светишь, кажется что на него попадает изображение с проектора.
Аноним 15/04/21 Чтв 15:39:25 738827218
>>738821
Написать как бы я сделал?
Я тоже то ещё нубло - но хотя бы чуть-чуть, немного, математик.
Аноним 15/04/21 Чтв 15:44:15 738829219
>>738827
Напиши конечно.

Кстати, какой цвет и a будут у пикселя, взятого по координатам за пределами текстуры? Всё по нулям? Или нужно ставить условие в цикл, чтобы за пределы текстуры не влезал?

Сейчас у меня такого условия не стоит и вроде всё работает без проблем.
Аноним 15/04/21 Чтв 15:51:54 738833220
>>738829
> какой цвет и a будут у пикселя, взятого по координатам за пределами текстуры?
Зависит от параметров сэмплирования, никаких условий не надо ставить, кури glTexParameteri, GL_TEXTURE_WRAP_S, GL_TEXTURE_WRAP_T.
Аноним 15/04/21 Чтв 15:57:47 738834221
>>738786
>То есть если у тебя написан код по типу if (p<0.001) {оче медленная функция} else {быстрая функция} - то работать он будет со скоростью оче медленной функции, даже если p почти всегда больше 0.001

Текс, до меня только сейчас дошло, что если я буду запускать циклы внутри if, то исполняться они будут для каждого пикселя, а не только для неосвещённого.

Впрочем характерные размеры спрайта света у меня где-то 8080, с редкими исключениями до 200200.
Аноним 15/04/21 Чтв 16:18:12 738840222
>>738829
Лады, попозже вечером скину.
Тебя версия 4.5 и легаси устроит, чтобы тысячи строк не писать для того чтобы квадрат из четырёх вершин вывести и сдвинуть?
Аноним 15/04/21 Чтв 16:22:07 738841223
1.png 63Кб, 564x619
564x619
>>738840
Я гамаком пользуюсь. У них GLSL ES v2
Аноним 15/04/21 Чтв 17:46:49 738849224
1.png 120Кб, 1515x731
1515x731
Runner 2021-04-[...].webm 4844Кб, 962x540, 00:00:26
962x540
Вот что вышло.
Результат мне нравится.
Аноним 16/04/21 Птн 18:58:31 739007225
Аноним 17/04/21 Суб 15:12:26 739117226
изображение.png 24Кб, 1034x300
1034x300
изображение.png 190Кб, 1505x954
1505x954
изображение.png 62Кб, 770x501
770x501
>>738841
>GLSL ES v2
Это что вообще? Это не под мобилки разве?
Я тогда не буду доводить до ума, потому что я кода из своих демок намешал, и у меня легаси пополам с dsa, и по идее ни то, ни другое в es не поддерживается.
Шейдер ниже. in/out - это varying, binding просто подписывает на каком текстурном юните какая текстура.

К тому же ниже скинули то же самое что пишу я - только качественнее.
Там вся сложность в том, как выбрать нормали. Если как на первой картинке - то объём не тот который хочется. А на второй слишком бублики вместо объёма - это не для всех изображений подойдёт. Я вот выбрал так, что вблизи объект освещается равномерно - а издалека только сбоку. Можно считать что источник света за объектами, и тогда нормали на границе нужно считать иначе, чтобы они освещались когда свет за объектом.

Но в любом случае стоит заранее один раз посчитать нормали, а в шейдере две текстуры юзать - шейдер очень лёгкий получается, без условий и множественных выборок из текстуры.
Аноним 17/04/21 Суб 18:13:43 739139227
>>739117
Так прикол в том, что у меня нет нормалей. Я как представлю, что нужно будет нарисовать нормали к полутора тысячам спрайтов, так дурно становится.
Так что я сделал просто "дешёвое" освещение которое будет применяться к редким объектам, типа игрока или NPC, подсвечивая их с краёв, как будто в игре ААА 3д свет с нормалями.
Аноним 17/04/21 Суб 18:14:25 739140228
>>739007
Да-да-да. Я даже себе spritelamp купил. Но это дохера работы, а у нас ещё демка даже не сделана.
Аноним 17/04/21 Суб 18:57:37 739157229
>>739139
Так программно сгенерируй их. Это будет лучше, чем костыль в шейдере. И производительнее.
Да, не так красиво как вручную, но всё ещё ничего может быть.
Аноним 17/04/21 Суб 19:11:01 739160230
>>739157
Ну кстати да. Просто программно сделать из спрайтов "тело вращения" и нафигачить нормали на такое тело.

Может быть я так и сделаю когда-нибудь.
Аноним 18/04/21 Вск 16:42:56 739249231
Поясните за Array Texture. Это настоящий двумерный массив с текстурами, где каждый слой - текстура? Или эмуляция таким образом одной большой текстуры разбитой на тайлы?
Аноним 18/04/21 Вск 17:50:20 739250232
>>739249
Это обычная трёхмерная текстура - но такая где слои по глубине не блендятся из-за фильтрации, и при создании мипмапов размерность по глубине не уменьшается.
Аноним 18/04/21 Вск 18:08:16 739252233
>>739250
Окей, тогда еще нубский вопрос. Есть ли возможность закинуть в шейдер штук 200-300 текстур, что бы можно было передавать через инстансированные массивы id этой текстуры и рендерить за один проход тысячи однотипных объектов с разными текстурами?
Аноним 18/04/21 Вск 21:23:28 739275234
>>739252
Закидываешь в UBO или SSBO список номеров слоев в текстуре-массиве и в фрагментном шейдере юзаешь. Как обратиться по номеру инстанса - встроенная переменная gl_InstanceID.
Аноним 19/04/21 Пнд 01:29:16 739295235
>>739252
Если они одинакового размера.
Если разного - то посмотри что такое текстурный атлас (тоже можно, сколько хочешь текстур и какого хочешь разрешения), но немного сложнее в виде кода.
Аноним 25/04/21 Вск 09:34:25 739932236
Назрел вопрос по геометрическому шейдеру. Можно как-то в нем прочитать данные из инстансированного массива? В вертексном шейдере можно читать из него провернув финт аля layout (location = 2) in mat4 запихнув в вершинные атрибуты, что помогает избежать ограничения размера юниформ массива, но как быть с геометрическим? Неужели только через юниформ-массив?
Аноним 25/04/21 Вск 14:33:49 739956237
>>739932
Передавай из вершинного в геометрический твои данные, так же как обычно передаёшь из вершинного во фрагментный цвета и текстурные координаты, когда нет геометрического?
>ограничения размера юниформ массива
Да чем же тебе ssbo не нравится. Можешь хоть из текстуры читать твои матрицы - там же даже есть функции распаковки пикселей во float-ы, которые прям в самых первых версиях opengl добавили как раз для таких нужд.
Аноним 25/04/21 Вск 22:36:10 740010238
1
Аноним 26/04/21 Пнд 11:46:10 740029239
>>739956
SSBO может не нравиться если есть ограничения на версию API, и ограничения эти либо в голове (возможно преодолеть), либо в железе (тогда жопа).
Аноним 26/04/21 Пнд 16:16:54 740087240
>>740029
>тогда жопа
А текстура чем плоха? Можно текстуру из флоатов сделать, такое ещё во времена фреймбуферов и opengl 2.1 появилось везде, а в 3.0 вошло в стандарт - 13 лет назад.
Если доступ к текстуре нормально работает во фрагментном шейдере, то на каждую вершину по четыре вызова texelFetch (для матрицы) можно себе позволить - если по какой-то причине что-то современнее не работает.
Может быть я чего-то не понимаю...
Аноним 26/04/21 Пнд 21:47:30 740151241
>>740087
По-моему "прямое" чтение из памяти должно работать быстрее чем через текстурный юнит, но это надо проверять.
Аноним 05/05/21 Срд 22:31:39 741186242
Посоны, у меня есть точки на экране. Пользователь может выделить мышкой область и нужно найти все точки, которые попали в эту область. Как такое делать?
Это платина, да?
Аноним 05/05/21 Срд 22:58:34 741194243
>>741186
Делаешь двухмерный массив размером с экран, куда на экране пользователь кликнул - идешь по тем координатам в массив и смотришь что там лежит. А точки, ну если их не много можно и старым опенгл ввести. Или сделать текстуру на основе массива и уже ее вывести.
Аноним 05/05/21 Срд 23:24:44 741197244
>>741194
> если их не много
Сотни тысяч. Каждая точка - это наблюдение. В минуту делают 5 наблюдений, а всего наблюдения ведутся 12 лет.

Мне кажется, ты описываешь двумерный случай. А у меня трехмерный. В таком случае придется не просто брать координаты выделенной области, а куб [x0, x1]x[y0,y1]x[-1,1], после чего куб умножать на обратные матрицы (смещения, поворота итд) и получать область в пространстве точек. И потом искать, какие точки принадлежат этой области. А это дико долгая процедура, потому я надеялся, есть какие-то более умные подходы.
Аноним 05/05/21 Срд 23:39:49 741202245
>>741197
Инстансные массивы. А выделение мышки проверяй обходом всех элементов, те что попали в выделенную область по координатам - те наши.
Аноним 06/05/21 Чтв 00:09:37 741207246
>>741197
>выделить мышкой область
Квадратом, или произвольной линией?
>А у меня трехмерный
Пересчитываешь все точки в 2d-координаты, и делаешь проверки x1<x<x2 для квадрата, или более сложные по линии. Если у тебя точки за спиной, учти что ещё нужно будет проверить, что глубина положительна и точка перед камерой. Обратные матрицы не нужны.
К opengl твоя задача никакого отношения не имеет.
Можно построить пирамиду видимости и смотреть пересечения с границами в трёхмерном случае (разбирается в https://pmg.org.ru/nehe/nehex2.htm) - но для точек это смысла не имеет и намного производительнее будет просто точки пересчитать, мне кажется.

Если по какой-то причине тебе нужно лютая производительность, а форма выделения произвольная - то разделяй точки на чанки по сетке (или по дереву - но это очень сложная форма выделения должна быть из тысяч сегментов, что проверка каждой точки отдельно будет тяжелее, чем построение дерева) и проверяй сначала грубо попадает ли чанк в область, а потом просчитывай отдельно точки, которые находится в чанках, которые пересекаются границей выделения.
Аноним 06/05/21 Чтв 00:10:31 741209247
Аноним 06/05/21 Чтв 00:34:29 741216248
>>741207
>Пересчитываешь все точки в 2d-координаты
Но ведь 2д-координаты будут зависеть от матриц (картинка не статична, ее можно вертеть и приближать-удалять).
Пока сделаю так. Всю математику из вершинного шейдера перепишу на куду, чтобы можно было получать обратно 2д-координаты точек. И для выделенной области буду проверять эти 2д-координаты.
Спасибо.
Решил научиться в визуализацию, чувствую себя героем вебмки "Не лезь, она тебя сожрет"
Аноним 06/05/21 Чтв 00:34:51 741218249
Аноним 06/05/21 Чтв 11:37:23 741297250
>>741216
>Но ведь 2д-координаты будут зависеть от матриц (картинка не статична, ее можно вертеть и приближать-удалять)
Ии? Ты выделяешь точки в один определённый кадр, в момент выделения сохраняешь список выделенных точек. Или ты одновременно двигаешь камеру и изменяешь квадрат выделения? Энивей что бы ты не имел виду обратное преобразование тоже не статично, и пирамиду придётся перестраивать.

Если квадратом - то без разницы, при пересчёте ты выполняешь 4 скалярных произведения (умножение матрицы на вектор), при отсечении по пирамиде четырьмя плоскостями тоже 4 скалярных произведения (по одному на плоскость).
Это при выделении сложной фигурой на 2d экране, многоугольником или кругом нужно пересчитывать.

>Всю математику из вершинного шейдера перепишу на куду
Зачем? Есть вычислительный шейдер, который куда меньшими усилиями соединяется с программой на opengl, чем куда. Есть transform feedback, лол.
Ты уверен, что гонять 100к вершин каждый кадр будет быстрее, чем умножить их на процессоре (если не использовать transform feedback и считать их ещё раз)? Я не уверен. Скалярное произведение состоит только из сложений и умножений - это очень лёгкие операции на один такт.
Если ты поехавший, для тебя есть https://software.intel.com/sites/landingpage/IntrinsicsGuide/#techs=AVX2,FMA&text=mad&expand=2541,2553 - с помощью чего ты можешь ускорить вычисления в 4/8 раз, а на деле ещё сильнее за счёт совмещения умножения и сложения. А потом ещё распараллелить. Я не поверю что доступ к памяти видеокарты будет быстрее, чем самая быстрая процессорная операция.

Кстати, привет, мы знакомы с очень большой вероятностью по всем признакам.
Аноним 12/05/21 Срд 11:50:19 742576251
изображение.png 7Кб, 514x544
514x544
Почему не работает обводка в задней части кубика?
Аноним 12/05/21 Срд 12:16:49 742577252
>>742576
потмоу, что "кубик" не отрисовывается до конца?
Аноним 14/05/21 Птн 22:25:57 743256253
изображение.png 5Кб, 368x351
368x351
9, -668.74933, -2802.08325, 95.99379, 0.05512, -0.07874, 0.99213,
0, -666.66602, -2800.00, 96.02305, 0.03937, -0.07087, 0.99213,
17, -670.8327, -2800.00, 96.21115, 0.01575, -0.04724, 0.99213,

9, -668.74933, -2802.08325, 95.99379, 0.05512, -0.07874, 0.99213,
1, -666.66602, -2804.16675, 95.60873, 0.05512, -0.09449, 0.99213,
0, -666.66602, -2800.00, 96.02305, 0.03937, -0.07087, 0.99213,

9, -668.74933, -2802.08325, 95.99379, 0.05512, -0.07874, 0.99213,
18, -670.8327, -2804.16675, 95.92864, 0.03937, -0.07874, 0.99213,
1, -666.66602, -2804.16675, 95.60873, 0.05512, -0.09449, 0.99213,

9, -668.74933, -2802.08325, 95.99379, 0.05512, -0.07874, 0.99213,
17, -670.8327, -2800.00, 96.21115, 0.01575, -0.04724, 0.99213,
18, -670.8327, -2804.16675, 95.92864, 0.03937, -0.07874, 0.99213,



Как посчитать эти ебучии нормали? Чтобы результат был как в последней колонке.
Аноним 15/05/21 Суб 13:21:58 743311254
>>743256
Понятнее спрашивай, где у тебя координаты, где нормали и что это вообще (откуда ты это взял).

У треугольника одна нормаль, а не три разных в каждой вершине. Если у тебя в разных углах треугольника разные нормали - то это не нормали, а какие-то абстрактные числа одну тебе известным способом полученные.
Если считать нормаль в вершине как среднюю нормаль полигонов, в которые входит вершина, то на 9 точке получается 0.06058027 -0.0831159 0.99469683, а не то что у тебя - то есть там более сложный алгоритм сглаживания нормалей (например они зависят от других полигонов).
Аноним 15/05/21 Суб 14:52:34 743320255
1498470194211.jpg 10Кб, 482x168
482x168
>>743311
>У треугольника одна нормаль, а не три разных в каждой вершине. Если у тебя в разных углах треугольника разные нормали - то это не нормали, а какие-то абстрактные числа одну тебе известным способом полученные.
АКШУАЛЛИ, нормали как раз у каждой вершины. Именно это позволяет выбирать между четкими углами (это когда просто все нормали вершин треугольника параллельны друг другу) и сглаживанием (когда все как нибудь усредняется)
Аноним 15/05/21 Суб 20:18:11 743368256
>>743311
> Понятнее спрашивай, где у тебя координаты, где нормали
Ты ёбнутый? Ты не знаешь что нормали обычно нормализованы?
Настройки X
Ответить в тред X
15000
Макс объем: 40Mб, макс кол-во файлов: 4
Кликни/брось файл/ctrl-v
Стикеры X
Избранное / Топ тредов