Рисуй треугольник! Треугольник сам себя не нарисует!
Спрашиваем, сами же решаем проблему, сами же отписываемся. Постим книжечки, гуглим, учим математику. Посылаем нахуй за легаси. Читаем шапку перед тем как задать очередной тупорылый вопрос.
Перекатил чтобы задать вопрос. Пишу ray casting игру на sdl2, но увы, она не тянет 7к полигонов даже на этапе поиска пересечений. Посмотрел на glsl и это то, что мне нужно - описываешь входные вектора, что-то с ними делаешь и возвращаешь выходные. Но проблема в том, что все гайды, которые я видел, рисуют треугольники а не проводят вычисления на видеокарте. Я бы хотел загрузить все полигоны в видеопамять и когда нужно, запускать glsl код, который будет принимать лучи, а возвращать координаты пересечений лучей с полигонами, чтобы я через sdl2 наложил текстурки. Как это сделать?
>>678946 > Я бы хотел загрузить все полигоны в видеопамять и когда нужно, запускать glsl код, который будет принимать лучи, а возвращать координаты пересечений лучей с полигонами, чтобы я через sdl2 наложил текстурки. Как это сделать?
Тебе скорее всего надо надо треугольниками оперировать, а мешами (наборами треугольников). Лучи пересекают меш - записываешь в какой-нибудь массив baseVertex этого меша, а потом glDrawElementBaseVertex где последний аргумент и есть тот baseVertex
Хотя это уже не рейкастинг совсем Короче, проще найти готовый пример
>>684868 Кстати двачую - была идея переименовать в тред графических технологий (сразу для всех opengl/directx и других api), и чтобы тут же разбирались детали реализации всяких теней/отражений. Тред отдельно по opengl не нужен.
Для Opengl pipelines (glGenProgramPipelines) можно задавать отдельно стейты вроде блендинга, куллинга и т.д., как в вулкане или эта шняга только для шейдерных стадий. Рендер стейт по прежнему один и глобальный?
>>678946 Вычисления на видеокартах с помощью шейдеров называется GPGPU. Гугли opengl gpgpu example или типа того. А вообще для вычислений на картах нормальные люди используют openCL или cuda если поддерживается.
>>686156 >openCL Выдаёт на 30% меньшую производительность, чем вычислительный шейдер. Можно просто один в один скопировать код и размеры всяких рабочих групп. Это было на древней нвидия-карточке десятилетней давности, и я думал что это просто потому что opencl был в новинку - но даже на свежей карточке прошлого года со свежим драйвером такой же результат.
Антуаны, а где почитать по пайплайну? Мне нужен форвард/деверенд, шобы заебись было, но я в душе не ебу где про это читать. А может кто-то за меня написал отдельную либу пайплайна? Или нужно воровать код у существующих движков?
>>686169 Ну, зависит от задачи, и одинаковый код не факт что будет хорошо работать и там и там. Для СЛ-я мб эффективнее юзать какие-то встроенные функции.
>>686173 Было бы интересно посмотреть хоть на одну задачу, где cl выдаст более хорошие результаты. Там даже матриц вроде как нет и нужно вручную их делать.
Ну что, треугольниковёрты? Нашли уже работу мечты? Разрабатываете ли моднейший кластерный рендерер на вулкане? Пишите ли будоражащие вайтпаперы для сигграфа? Похвастайте хоть.
>>706914 > смывов Нихуя я косой, сразу не заметил, а теперь и не знаю, что за слово должно было быть. Короче - только cg и оправдывает унылое байтоёбство.
>>706914 Что оправдывающая? Тебе нравится смотреть на вращающийся кубы? Оргазм получаешь? Или тебе нравится делать свой велосипедный движок и смотреть как коряво он работает? Тоже наслаждение внеземное получаешь ? (ты ведь сам его сделал! Какой ты молодец! И совсем не говно получилось!)
>>707042 Всё так: люблю вращать кубы и руками собирать сраные икосаэдры, покрывать их жырным слоем кривых шейдеров с циклами и динамическими ветвления ми. Густо поливать подливой теней с алиасингом и акне, медленным ссао и шумными фейковыми отражениями. А разве вы не любите?
Пишу по туториалу, там у чувака не GLFW, а у меня GLFW. Он начал писать профайлер, у него время кадра меньше миллисекунды, а у меня - 16 мс. Этот фреймлок в ОпенГЛе выставляется или в GLFW?
Управление ресурсами. Кто как задумывался над этим? Самый простой способ это делать классы текстур, буферов, шейдеров и тд. Но потом придётся думать над копированием и уничтожением объектов. А тут как-то раз решил почитать исходники месы (драйвер свободный для графики) и натолкнулся на мысль, что управление ресурсами можно попробовать не раздавать разным классам, а делать всё в одной (GLContext или типа того). Он же может и следить также за учётом ссылок.
>>710982 У меня в графическом движке есть просто структуры (классы) для текстур, которые содержат указатель на данные и их формат (ширина, высота, байт/флоат). Когда используется опенгл-бекенд, он на лету подхватывает текстурки и если у них нет GLuint текстуры, то генерирует и юзает её. При удалении текстурки вызывается коллбек опенгл-бекенда, удаляющий GLuint имя текстуры.
Как вкотиться из дженерик байтоёбство в пиксельебство? Написать свой разудалый говнофреймворк с парой тройкой модных технологий и форсить на собесах гитхабом? Дрочить теорию и надеяться, что проскочишь, а там какнить втянешься?
>>712359 Пушто некоторым тяжело работать в столь абстрактной сфере, как программинг без визуализации своих трудов. Кому-то норм херачить в банках и перекладывать цифири в бездонных бэкэндах. Кому-то прельстиво, если их код имеет визуальный результат. Если персонально: работал над десктопными приложениями для отображения инфы аля убогий ГИС. И в бекенде работал. Второе невероятно печальнее, хоть и понимаешь, что дело может и даже более полезное, чем первый случай. Такие дела, байтаны.
>>712395 Ты хочешь поменять одно низкоуровневое говно на другое. Сказано же, что в вулкане надо 1000 строчек, чтобы треугольник нарисовать. По-твоему это весело?
>>712406 >Сказано же, что в вулкане надо 1000 строчек, чтобы треугольник нарисовать Только это не правда. 1к строк кода - создают устройство, проверяют технические фичи, создают слои, и т.д. и т.д. То есть не имеют никакого отношения к выводу треугольника
>>712407 Тем не менее, человеку с опытом в бэке (востребованном и хорошо оплачиваемом) вкатываться с нуля в область сложную и не нуждающуюся в большом количестве кватывальщиков, как-то не разумно.
>>712411 Если хочешь не сойти с ума от выжигания глазонек, то в один непрекрасный момент придётся задуматься о выборе денежка vs уровень радости от работы. Зря чтоль об этом вашем выгорании столько написано.
>>712429 Я считаю, что выгорание происходит не от того, чем ты занимаешься, а от того, насколько интенсивно ты этим занимаешься, и таким образом выгореть можно от чего угодно, хоть от байтоебства, хоть от типа "творческой" 3д графики. >Зря чтоль об этом вашем выгорании столько написано. А сколько еще написано о рабах геймдев индустрии, перерабатывающих сверх нормы за несопоставимо низкую зарплату.
>>712441 Так за гейдев я и не радею. Есть более практичные сферы, связанные с визуалом типа тренажёрных систем. Проблема, что таких продуктов на порядок меньше перекладывания чиселок.
>>712479 Работаю в таком, задачи действительно интересные, как по мне. Единственное что раздражает это требования по поддержке довольно древнего железа.
Бтв насчёт того что визуальный результат приятнее не согласен. Базы данных/распределенные хранилища(и другая байтоебля) тоже очень классно, хотя опыта у меня в этом у меня меньше. Мне кажется в бекенде скучно делать какую-нибудь бизнес логику, бесконечное прокидывание всякого от бека к фронту. Ещё у меня ненависть к парсерам, но кому-то вроде нравится...
>>712548 Хз, изучаешь то что интересно, подаешься на вакансии куда интересно, если нет привычки решать задачки на время может быть полезен литкод или аналоги
Пилю скелетную анимацию, возникли проблемы с моделями для теста. У меня нет пока загрузчика, а писать свой крайне лениво до момента, пока не получу рабочий код постановки меша в позу
Где можно взять простую заскиненную модельку + скелет из пары костей в читабельном для человека виде для отладки?
Допустим я рисую одну картинку просто треугольниками, а вторую генерирую фрагментым шейдером при помощи реймаршинга, вместе с depth буффером. Как мне наложить вторую картинку на первую, используя её depth-буфер?
>>718387 Как ты пишешь в depth buffer? Это условный буффер, то есть просто текстура или АПИшный depth buffer?
>Как мне наложить вторую картинку на первую, используя её depth-буфер? Просто рисуй дополнительным проходом и используй в нем картинку реймарчинга в качестве текстуры и сэмплевай с нее. Я не знаю на сколько у тебя там сложная сцена, но вообще ты это можешь одним проходом рендерить. После того как отрисовал основную сцену, следует дравкалл квада для реймарчинга. В этом случае не надо к нему текстуру привязывать, а можешь сразу в фрагмент шейдере реймарчить. При этом читай актуальную глубину пикселя из до этого отрисованой сцены и сравнивай ее с глубиной куда попал реймарч. Если глубина меньше, заначит рисуешь пиксель реймарчинга, а если нет, то просто пропускаешь пиксель с discard;
>>718387 Еще забыл добавить: Перед дравкаллам квада для реймарчинга отключи тест глубины с glDisable(GL_DEPTH_TEST), чтобы не было проблем с рисованием поверх. Глубину ты и так сам в фрагмент шейдере тестишь. Потом в цикле перед основной сценой не забудь снова включить glEnable(GL_DEPTH_TEST).
У меня вопрос, допустим нужно нарисовать тайл пикрил без сглаживания. Если его рисовать методом обычного спрайта в виде квадратной сетки вершин, то он рисуется нормально, если же сетка вершин будет подогнана под форму, то на краях образуется сглаживание краёв. Вопрос как сделать чтобы нормально он рисовался без сглаживания? Сделать сетку на 1 пиксель больше? И вообще интересно насколько оптимизация по форме спрайта влияет на производительность?
>>718651 Что у тебя там сглаживается? MSAA что ли включил? Или ты хочешь типа пиксель-арт стайл? Тогда в функцие glTexParameteri() поставь у мин и маг фильтра последний параметр на GL_NEAREST вместо GL_LINEAR. Сделай скриншот, так будет понятнее, что у тебя там не так.
>>718764 Пока не занимался этим. Я просто не сразу подумал, что можно сразу в реймаршинг-шейдере глубину проверять. Через gl_FragDepth или юниформить текстуру с глубиной в шейдер, потом разберусь и, может, скриншот выложу.
Вообще я хотел для своей следующей игры вокруг некоторых объектов сделать полупрозрачные сферы и другие объекты, между которыми происходит smooth union и они слипаются.
>>718764 Сделал. Конечно, офигел от этого всего, джва часа разбирался куда что прикрепить. В связи с особенностями моих графического и ГУИ движков сделал так: рендерю в квадрат, закрывающий весь экран реймаршинг сцену, при этом передаю ей текстуру, в которую срендерил depth buffer основной сцены. Зато теперь можно сделать красивые эффекты. И вообще, я раньше не думал о том, что можно вот так миксить быструю опенгл-сцену и красивую реймаршинг-сцену.
>>719497 Прикольно смотрится. Можешь еще немного фонга на эти сферы добавить. Нормали сферы в реймарчинге легко высчитываются: точка поверхности - центр сферы = вектор нормали. А дальше фонг шейдинг как в обычном шейдере.
>И вообще, я раньше не думал о том, что можно вот так миксить быструю опенгл-сцену и красивую реймаршинг-сцену. Ну собственно еще есть компьют шейдеры, в которых можно сложные эффекты просчитывать, а потом совмещать с обычным фреймбуфером, в том числе реймарчинг и рейтрейсинг.
>>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)); }
>>720016 >И в реймаршинг же нормали вычисляются одинаково для всей сцены То что я панисал, это быстрое решение для обычной сферы. А твоя жирная функция с шестью сэмплами высчитывает нормаль с помощью градиента. Ну для сложной геометрии только так, да.
Не по теме: у тебя камера дерганая из-за резких движений мышки. На видео это не приятно смотрится в качестве презентации. Для плавного передвижения камеры ты можешь добавить управление аналог-стиками геймпада. Или для клавомыши захуячить свой алгоритм сглаживания движения камеры. Мы же любим свои велосипеды писать, правильно? :)
Вопрос по поводу матриц, где их лучше считать? Просто у меня вычисления в коде и в шейдер передаётся уже итоговая матрица, у других же наоборот, в шейдер передаются несколько матриц и они там считаются.
>>720419 Твой вариант лучше, т.к. видеокарта не считает n раз одну и ту же матрицу, берет готовую. Обычно у других матрицы комбинируются по всякому и их для этого передают раздельно
Изучаю 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. Как биндить текстуру в нужный текстурный слот на моей версии?