Вы видите копию треда, сохраненную 23 сентября 2018 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Треугольник сам себя не нарисует!
Спрашиваем, сами же решаем проблему, сами же отписываемся. Постим книжечки, гуглим, учим математику. Посылаем нахуй за легаси.
Добро пожаловать. Снова.
Архив:
http://arhivach.org/thread/28624/ - 1
http://arhivach.org/thread/47586/ - 2
http://arhivach.org/thread/64117/ - 3
Документация:
https://www.opengl.org/sdk/docs/man3/ - OpenGL 3.3
https://www.opengl.org/sdk/docs/man4/ - OpenGL 4.5
https://www.opengl.org/wiki/Main_Page
http://docs.gl/
Тьюториалы:
> OpenGL
http://www.learnopengl.com/
https://code.google.com/p/gl33lessons/
https://triplepointfive.github.io/ogltutor/index.html
http://opengl-tutorial.blogspot.ru/
http://www.opengl-tutorial.org/
http://www.tomdalling.com/blog/category/modern-opengl/
http://www.lighthouse3d.com/tutorials/glsl-tutorial/glsl-core-tutorial-index/
https://en.wikibooks.org/wiki/Category:OpenGL_Programming
> Математика
http://www.rossprogrammproduct.com/translations/Matrix and Quaternion FAQ.htm
http://www.gamedev.ru/code/articles/faq_matrix_quat
http://www.gamedev.ru/code/articles/?id=4215
Библиотеки:
> Контекст
https://www.libsdl.org/
http://www.glfw.org/
http://www.sfml-dev.org/
> Загрузка текстур
https://www.libsdl.org/projects/SDL_image/
https://github.com/nothings/stb
http://gli.g-truc.net/0.7.0/index.html
> Математика
http://glm.g-truc.net/0.9.7/index.html
> Расширения
http://glew.sourceforge.net/
Книги:
> OpenGL
http://rutracker.org/forum/viewtopic.php?t=5047442 - Superbibile 7 (вышла летом)
http://www.amazon.com/OpenGL-Shading-Language-Cookbook-Second/dp/1782167021/
http://www.amazon.com/OpenGL-Programming-Guide-Official-Learning/dp/0321773039/
> Математика
http://sernam.ru/book_mm3d.php
http://www.amazon.com/Math-Primer-Graphics-Game-Development/dp/1568817231
http://www.amazon.com/Mathematics-Programming-Computer-Graphics-Edition/dp/1435458869
Полезные ссылки:
http://tfc.duke.free.fr/
http://tfpsly.free.fr/bookmarks.html
https://www.youtube.com/user/BSVino/playlists
https://www.youtube.com/user/thebennybox/playlists
В шапке, на мой взгляд, должна быть общая информация без какой-то конкретизации.
Но если нет, то такой вопрос: какую версию используете на коммерческих проектах? Я вот сижу на 3.2 и думаю — не слишком ли жирно? Алсо, на говнокарты от интел уже завезли нормальные драйвера?
> Я вот сижу на 3.2 и думаю — не слишком ли жирно?
А может быть наоборот?
3.2 вышел 6 лет назад.
>6 лет назад
Да кажись вообще 7-8. Но моя стационарная пека больше не поддерживает. При этом комфортно играю на ней в игры до 2011 включительно на средне-высоких. Среди новых ААА игр с йоба графонием довольно мало годных, на мой взгляд, так что еще пару лет можно не апгрейдить. Я к тому, что среди ца, людей с такой же точкой зрения может быть довольно большой процент, только пеку они купили не в 2008или 2009, не помню, ка к я, а на год раньше.
Вот выкатят Vulkan, и OpenGL станет legacy весь.
Сегодня весь день пытаюсь запилить pointer lock. Пока работает только в полноэкранном режиме. И glfwSetMousePos не работает, видимо, придётся обрабатывать событие mouse move (на десктопе я привык просто получать координаты в цикле и ставить их в середину окна, естественно с выключенным GLFW_MOUSE_CURSOR)
На десктопе мне всё давно известно. Портировать готовый браузерный код на десктоп намного легче. Этим я займусь совсем скоро, когда смогу в браузере хотя бы просто БРОДИТЬ по миру.
Чет я не понял, ты пишешь дектопный код на с++, потом переводишь его в жс с помощью эмскриптен, а потом будешь назад переводить в с++?
Браузерный компилируется emscripten'ом, десктопный компилируется GCC.
Я пишу сразу браузерный код. Когда освоюсь в нём, сделаю порт на декстоп - потребуется не больше, чем пара #ifdef (например, в Emscripten для основного цикла есть своя функция, а десктопном варианте будет стандартный while (running) { ... }).
Например, сейчас я выяснил, что GLFW не очень хорошо поддерживается емскриптеном. Скорее всего перепишу на [free]GLUT/SDL. Не придётся делать это потом, когда будет уже много кода.
А ты какую версию glfw юзаешь?
У меня нету функции
> glfwSetMousePos
но есть
> glfwSetCursorPos
Вторую. Третья не работает, опять же, хотя поддержка есть.
Короче, я посмотрел эмулятор GLFW в емскриптене - на многих функциях просто заглушки. В HTML5 невозможно установить позиуию курсора, но я надеялся, что он хотя бы в эмуляторе имеет промежуточные переменные.
Придётся как-то преобразовывать абсолютные координаты захваченного курсора (они могу расти бесконечно) в координаты относительно последней обработки. Пошёл смотреть исходники всяких движков, портированных на webgl
Всё, решение найдено. Надо обрабатывать событие HTML mousemove (через API эмскриптена). Там есть movementX и movementY, содержащие значение относительно предыдущего такого события
Я умножаю каждую вершину(допустим, без шейдеров), как в обычном пайплайне, на матрицы. Scale->Rotate->Translate->View->Projection.
В итоге имею 4вектор, в котором последняя координата - флаг.
Теперь я должен рисовать эту вершину, используя первый и второй элемент(Х и Y)? Получается, третий элемент вообще не используется теперь?
Четвёртая координата - это глубина. Используется для отсечения невидимых поверхностей. Пока что автоматически, вручную ты будешь ей оперировать, например, при реализации прозрачности.
По поводу матриц - посмотри https://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Tutorial_05
Вообще, ты не прав. После умножения вершины на матрицы модели, вида и проекции у тебя по прежнему вектор положения в трёхмерном пространстве, только уже относительно камеры. Используя 3 координаты и глубину видеокарта уже рассчитывает положение на экране.
Матрица проекции отвечает, например, за перспективу. Более удалённые от камеры точки сближаются. Точно не скажу, какая это матричная операция, можешь глянуть код функций перспективы: https://github.com/g-truc/glm/blob/master/glm/gtc/matrix_transform.inl#L211-L399
>>195506
Таки на счёт четвёртой координаты яя ошибся
http://stackoverflow.com/questions/2422750/in-opengl-vertex-shaders-what-is-w-and-why-do-i-divide-by-it
Кажется, в прикреплённом треде тебе правильно ответили.
Установил себе вижуал студио, попытался в нём запилить лабораторку из универа - нихуя опенгл не пашет.
Попытался запилить на Qt - та же хуйня
Ругается или на библиотеки, или я даже хуй знает на что
Что там надо поставить чтоб оно нормально блядь работало без всяких выебонов?
там всё на хохляцком
в двух словах - треугольник, у которого цвета меняются и идут градиентом от одного угла к другому (разноцветный треугольник)
это типа самая первая, самая примитивная лаба
через месяц сдавать ему курсач - свою игру
а не только не совсем понимаю как её сделать, так ещё тупо и возможности нет, пиздец какой-то а не предмет
>нихуя опенгл не пашет
Каким образом не пашет? Вкидывай с++-код, шейдеры. Еще можешь попытать счастья в /pr, он побыстрее будет.
Утверждается, что можно в одном треде контекст отпустить, в другом принять и рисовать. Но что-то с такой системой заморачиваться неохота, даже для теста.
>все серьезные геймдевелоперы перевелись
Ты хотел сказать движкописатели? Серьёзные геймдевелоперы делают игры.
Массив элементов для каждого объекта пока отдельный, потому что я не нашёл, как можно отрисовать только несколько элементов из массива. Это вообще возможно?
В целом, подскажите, как лучше выделять память и хранить эти данные.
Я же написал
>Вроде как должно избавить от фрагментации памяти, да и на видеокарту так эффективнее отправляется.
Да чего эти массивы, по-твоему, придумали?
Я и говорю байтоеб. Между тобой и железом еще сидит драйвер, со своими понятиями. Вот ты думаешь дал ему указатель на данные в ram и они потекли по шине в vram? Нихуя. Пока не скажешь glFinish или SwapBuffers, драйвер имеет право курить бамбук. Все зависит от реализации.
Ты ебанулся? Для каждого объекта сделай свой массив вершин. Чего байты ебёшь-то.
пссц, юнити-дибил, не хочешь САМ РУКАМИ КОД ПОПИСАТЬ! Её просто еще не реализовали.
На примере перлин нойза из флэша помню, что в перлин нойз нужно передавать любое число, для целей рандома. Возможно у тебя похожая ситуация и тебе надо в какую-то глобальную переменную записывать какое-то псевдо-случайное число.
Что значит не реализовали?
https://www.opengl.org/sdk/docs/man/html/noise.xhtml
Где тут хоть 1 слово о том, что её не реализовали?
У меня есть переменная, которая содержит в себе прошедшее с запуска программы время. Она может подойти как параметр. Осталось передать его в функцию, которая не работает.
Это спецификация. Кто как хочет так её и реализовывает. Не хочет реализовывать нойз - не реализует. Вендор железа сам решает и никому не отчитывается.
Вендор обязан реализовать то что входит в объявленную им поддерживаемой версию стандарта.
Тащемта, это в директиксе так, а огл у каждого свой. Вспомни те же расширения из времён 1.1.
Правильно, а вспомни еще их префиксы и понятие core since.
> Вендор обязан реализовать то что входит в объявленную им поддерживаемой версию стандарта.
Пидарашьи вопли мамкиног опетуха. Иди и реализовывай. Я уверен, что ты даже на стажера в н-видиа не пройдешь.
Вроде и без него нормально получилось. Его нет в базе WebGL, только в расширении. Какие от него профиты?
Иначе вендор пиздит про поддерживаемую версию. Потому что версии определяются в основном именно принятием в них расширений. Сверх версии - пожалуйста, пили свои glYOBAStreamSparsedDataArrayBufferPointers.
В директхуе все просто? А сколько не-железячников в нем участвует? Точнее если не мелкомягкие, то кто?
Очередной типичный СНГ-максимализм из ничего. Вендор никому ничего не должен. И как может реализовать стандарт, так и реализовывает. Придумывая свои ext_ и прочее. Он тебе ничего не должен. Поэтому у нас и нет нихуя. Что всякие пидарасы вроде тебя не могут в рационализм. А хотят всё и сразу. НИ ОДНА ВИДЕОКАРТА НИКОГДА НЕ ПОДДЕРЖИВАЛА ВЕСЬ ВТАНДАРТ! НИКОГДА!
>>195848
> Но он все правильно сказал.
Нет.
Но тогда это означает, что оборудование тупо не соответствует стандарту.
Вот представь себе, ты купил мышку, вполне норм на вид, заводится с обычным HID-драйвером. А взяв в руку понимаешь, что у нее оси перепутаны. Кагбе на 90 градусов свернуты. Лезешь на сайт производителя, драйвер оттуда ставишь, получаешь тупые свистоперделки "100500 функций по нажатию на среднюю клавишу при ритмичном пошатывании колесика и попердывании в микрофон", а с осями проблема никуда не девается. Что это такое? КО-КО-КО-ПРОИЗВОДИТЕЛЬ-МНЕ-НИХУЯ-НЕ-ОБЯЗАН-БУДУ-РАБОТАТЬ-ТАК или производитель таки налажал?
Реально у меня такая мышка лежит, и к сожалению была распакована слишком поздно, чтоб вернуть в магазин.
Подозреваю, что ты в основном насиловал встроенные видеокарты в ноутах, там риальне всякие уродцы бывают, чего только стоит вообще идея разделяемой оперативки. А одно время даже на каких-то игорях писали "mobile-видеокарты не поддерживаются".
> оборудование тупо не соответствует стандарту
Манямирок абосраташа-юнити-петуха лопнул. Если я тебе скажу, что на консолях еще на asm пишут и железо гавняное, что приходится извращаться еще так. И на боксе и на пс3. Всё консольное железо и видеокарты - полное гавно. Было есть и будет.
_Boris Batkin at Naughty Dog_
Не буду сомневаться, что писать под сосноли процесс в принципе изъебистый и еще наполовину анально огороженный вендорами. Изъебистость его в основном вызвана тем, что 1) у каждой сосноли свой фиксированный набор железа, и если девелопер собирается выпускать игоря сразу на всем что под руку попадется, то ебля его кодомакак с кучей железа где у каждого гпу свои тараканы разумеется обеспечена; 2) желание запилить графон круче чем вчера, но на том же говне мамонта, что и позавчера, и это пожалуй основной генератор секса.
Ебать ты обосранец. Думаешь, кто-то будет играть в твоё говно в браузере? Нахуй тащить в браузер неприспособленные для этого вещи? Может, мне насрать тебе на лицо потому, что сейчас модно так делать среди тупорылых макак? Пиши нормальный, оптимизированный код под десктоп. Нет блядь, я сожру гигабайты оперативки и высру говно с графоном хуже, чем в 1997 году, при этом это говно будет тормозить сильнее третьего крузиса, но зато ЕБАТЬ Я МОДНЫЙ ДЕВЕЛОПЕР У МАМЫ, ТРИДЕ, В БРАУЗЕРЕ, СМАТРИТИ ВСЕ!!!11
Веб зашёл в тупик в тот момент, когда js-макаки внезпно решили, что они тоже у мам программисты и устроили пир во время чумы, запихивая в браузер абсолютно всё говно, не приспособленное для этого.
Ты ебанутый? Что ты там оптимизируешь, блядь? Очнись, нахуй, твой говнокод транслируется в жс-дрисню, это говно по определению не может быстро работать, там нечего оптимизировать.
Луддит сука штоле? Вебгл есть, значит кому то это нужно. Само 3д в браузере тормозит не больше чем на десктопе, узкое место это жс, т.е. физика, а она не нужна для браузеродрочилен. В итоге получаем идеальную мультиплатформу, не нужна ни анальная жава, ни моно, ни анус твоей мамки - только браузер, а он стоит на любой микроволновке и на радость детям выводит трехмерные кубы прямо по соседству с вкладкой порнотьюба. Прогресс не остановить, мудак ты тупой.
>трехмерные кубы
>прогресс
Проснись, ты обосрался.
Массивы вершин, текстуры хранить/сортировать/обновлять ты где собрался? Не в тормозной js-дрисне? Или ты думаешь, что все данные сразу же волшебным образом попадут в гпу?
Это говно не нужно никому, кроме мамкиных отрисовщиков кубов и цветных треугольников, и прогресса в этом не больше, чем в пожирании говна только потому, что кто-то заикнулся, что так модно.
Разуй глаза, в соседнем треде обсуждают уе4 где сцена БЕЗ ВСЕГО дает 10 фпс и это считается нормальным, плюсы ёба, безграничные возможности. А человек с мозгами сможет написать быстрый код и на жс. Никто не говорит что браузер не потянет крузис 4, такие игры для веба нет смысла пилить. Зато для индипараши как замена флешу - то что надо. Пиздуй на порталы популярных вебжл либ и смотри примеры, диванный кармак блядь, там отнюдь не одни кубы показывают и нихуя не тормозит.
Спустил тебе на лицо, а потом в туза выебал.
Что только не придумают скриптомакаки, лишь бы не учить нормальные языки и при этом ощущать себя нормальными программистами. Ассемблер в браузере - это как подрочить, стоя на одной руке вверх ногами, и кончить себе в рот при этом. Круто, конечно, молодцы ребята, но нахуй никому не нужно, кроме пары конченых извращенцев.
>Само 3д в браузере тормозит не больше чем на десктопе, узкое место это жс, т.е. физика, а она не нужна для браузеродрочилен.
Кстати, физику переносят на GPU с помощью шейдеров.
>Никто не говорит что браузер потянет крузис 4, такие игры для веба нет смысла пилить.
Вопрос времени.
Что же тогда в твоем представлении жаба?
Тащемта жаваскрипт уже давно комилируется всеми браузерами на лету в нативный код. В противном случае у тебя бы даже ютуб не запустился.
Жаваскрипт код скомпилированный Emscripten работает в некоторых браузерах всего в 2 раза медленее С++ кода и быстрее жавы.
Я НА АСЕМБЛИРИ ПИШУ Я КРУТОЙ И УМНЫЙ ПРАГРАМИСТ ПАНЯТНА?
Да-да, мы все тебя услышали, можешь больше не кукарекать.
НА АСМ.ЖС КАРОЧИ В БРАУЗИРЕ ПИШИШЬ И ВСЁ В ГПУ ХРОНИШ ПОНИЛ? АПИРАТИВКА ВОЩЕ НЕ РАСХОДУЕТСЯ НИТАРМАЗИТ 200 ФПС ВЫДАЁТ КАК В КРУЗИСЕ
Пиздец ты тупой.
Иногда даже страшно становится от того, какой беспросветный пиздец творится в головах js-макак.
Конечно, ютуб работает именно на джаваскрипте, который на лету компилируется в машинные коды и проигрывает тебе видео. Не сомневайся. Даже не задумывайся о том, что сервер шлёт сырые данные, которые затем проигрываются ядром браузера с помощью кодеков, написанных на сишке. Жаваскрипт работает медленнее всего в два раза, не сомневайся. Даже не задумывайся о том, как оно всё устроено внутри, как работает компьютер, зачем нужен кеш процессора и что такое браузер, что такое блокирующий/неблокирующий ввод/вывод, какие вообще могут быть узкие места у программы. Вообще старайся не думать, думать вредно, пусть разработчики браузера за тебя думают, они умные дяди. Просто пиши на жаваскрипте, думать не надо.
Если используешь OpenGL 3.0+, то гугли vertex buffer object, а если нет, то страдай нет, правда, зачем использовать старые версии?
>Пидарашьи вопли мамкиног опетуха
>Очередной типичный СНГ-максимализм из ничего
>Манямирок абосраташа-юнити-петуха лопнул
>Ебать ты обосранец
>Ты ебанутый?
>Проснись, ты обосрался
>Сыкнул на вас, на таких опущей
>Спустил тебе на лицо, а потом в туза выебал
>ты очень тупой
>Пиздец ты тупой
Похоже, в гд пополнение порваток.
Сосач может в конструктивную беседу, но не может не перемешать ее с говном и хуями.
Проиграл на всю хату.
Так и будет.
Ее никто не реализует.
О тебе заботятся, дурилка глупая. Чтобы ты не падал в обморок когда, не только текстуры везде по разному накладываются, но и нойз имеет разную реализацию и хитрые баги.
Сделой его сам, это просто.
ФПС 20 надо чтоб было.
Почему бы сразу через webgl пилить, а не ебаться?
Я вообще-то программист, а не макака. Пишу на С++, оптимизирую всё, чтобы быстро работало. На жс нельзя оптимизировать.
То есть ты серьезно думаешь, что если ты напишешь на С++, а потом переведешь в жс, то оно будет работать быстрее, чем если б ты сразу на жс писал?
В ams.js
>>196178
Так-то да
>>196173
JS можно оптимизировать. Можно даже asm.js-код вручную писать. Но это очень муторно. Вот пример asm.js кода: https://gist.github.com/jeresig/5293608 Как на ассемблере писать вручную. Вдобавок, в дальнейшем, если WebAssembly победит asm.js, можно будет его использовать как целевую платформу - код не изменится
>>196179
Неинтересно
Несложно было догадаться по приложенному скрину. Надеюсь научиться моделлить и рисовать в процессе.
Учиться делать игры с написания движка, это как учиться писать книги создавая печатный станок. Ты уж выбери что-то одно
Давай ты съебешь в /pr/
Ну будет твоя параша компилироваться сразу в псевдо-байткод, охуеть теперь. Получишь speedup в 20-30%. Учитывая то, что оно все еще запускается на виртуальной машине, использует сборщик мусора и т.д., твой движок будет супер тормозным. Это конечно не мое дело, каждый дрочит как хочет, но ты реально долбоеб.
>asm.js
>компилироваться сразу в псевдо-байткод
>оно все еще запускается на виртуальной машине
>использует сборщик мусора
Твоя тупизна непробиваема
В последний раз отвечаю тебе, даун, только чтобы у читающих не возникло сомнений в твоей тупизне:
http://asmjs.org/faq.html
>Q. Does the fact that asm.js is JavaScript mean you can't get predictable performance?
A. An ahead-of-time (AOT) compiler for asm.js can generate code with very predictable performance, because validated asm.js code is limited to an extremely restricted subset of JavaScript that provides only strictly-typed integers, floats, arithmetic, function calls, and heap accesses.
>Q. Can asm.js serve as a VM for managed languages, like the JVM or CLR?
A. Right now, asm.js has no direct access to garbage-collected data; an asm.js program can only interact indirectly with external data via numeric handles.
> https://gist.github.com/jeresig/5293608 Как на ассемблере писать вручную.
Это по-твоему ассемблер? Обычный js-код где немного поебывают байты. Могу написать x / 2, а могу x >> 2, но от этого код ассемблером не становится. Раздел где делают игры, я ебал.
никакого ассемблера там нет
поскольку это с++ транслированный в жс, то теоретически можно сделать обратное в жс движке браузера для оптимизации. в этом собственно вся суть
Ну ты реально конченый чмошник. С твоей же ссылки:
>Q. Is asm.js a new language?
>A. No, it's just (a subset of) JavaScript.
>asm.js code is limited to an extremely restricted subset of JavaScript that provides only strictly-typed integers, floats, arithmetic, function calls, and heap accesses
А если вкратце, то ПСЕВДО-БАЙТКОД. Который потом исполняется на V8 или любом другом интерпретаторе.
Ну и еще:
>Q. What kind of performance benefits can I expect to get with asm.js?
>A. It's early to say, but our preliminary benchmarks of C programs compiled to asm.js are usually within a factor of 2 slowdown over native compilation with clang. We will publish more benchmarks as we collect them.
Короче, удачи с написанием производительного движка, хуесос.
>А если вкратце, то ПСЕВДО-БАЙТКОД.
какой еще байткот? цитата значит только то, что 99% жаваскрипт функций использовать низзя, иначе это будет "ненастоящий" asm.js. Вот и все.
Гугли как работают интерпретаторы, и тогда поймешь почему эту хуйня — это типа байткод.
У них даже в факе есть соответствующий вопрос:
>Why don't you specify a bytecode syntax instead of strange JavaScript idioms?
Их ебанутый фак составлен в аспекте ОЛОЛО МЫ ПРИДУМАЛИ НОВЫЙ ЯЗЫК ДЛЯ ВЕБА.
хотя на самом деле это просто вспомогательная библиотечка для компилятора с++ в жс
Я сейчас немного занят, чтобы копаться в твоем коде, поэтому я просто выкладу как делал я, возможно оно тебе поможет.
И так, матрица которую передаем в шейдер:
m_WVPMatrix = m_projMatrix m_camera->getViewMatrix() m_worldMatrix;
Тут:
- матрица проекции
m_projMatrix = glm::perspective(45.0f, 1.33f, 1.0f, 10.0f);
как и у тебя, походу;
- матрица вида (камеры), считается так
m_viewMatrix = glm::lookAt(m_position, m_target, m_up);
ты, как я понял, крутишь камеру вручную матрицами
- мировая матрица (положение объекта в мире, для каждого объекта своя в отличие от двух первых)
m_worldMatrix = trans_matrix rotZ_matrix rotY_matrix rotX_matrix scale_matrix;
соответственно матрицы из которых она собирается:
--- масштабирование
glm::mat4 scale_matrix = glm::scale(glm::mat4(1.0f), m_scale);
--- поворот
glm::mat4 rotX_matrix = glm::rotate(glm::mat4(1.0f), m_rotation.x, glm::vec3(1.0f, 0.0f, 0.0f));
glm::mat4 rotY_matrix = glm::rotate(glm::mat4(1.0f), m_rotation.y, glm::vec3(0.0f, 1.0f, 0.0f));
glm::mat4 rotZ_matrix = glm::rotate(glm::mat4(1.0f), m_rotation.z, glm::vec3(0.0f, 0.0f, 1.0f));
--- перенос в пространстве
glm::mat4 trans_matrix = glm::translate(glm::mat4(1.0f), m_translate);
Надеюсь, чем нибудь тебе это поможет, удачи тебе анон.
сука, разметку проебал, короче там где шрифт меняется с обычного на курсив и назад должно быть умножение
а, думаю что и так очевидно, но на всякий случай - m_scale, m_rotation и m_translate - это glm::vec3 содержащие информацию про масштабирование, поворот и сдвиг объекта по/вокруг осей х, у, z соответственно
Спасибо! Посмотрев твой код, я понял, что можно вместо translate относительно матрицы MVP сделать translate относительно единичной,а потом MVP умножить на результат (надо бы освежить в памяти теорию по матрицам).
Свет теперь рассчитывается правильно.
Хуесос не знает, что до третьей версии VAO означал совсем другую вещь. Еще ты, наверное, не знаешь, кто по средам твою мамашу поебывает.
Зачем?
Непонятный для меня момент - это шейдеры и шейдерные программы. Я уже столкнулся с необходимостью в нескольких шейдерных программах (текстурированные объекты, цветные объекты, интерфейс). К чему должна относиться шейдерная программа? К модели? Как тогда быть с интерфейсом, который моделью являться не будет?
Пока что планирую захардкодить три упомянутые шейдерные программы, реализовать интерфейс, добавить сложности в сцену, и после уже решить. Но буду рад любому совету. Также подскажите несложные движки с хорошим кодом, чтобы посмотреть, как там сделано.
Открой для себя three.js.
1) берешь готовый. Например Ogre или Cocos2d, godot.
2) Смотришь как сделано там.
Скорее всего ты ничего не поймешь и у тебя выйдет обычной
vector<Object> v;
while(true) { game.input(dt); freach() {v.update(dame, dt); v.render(game, dt);} }
Ты убьешь кэш и у тебя будет 1.5 fps
> Непонятный для меня момент - это шейдеры и шейдерные программы
Это вообще пушка. Самая сложная-пресложная и рискованная часть - непонимат.
>у тебя будет 1.5 fps
У меня 60 фпс, и то это искуственное ограничение. Что я делаю не так? Не занимаюсь преждевременной оптимизацией?
>рискованная часть
Ты не любитель тестов, да?
Скринов полон тред. Я к тому, что пока не даже сцены как таковой. Об оптимизации тут и речи быть не может.
>Ты хотел сказать render sandbox'ов?
Я имел ввиду автоматизированное тестирование. Обычно я пишу тесты до кода, но опыта в С++ и в игровых движках у меня мало, и я даже не представляю, как можно их тестировать. Но планирую приступить к написанию тестов как только архитектура более-менее устаканится
Почему бы не использовать рендер в текстуру?
>архитектура движка
>классы
>наследование
Лоооол. Просто пушка. Я знал, что ты меня не подведешь.
>Ogre
Кстати, Ogre довольно хуево написан, за остальные не скажу.
Я чайлды сделал так - Transform хранит родителя, при доставании координаты складывает с родительской, и так рекурсивно пока не упрётся в конец дерева.
Для шейдеров/текстур запили объекта материала, как в юниче. Для интерфейса вхардкодь какой-нибудь убершейдер с ползунками, лол.
>архитектура движка
>классы
>наследование
Думаю, это типичные вопросы, возникающие у неопытных в плюсах и геймдеве разработчиков. А я и не претендую - я пишу сейчас это чтобы кресты выучить.
>gamedev
>TDD
Я не предлагал использовать этот подход в гд. Я спросил, как можно автоматизировать тестирование неизолированных сущностей, которые юнит-тестированию не поддаются.
И таки я вижу применение TDD в геймдеве - например, если стоит задача оптимизировать какое-томесто в движке, то первым делом следует написать тесты производительности (а как иначе ты её замеришь?)
А как вообще пишутся тесты и как они применяются?
Много слышу о них, но как-то гайда для тупых не нахожу.
>Я чайлды сделал так - Transform хранит родителя, при доставании координаты складывает с родительской, и так рекурсивно пока не упрётся в конец дерева.
Надеюсь, ты сохраняешь значение, чтобы если у объекта несколько дочерних, для каждого не пересчитывать
>Для шейдеров/текстур запили объекта материала
А в формате md5mesh шейдер указывается для модели. Правда этот формат и не умеет хранить материалы. Так что, наверное, так и сделаю, как ты сказал.
>К чему должна относиться
У тебя должен быть отдельный класс для какждого чиха. Не делай из движка неперевариваемую вермишель.
В тестирование на С++ я не вникал. Утилит полно, например, классическая Check. Надо смотреть гайды по конкретному инструменту. А по общем принципам тестирования целые книги есть.
У мен итак есть класс шейдерной программы (и для шейдера отдельный). Я хотел узнать, какова логика смены шейдерных программ.
Кстати, где можно почитать что-то внятно аргументированное об этом?
>убьешь кеш
>пилит движок на джавадрисне
Какой кеш? Там в любом случае будет 2 фпс, когда объектов на сцене будет больше пяти.
Пишу на некроноуте, который поддерживает максимум эти версии. Игрушка несложная будет, в 2d, в принципе, много фич мне и не надо. Хочу получить core профиль без deprecated функционала. Как обстоят дела с языком шейдеров у gles 2? Сильно отличается от opengl 2/3? Стоит оно того или нет?
GLES 2.0 суть то же самое, что GL 4.0 кокрастыке без депрекейтед фич. Все ограничения GLES 2.0 легко обходятся.
GLSL такой же, единственное, что нужно - это писать точность переменных в шейдерах (highp, lowp и т.д), а так никаких отличий.
Единственное, в чём я сомневаюсь - взлетит ли глес2 на винде, ни разу не пробовал ещё.
Кек. Я ееешку откопал нахаляву, на ней только 1.5 поддерживается. Думаю: принять челендж или нахуй послать.
>DX9
Для меня кросс-платформа во главе угла, сам под линуксом прогаю. Под шином планирую только компилять шин-версию.
Под линуксом ES работает, видеокарта - встроенная Intel.
>>196761
А я про винду и не задумался даже, под линуксом всё норм взлетело сходу, думал, что и под шином будет норм. Надо будет попробовать.
Нахуя? Тебе дали трансформейшен матрицу, нет блядь, хочу вьюпорт туда-сюда двигать.
нет, недорогая, это обычное матричное преобразование
хоть евсь стек матриц преобразованиями забей, производительности похуй
В OpenGL ES нет стека матриц. Там вообще нет матриц
>Почему тогда не убрали glViewport из OpenGL ES?
Прост шоб был.
>Все остальные матричные операции выкинули
И хорошо. Программируемый пайплайн наше фсё.
Слушай, побереги свои отчеты о разработке до следующего раза. Пишешь ты, а стыдно мне.
Ты че он же на плюсах и ассемблере пишет, ты радоваться должен.
Ну это вообще пушка.
Завезу, когда сделаю скелетную анимацию, ибо сейчас надо разобраться с мешами и обектами - понять, кому какие данные нужны для рендеринга, и на основании этого строить классы и их отношения.
Я вот заметил, что кости скелетной анимации и объекты сцены - суть одно и то же: имеют родительский объект и дочерние, матрицу трансформации относительно родителя и локальную. Стоит ли их делать одной сущностью (или потомками одной сущности)?
Это отсылка к /gd/
gluErrorString охуеть какой информативный метод. Недопустимая операция, вот это да! А почему gDEBugger ничего не ловит? Непонимат.
Спектр возможных причин очень широк и выловить такую хуйню, судя по моему опыту, очень сложно.
У меня, например, была такая ситуация: в одном месте я вместо glGenVertexArrays написал glCreateVertexArrays, которые совершенно идентичны за исключением того, что последнюю ввели в стандарт только в 4.5 версии. А я таргетил 3.2. Поэтому неудивительно, что почти на всех компах, кроме моего, моя поделка крашилась. И даже тут интересно: мой комп поддерживает только 4.2 версию
Отправил версию, в которой пишется номер строки, на которой нашлась ошибка. Алсо, нельзя ли настроить gDEBugger, чтобы он проверял совместимость с другими версиями OGL? Было бы здорово.
Охуенный совет, ваще.
Мой движок ориентирован на десктопы, не буду же я пилить новый движок за 2 дня до батиного праздника.
Я понимаю. Просто ничего подсказать не могу, вот и выебываюсь.
А вообще, если хочешь, могу глянуть твой код незамыленным взором (запустить вряд ли смогу, у тебя же винда-only?)
>Стоит ли из-за этого вкурить современный ogl
>или взять какое-нибудь простое средство уровня sdl/sfml
А где связь? sdl/sfml создают тебе окно с контекстом и обрабатывают ввод. А версия gl зависит от того, что поддерживает видеокарта и какие драйвера стоят.
Библиотеку я бы посоветовад glfw. А ogl конечно бери 3.0+, уже не осталось, наверное, компов, которые хотя бы его не поддерживали. Хуле с легаси ебаться
У сдл/сфмл есть свои упрощенные функции для рендеринга, вот где связь.
>>197598
Начни с одной из двух библиотек. Если возможностей окажется мало, то сверху напишешь свой OpenGL-рендерер и будешь его вызывать. Можешь сразу написать класс-обертку над sdl/sfml-рендерером и делать все через нее, чтобы потом легче было переходить на огл.
>>197601
>>197598
Ну если 2д то можно попробовать sfml.
Там уже и шейдеры завезены.
https://www.youtube.com/watch?v=K6aAxuIL7h8
Нет, должен компилироваться везде, где есть libpng, opengl, glew, freeglut и gcc.
Если тут не хочешь выкладывать, можешь связаться со мной в токсе https://tox.chat/ мой ID: 37C1675B1ECC30BF7C09714E5FCE11DFA998EB3641F9816C1D621BF261DDF85711D3F8AAC9E7
Отпиши тут, если напишешь, на всякий случай
Использую голый glfw.
glGenBuffers(1, &this->VBO);
Отваливается с GL_INVALID_OPERATION. У меня на этой строчке она не отваливается. В чём может быть проблема?
Запросто, если у него старая видеокарта или банально не стоят дрова - может быть доступна только версия 1.1, а VBO появились в 1.5
Если так, то ничем не поможешь, в 1.1 только deprecated функционал, glBegin/glEnd, display lists.
Там и шейдеров нет небось? Это ж ему весь рендерер переписывать, чтоб под легаси работало
Посмотри поддерживаемые расширения. Для OGL < 2 должна быть своя функция.
Есть некробук eee, с процессором N450. Официально заявлено, что это поддерживает OpenGL 1.5, а glxinfo говорит "Mesa GL 2.1". То есть Mesa мне сэмулирует то, что есть в OpenGL 2.1 на железе, которое в него не может, так? И интересно, на какую глюкавость можно рассчитывать?
С виндой без дров идет софтовый OpenGL 1.1.
Кто все эти люди? Для чего они делают проекты с таким-то графонием? Им за это платят? Почему в этом треде нет ни 1 картинки, похожей на какую-нибудь из тех проектов? Да что там этот тред, даже дети из унреал и юнити-тредов не делают ничего такого! Что движет этими людьми, делающими графоний на чистом опенгл под браузеры?
Это боги.
Ну там Сони, еще какая-то хуйня. Да, платят.
Зашел в одну демку. Кубики и шарики цветные, для 2001 года довольно красиво. Тормозит только сильно.
Зашел во вторую - моментально были отожраны 2гб оперативки, комп вошёл в ступор и завис, пришлось ребутаться.
Ну и нахуй нужно такое 3д в браузере?
800x614
Теперь надо столкновения делать.
Нашёл проблему.
pvs не хочет нормально считаться и всегда выводит всю геометрию за исключением когда я смотрю на стенку.
Лал. Мамкин рендерщик чтоли? Какие нахуй фпс? Только миллисекунды. И не больше 3мс на кадр.
Ты даун какой-то.
на вижуал студио нихуя не понятно, на кьютэ ругается на glut какой-то
можно эту херню как-то поставить и чтоб оно без проблем работало, или всё через жопу как всегда?
800x713
Что значит специально?
Я могу и свои загрузить, вон как выше видео: несколько коробок соединённых проёмами и всё.
А квейковские карты я беру как эталон.
Если они работают правильно и загружаются, то значит я не ошибся.
Ссылки на тьюториалы в шапке для кого запилены?
Абсолютли нат.
Ничего другого для хранения геометрии уровня я не придумал и поэтому просто уже воспользовался готовым.
Яснопонятно. Я бы на твоем месте (хрен когда доберусь даже до такого уровня) попробовал свежий формат карт от Валв. В кишках тот же bsp, но побогаче будет.
Да bsp это, видимо, структура для хранения данных.
Хочется ещё разобраться с форматом карт в думе 3.
Там уже порталы юзаются, а не заранее рассчитанный pvs.
1058x892
Теперь надо допилить скольжение вдоль стены, а то сейчас как-будто бы за стенки/пол зацепляешься.
Добавить гравитацию и может быть прыжки.
А. Это цвет которым буфер очищаешь.
Я эти "дыры" тоже заметил сразу, особенно когда камеру быстро вращаешь.
Почему так происходит я не могу точно сказать.
Скорее всего из-за того, что процессор не может достаточно быстро отсылать команды видеокарте чтобы та всегда была нагружена и из-за этого могут быть такие дыры.
Думаю можно решить или как-то сгладить этот косяк тем, что я буду запоминать в каком листе дерева я был на предыдущем кадре и при вычисления новой позиции я будут сравнивать со старой.
Если они совпадают то и считать видимость заново не имеет смысла.
> То есть у тебя некий "список видимости" строится асинхронно?
Да, только параллелизма у меня нету. Я в нём пока не разбираюсь.
http://graphics.cs.brown.edu/games/quake/quake3.html#VisFindCluster
Мда, вот это, как мне кажется, плохо. А сколько времени уходит на построение? Может не так уж и дорого каждый кадр его делать? Да и обходились же как-то одним потоком раньше.
> А сколько времени уходит на построение? Может не так уж и дорого каждый кадр его делать? Да и обходились же как-то одним потоком раньше.
Всё происходит крайне быстро.
Я имел ввиду то, что видеокарта работает гораздо быстрее процессора и из-за этого он не может за ней угнаться.
Как пилить BSP уровни? Только в хаммере? Блендер не может их экспортить? Всегда загружал octree и в хуй не дул, а тут такие возможности! Тоже хочу BSP. И как у этого формата с открытыми большими пространствами? Нужно будет подгружать отдельные куски, как в первом полураспаде?
> Как пилить BSP уровни?
Я пилю в пикрелейтед.
Мне понравился больше чем gtkradiant.
Потом через q3map2 пропускаю карту:
https://en.wikibooks.org/wiki/Q3Map2
> Блендер не может их экспортить?
Вот есть скрипт для Блендера, но он для карт первого квейка.
https://developer.blender.org/T35778
> И как у этого формата с открытыми большими пространствами?
Наверное не особо. То есть ГТА на таком не запилить. Он для закрытых пространств.
> Нужно будет подгружать отдельные куски, как в первом полураспаде?
Судя по всему да.
Я смотрел некоторый код.
Выглядит довольно просто.
есть солнечная система:
http://pastebin.com/je0TTAPP
помогите создать +2 планеты (любые)
в коде там типа солнце, земля и луна, они крутятся по оси вокруг солнца
> помогите создать +2 планеты (любые)
Ну так у тебя уже есть Земля.
Добавь Марс, например, но с другими параметрами.
В чём проблема?
я когда что-то добавляю - у меня только луна пропадает и всё :(
В смысле? Это я сам делаю, но исходники пока никуда не выкладывал.
Они у меня наоборот уменьшаются когда я к ним приближаюсь.
Я с биллбордами проебался дня два и оставил их так.
Потом поправлю.
мне эту солнечную систему в понедельник сдать и я до конца своей жизни смогу об этом больше не вспоминать
> мне эту солнечную систему в понедельник сдать и я до конца своей жизни смогу об этом больше не вспоминать
Ничем помочь не могу.
такие посылаторы с их "иди учи %random_lang%" никогда ни с чем помочь не могут, кроме как давать глупые советы)
https://www.youtube.com/watch?v=puOTwCrEm7Q&index=18&list=PLW3Zl3wyJwWOpdhYedlD-yCB7WQoHf-My
Не помню, постил или нет.
Да, я смотрел это, но увы у меня ничего не вышло.
В будущем хочу попробовать через геометрический шейдер их генерировать.
https://stackoverflow.com/questions/8608844/resizing-point-sprites-based-on-distance-from-the-camera
http://www.opengl-tutorial.org/ru/intermediate-tutorials/billboards-particles/billboards/#solution-2--the-3d-way
Теперь чотко.
тебе нужно сделать эффект выстрела из дробовика и более плавную анимацию у бота после выстрела
Ноу щит шерлок!
Для меня интересно разобраться в этой теме, но я пока крайне поверхностно шарю в этом.
Вопрос в том, с чего начать изучение рендеринга? Если я просто научусь работать с OpenGL по туториалам, то хватит ли мне знаний, чтобы уверенно разбираться в этом и нормально запилить задания? Или нужно более глубокие знания OpenGL? Или вообще стоит начать с каких-то вообще азов рендеринга? Если так, то какие ресурсы или книги можете посоветовать для этого?
Хера се у вас универ, я прям завидую.
Насчет изучения рендеринга, то я бы посоветовал начать с изучения rendering pipeline (можно даже начать со статьи в википедии https://en.wikipedia.org/wiki/Graphics_pipeline, и дальше по ссылкам). И параллельно делай туториалы, да. И параллельно читай спецификации (например OpenGL https://www.opengl.org/registry/doc/glspec43.core.20120806.pdf . Да, спецификации написаны довольно сложным языком, но если сможешь осилить и понять, что там написано, то это будет громадный бонус). Также учи матан: матрицы, векторы, вот это все.
По темам, гугли whitepapers: много умного народа уже наверняка глубоко исследовала эти темы, так что сначала полезно изучить все достижения в этой области, прежде чем пилить свой велосипед.
> Если я просто научусь работать с OpenGL по туториалам, то хватит ли мне знаний, чтобы уверенно разбираться в этом
Зависит от твоих познаний в математике и (что куда более важно) умении её применять.
Спасибо за инфу, буду изучать.
>>204012
Ну матан, линал на уровне первого курса знаю в принципе; если что-то дополнительное потребуется, то по ходу дела, думаю, раскурю.
>>204015
Это http://habrahabr.ru/post/248153/ ? Обзорно просматривал как-то, но думаю теперь подробнее разобраться и закодить все самостоятельно.
А, я в глаза долблюсь, тред про OpenGL.
http://pastebin.com/riYEtR8J
А еще, что бы изменить размеры куба, надо же вершины менять? Тогда меняется VAO, но почему говорят, что его менять не надо?
Потому что VAO и должен быть фиксированный, размеры куба нужно менять матрицами преобразований.
Если у тебя тысяча VAO для тысячи кубов - неудивительно, что они тормозят.
> Почему когда я делаю их порядком тысячи, начинает тормозить?
Юзай инстансинг.
> А еще, что бы изменить размеры куба, надо же вершины менять?
У каждого куба есть матрица модели.
Там ты можешь через неё менять размер, угол поворота и др.
Первая и вторая ссылки вроде норм.
Я по этому начал изучать: http://www.learnopengl.com/
Там и про сборку библиотек написано, и про пайплайн с шейдерами написано, и за математику вроде годно поясняется, и в конце уроков даже небольшие упражнения на закрепление материала есть.
Спасибо за ссылку, бро. Наверное, это лучший вариант.
> Я же должен для каждого куба бинд делать?
Оно несколько иначе работает.
Биндишь текстуру и рисуешь свои кубы.
То есть текстура биндится один раз в определённый слот я про glActiveTexture перед отрисовкой.
> Получается для каждого класса я буду делать свой VAO? Типа для куба, треугольника, и.т.д?
Не. VAO помогает тебе устанавливать атрибуты для рисования glEnableVertexAttribArray, glVertexAttribPointer.
То есть есть смысл именно в том, что ты объединяешь при помощи этого VAO меши с похожими атрибутами.
> освещение P.T.
Там дохера всего. Если брать только core, то это physics based shading + global illumination. Остальное уже всякие SSAO и прочее. Если ты не работал и не знаешь, как обстоят дела с артом в ААА на западе, то я тебе поясню: шейдера и постэффекты делают художники, а не программисты. Их не копипастят из интернета. Программисты только оптимизируют всякое гавно + фичи.
> мемы-мемаски
> обоссаные /gd-асики
Если ты умеешь только в буквы-слова, а не смысл и опыт, то мне тебя жаль.
Какое же ты быдло обоссаное. Если ты пишешь свой движок, то ты пишешь pbr+gi сам. Если делаешь игру на движке, то всё делает лайтинг/енвайромент артист в редакторе.
Чот ты ваще куда-то увильнул
Vulkan is Here!
Khronos launched the Vulkan 1.0 specification on February 16th, 2016 and Khronos members released Vulkan drivers and SDKs on the same day. Below you will find everything you need to come up to speed on Vulkan and to forge ahead and explore whether Vulkan is right for your engine or application.
постепенно наполняют гитхаб. это радует
Функции с десятком параметров. Они это серьезно? Как можно было превратить няшный OpenGL в это?
А что за функции ты имеешь ввиду?
Может они один раз при создании контекста или около того вызываются?
vkCmdWaitEvents. Сколько бы раз не вызывались - это мало похоже на качественный API. А обилие структурок до боли напоминает DirectX.
В плюсовом враппере первый аргумент уйдет, так как это будет метод класса, три пары переменных "количество хреней-указатель на хрени" заменят векторы хреней. Ну и количество аргументов нифига не будет самой большой проблемой при программировании движка на вулкане. Да что же всё так лагает с бета-драйвером? Амуда, пожалуйста.
> Да что же всё так лагает с бета-драйвером? Амуда, пожалуйста.
А мой видюхи в бета драйверах вообще нету почему-то хотя писали, что вулкан будет работать на видео с огл 4 и выше.
Штоу?
!Инженер я не ты журнал?!
ну так Россия же
книга по погроммированию с обложкой на которой бесконечной цикл
книга по тридэмаксу с обложкой на которой лента мёбиуса
книга по пикселарту с обложкой на которой кисточка и палитра
Поехавший, попробуй представить, что верхний левый - заводила. И посмотри. Если не можешь, у тебя явно проблемы.
мимокрок
>думает, что эта хуйня может крутиться только так, как ходит часовой механизм
>всерьёз называет кого-то дебилом
Теперь рассказывай как оно все крутится в твоем воспаленном могзгу.
Затралели лалок вапще))))))))))
Представь, что верхний-левый - заводила и все не ограничивается вариантом, когда они ходят, как часы. Напряги хоть раз свой мозг.
В блендере могу.
Сочетания dx+gl/dx+dx уживаются спокойно друг с другом. Но gl в количестве больше одного стакается с другими, пусть там что мои программы, что чужие игры.
Первый пик, всё на gl, второй - три игры на dx.
Вот тебе ещё копрокубы, засранец.
Спасибо, повалялся 5 минут в конвульсиях.
Аттрактор Лоренца, в остальном почти всё как на learnopengl.
Я просто много лет инициализирую gl как версию 1.0, а к всяким шейдерам/хуэйдерам как к расширениям отношусь. По скорости вроде как всё соотвествует чужим программам, никаких недостатков. В чём разница, зачем нужны версии, кроме как чтоб кратко говорить о примерном уровне карты?
glew, glm. Ниже не имеет смысл копать. Всё есть в коде этих либ, если захочешь глубоко копнуть.
> В чём разница
C opengl 2.0 появился программируемый пайплаин. А это +100 человек в отделе рендера и +10000 больше строк кода + шейдеров для норм картинки. Фактически это ёба-монст для графона. OpenGL 5 = OpenGL 1 + тоны расширений от всяких ати-нвидиа.
Но ведь для этого не требуется геометрический шейдер вовсе.
Не знаю как сейчас, но несколько лет назад геометрические шейдеры были очень тормозные, так как из-за них карте неизвестно заранее сколько геометрии нужно будет рисовать, и использовать их для изменения размеров спрайтов по меньшей мере неэффективно. Так то, спрайты в зависимости от расстояния до камеры можно было менять ещё даже через низкоуровневый вершинный шейдер, который ARB_vertex_program, когда про glsl никто ещё даже не слышал.
>из-за них карте неизвестно заранее сколько геометрии нужно будет рисовать
>layout (triangle_strip, max_vertices = 4) out;
>max_vertices
Передаем точку из неё геом шейдер делает парочку треугольников. Выгода.
Мимо
Слышал, то ли в скайриме, то ли в крузисе снег на деревьях генерировали шейдором.
Шейдер.
Дело в дровах.
Почему обычно тормозит кривое кириллоговно?
За openGL никто не следит. Он открытый, микрософтам например не выгодно делать чтоб openGL был каким-то популярным, так как тогда куда большая часть игр перекатится на люниксы или ещё куда, и со всякими нвидиями у них договор какой-нибудь, быть может.
Мне кажется дело в дровах. Вот такой баг есть (>>243413 ), например. Я в /pr поспрашивал, у кого-то всё в норме, у кого-то такой же эффект. Помимо этого, OBS не может захватывать программы на openGL. Причём, если запускать те же программы на встроенной карте от интела, всё работает. Что синхронизация в норме, что obs изи захватывает. То есть проблема конкретно в драйвере нвидии, и видимо с быстродействием что-то подобное. А с dx везде всё работает правильно, и захватывается всё как надо.
>большая часть игр перекатится на люниксы
Ты такой дегенерат, что просто пиздец. Даже так - пизденящий душу пиздец. Кому твоя ссаная прошивка для роутеров нужна, у которой доля на десктопах - в пределах погрешности измерений?
Большая часть не в смысле, что >50%, а в смысле что несколько более крупная доля игр, чем сейчас. Я же написал "куда большая", что говорит конкретно какое значение я имел ввиду. Например 15%, заместо 5%.
>Ты такой дегенерат, что просто пиздец.
Ага. Я не разбираясь в теме с потолка предположил первый бред который в голову пришёл, по идее то микрософтам вообще может не быть дела до OpenGL.
DX на win, xbox
у PS3-4 вообще своё PSGL/LibGCM
на мобилах Unity
Фактически, OpenGL никто не юзает кроме фриков
Ладно, уговорил. Мобилы, линукс, фрики.
Нахуя тебе больше 60 fps в игре? Все равно твой ссаный монитор физически не выдаст больше 60-75 кадров в секунду.
> на мобилах Unity
Юнити лишь движок, а вот графическая часть в нём как раз таки на опенгл.
Ты долбаёб или прикидываешься?
> а вот графическая часть в нём как раз таки на опенгл
Нет. То есть, он может в гл, но если можно, то работает на дх.
ОП пост для кого составлен?
готовишь анус для снульчеканкурса?
Что я делаю не так?
c#
Tao (обертка над GLUT)
gl4csharp (обертка над GL)
Качество кода, комментов и прочее - говно, ведь я ебаный ньюфаг.
Скажите лучше что не так с ГЛ вызовами.
По итогу я вижу только заливку и ИНОГДА в центре бывает одна точка.
No Error
Вьюпорт за тебя либа делает?
>> 41. Gl.VertexAttribPointer
>> ...
>>156. Gl.BindVertexArray(VAO);
VAO надо биндить до вызовов VertexAttribPointer
>> 141. Gl.VertexAttribPointer
>> ...
>>156. Gl.BindVertexArray(VAO);
VAO надо биндить до вызовов VertexAttribPointer
fix
http://pastebin.com/BvvC8pHF
Схуяли? Все там норм с опенглем. Есть проприетарные нвидиевские драйвера.
Ну я только начал. Читаю Addison Wesley: OpenGL Programming Guide. Он там уже про 4.3 кряхтит что-то с самого начала и шейдер загоняет сразу же. Сорцов не искал его и посмотрел, как в на офсайте опенгл загружают шейдеры, сделал по подобию.
Юзай glGetError после каждого (почти) вызова.
Осторожно: сразу после инициалиации могут быть коды ошибок. Есть смысл ее подергать в цикле в самом начале, пока не вернет GL_NO_ERROR.
В твоей книге, кстати, в самом начале есть пример, как вытаскивать ошибки компиляции шейдеров. Сделай такую штуку у себя. Вообще сделай инфраструктуру для обработки ошибок, потом сам себе спасибо скажешь.
Зачем после каждого? Либо вызовы оборачивать в макрос, либо дёргать один раз в конце кадра, а там уже разбираться.
>> glEnableVertexAttribArray(0);
вот на этом месте какую-то хуйню написал, вместо нуля, который, как я понимаю, ставится в соответствие vPosition шейдера
Ну, потому что любой вызов может быть неуспешным. Если вызывать в конце, ты не разберешься потом, какой именно.
Я у себя запили макрос HANDLE_OPENGL_ERRORS, который втыкаю после каждой функции. Он мне в случае чего кидает исключение с именем файла, номером строки и ошибкой. Можны и вызовы в макросы завернуть, конечно.
http://pastebin.com/xgCEtfLY
Сделал меня грустить. Я раньше С++ очень хорошо знал, но за 5 последних лет багфиксинга в больших корпорациях безнадежно отстал от жизни.
Не говоря уже о том, что все case повторяются, и их можно было препроцессором сгенерить, а не полагаться на копипаст.
glVertexArrayBinding
glVertexArrayAttribFormat
glEnableVertexArrayAttrib
Нашел в другом месте, что в более ранних версиях делалось так:
glEnableVertexAttrib
glVertexAttribPointer
В чем профит первого способа, если он длиннее получается?
У меня тут от книг гл-овских пукан горит. Ох и весело же )
недостаточно хардкорно.
Как можно сравнивать разные API в каком-то там движке, где непонятно как используются функции этого самого API.
Ты уверен что разработчики запилили все как нужно? У тебя есть код? Есть четкое понимание как это делается на DirectX и OpenGL?
Если я хочу просто вызвать glFunc, твой макрос думаешь заработает?
Хорошо. Это я тупой, ты собрался все вызовы запаковывать в gl(func, blabla);
А не проще было просто использовать дебажный opengl? https://www.opengl.org/sdk/tools/BuGLe/
К тому же, его можно самому написать!
Ничего такого! Лямбды и автоподставление типов компилятором.
Мне пока и так сойдет. А про дебажную версию я вообще не знал
> В чем профит первого способа, если он длиннее получается?
http://stackoverflow.com/a/21652955
http://pastebin.com/X46RMZ3c
http://pastebin.com/7gJQp9Gd
Нашел косяки некоторые, исправил шейдер. Мне кажется, что CUDA здесь пизже въедет и без изъебов, но, в общем, теперь выдает
Compute shader(s) failed to link.
Compute link error: INVALID_OPERATION.
ERROR: error(#404) local work size runs out of limitaion
Бля, ну и насрал же я тут. Извините. Вот эта залупа уже хочет работать, только вот почему все упирается в ограничение на 1024 элемента (для вычисления, естественно)? Его можно обойти, или для таких случаев использовать OpenCL? Только вот тут поебота - надо будет интероп писать.
http://pastebin.com/RjRg02YH
NVIDIA не может в человеческий OpenСL, так что не поможет. Есть ограничение на количество потоков (по видимому, 1024, но можно как-то запросить). Делаешь цикл, чтобы каждый поток обрабатывал несколько элементов с шагом в 1024.
У меня видюха от AMD, а на работе делаю софт под CUDA, вот же ирония вышла.
AMD'шники соснут, потому что с их дровишками OpenGL 4.5 доступен только для HD7000 серии и выше, а у Nvidia от 400 и далее. Вообще, бесит меня политика AMD в плане поддержки железа. Конченая компания.
Да ладно, а вот у АМД вулкан с 7к у хуанга с 700, хотя в общем понятно, что это все нахер не нужно кроме как для AAA.
>Чтобы сделать движок на Вулкане быстрее AZDO OpenGL, нужно быть готовым маленькие куски переписывать под каждого вендора.
С какого перепуга? Производительность вулкана выше уже по дефолту так как можно управлять синхронизацией и командными буфферами.
Так, продолжаю запускать говнопримеры. В общем, настроил вычислительный шейдер, 1024 элемента, да и хуй бы с ним, тут у меня invalid enumeration валится при использовании glGetTexImage
http://pastebin.com/jYZjRXM5
Дрова под OpenGL пилятся уже 20 лет. Ты правда думаешь, что сможешь их превзойти?
http://32ipi028l5q82yhj72224m8j.wpengine.netdna-cdn.com/wp-content/uploads/2016/03/Practical_DX12_Programming_Model_and_Hardware_Capabilities.pdf
> с одной стороны я неплохо знаю opengl es но с другой стороны он – устаревшее говно и пора бы уже переходить на Vulkan
По моему ты просто даун.
Спецификация Вулкана вышла буквально несколько месяцев назад.
Чтобы что-то делать на Вулкане и чтобы это было доступно конечный продукт имеется ввиду как можно большему числу пользователей, пройдёт ещё несколько лет.
Вкатываюсь с андроидодерьмом.
Так, полистал тред. Ничего для быстрого старта под ведроид не нашел. Поясните, с чего начать?
Не обращай внимания, проходи мимо. Тебе в соседний тред.
А здесь сидят те, кто хочет созидать своими руками, а не сосать хуй разработчиков юнити, причмокивая и сглатывая сперму.
OpenGL ES
OpenGL ES 3 Cookbook с нее можешь начать. Там все просто расписано и применимо к OpenGL настольному (хотя у кастрата есть модификаторы точности и прочая хуйня). А вот книгу с начала поста, которая идет офиицальным руководством OpenGL вообще не советую читать - просто каша. Супербиблия неплохая, но для начала тоже не самый хороший вариант, тем более что примеры, которые там приведены рассматриваются крайне скудно и больше времени уделяется на описание API как такового.
В каком порядке следует вызывать и почему функции:
glEnableVertexAttribArray
glVertexAttribPointer
?
Потому что работает и так и так, что странно
Ниважн там кароч праверка етих флагов када идет вызов draw т.е. перед драв калом вызывать над кароч.
а нихуя, даже так на этой параше не работает
читни про VAO
Ты можешь все индексы в один IBO запихнуть.
И в последнем параметре glDrawElements указывать смещение в байтах от начала буфера (IBO).
Даже можно все модели запихнуть в один VBO, но это потом когда разберёшься с этим.
И через http://docs.gl/gl3/glDrawElementsBaseVertex рисовать.
Всегда возникает ошибка в glGenVertexArrays и glGenBuffers. В гугле написано только, что надо поставить glewExperimental = true, но это не помогает. Что здесь не так?
Попробуй сначала создавать окошко (наверное, где-то внутри в нём создаётся контекст).
Типо так.
Сделал так, результат тот же. Судя по всему, я единственный, испытывающий эту проблему. В гугле ничего толкового не найти.
Установил последние, все по-прежнему.
Попробуй.
http://pastebin.com/raw/5M9Y4zQy
GL.h и GLU.h убери.
Вся эта ебалайка есть уже в glew
У меня "OpenGL 3.3 API is not available". Это не исправляется никак? У меня около года назад все работало нормально, с тех пор я не трогал опенгл, и все забыл. Взялся заново, а тут такая хуйня. Думал, может проблема с подключением библиотек или еще чего.
> Думал, может проблема с подключением библиотек или еще чего.
Проверь пути к либам, подключаются ли они и тд.
Алсо, также в папке у глева есть бинарники.
Запусти glewinfo. Глянь какой там вывод.
С путями все нормально, иначе тогда ошибка была бы во время линковки. Бинарник glew32.dll (других же нет?) перекинут в директорию проекта. glewinfo вот.
Я все понял, у меня же дефолтный процессор интеловский, а не нвидиа. Переключил, теперь все работает. Спасибо за наводку.
Попробуй этот код:
http://pastebin.com/raw/qBydzL7v
Скорее всего ты проебался с
glfwMakeContextCurrent( win );
Я не видел его у тебя в коде выше.
Спасибо, но и без этого все тоже работает. Проблема была в графическом процессоре. Код, который у меня, теперь работает нормально.
Короче, поебался я 5 минут тут, три семерки вся хуйня. Не стал искать правильный путь - поменял в SConscript'e gldb:
have_gtk = True
И идут нахуй, все работает сука.
http://pastebin.com/EU7pQniF
Не могу понять как сделать так, чтобы одна текстура натягивалась на несколько полигонов сразу. Не повторялась, а именно чтобы например на квадрате 5x5 лежал один кусок текстуры.
Пока смог только ручками решить эту проблему при генерации прямоугольников с разбиением: для каждого полигона разбиения вычисляются нужные текстурные координаты. Функция на пике.
Но что с остальными примитивами делать я не знаю, их я строил функциями из glu glut, а не своими.
Попробуй вот это:
http://pastebin.com/raw/zyyAsTNM
>>264932
> Не могу понять как сделать так, чтобы одна текстура натягивалась на несколько полигонов сразу. Не повторялась, а именно чтобы например на квадрате 5x5 лежал один кусок текстуры.
Передавай в шейдер сразу 2 текстуры.
И для какой-то из них ебашь текстурные координаты для твоего прямоугольника.
Ну или рисуй в том месте ещё полигоны и натягивай на них нужную текстуру.
Но тогда может возникнуть такая проблема:
https://upload.wikimedia.org/wikipedia/commons/5/5f/ZfightingCB.png
> glVertex
> glNormal
Почему не залить всё в GPU и на мучить драйвер сто лет как устаревшим API?
дак енто ж ДЕЛФИ
я сразу чет не узрел, что это код гиар студио, там, поди и GL'а без костылей не поставить нормального.
приходится...тут display функция уходит в петлю, то есть каждый раз перезаписывается все, что внутри него. мне нужно отрисовать объект. Его конструкция описана в классе. как это сделать грамотно? получается, что каждый раз, когда перерисовывается экран создается заново(!) объект класса, ему снова присваиваются координаты. Так и должно быть или я просто дебил?
У тебя данные BrushBox'а постоянные, или они меняются одинаково, или как они вообще сделаны, внутри то что?
короче, раз уж у тебя спрайты там отрисовываются, то можно отрисовку спрайтов сделать одной пачкой (за один вызов gl), но при этом рисовать надо будет н устаревшими способами (glVertex, glTexCoord, glBegin/end). Почитай про буферы, там, в целом, все очень просто, да и быстрее работать будет, это однозначно.
окей, спасибо. просто в туториалах обычно не показывают работу с классами ибо там рисуют 1 чайник или 1 кубик. ооп не раскрывается..)
Если у кого есть желание оставьте контакты >>264565 (OP)
OpenGL 2.0 для мобилок, веба и индиговна будет жить еще очень долго. Вулкан станет основным API для ААА, если MS будет продолжать тупить с UWP.
Просто я запариваюсь над тем, что начинать учить, чтоб не зря было. Пока что овладел нормально только плюсами и парой тройкой библиотек к нему. Очень хотел юзать opengl, а тут вот говорят лучше вещь сделали.
Вулкан намного сложнее GL, но в целом он намного более продвинут по архитектуре. На нем приятнее писать.
Кстати, палю годноту по вулкану: https://github.com/SaschaWillems/Vulkan
А за это большое спасибо. Разумеется с драйверами 340 из репозитория дебиана оно не встанет? там вроде от 368 версии на картах с opengl 4.5 поддержкой. Это крашит систему. Кто пытался поставить под linux?
>> glClearColor(...)
>> glClear(GL_COLOR_BUFFER_BIT)
и
>> GLfloat color[] = { ... }
>> glClearBufferfv(GL_COLOR, color)
Есть, значит, у меня моделька с кучкой материалов (.obj и .mtl файлы, короче), и тут я решил их по-маленьку зарендерить, но вот в чем дело, у GLSL на шейдер ограничение в 16 текстур (вроде и до 32 можно), а вот стандарт .mtl, который вейвфронт замутили, подразумевает наличие до 9 текстур от просто изображения предмета до каких-то залуп (алсо, забавно, что нет маски нормалей, а бампинг есть), так вот. Каким образом мне лучше сделать - мусор повыкидывать (оставить только основную текстуру, бампинга, отражения, прозрачности) или разбить объект на куски (под каждый отдельный материал) и затем рендерить его в несколько проходов (но это получается сильно затратнее), может есть что-то по-лучше, да и вообще нахуя мне столько текстур?
Загрузи все изображения в пространство одной текстуры и сдвинь текстурные координаты у вершин соответственно.
Спасибо.
А что делать для видеокарт, у которых размер текстуры маленький (2к х 2к, к примеру, для модели-то ведь точно хватит, а вот для какого-то ландшафта, например, окажется маловато (если тужа еще запихивать карту бампинга, нормалей, диффузии и пр.)). Херить качество?
> если тужа еще запихивать карту бампинга, нормалей, диффузии и пр.
куда ты их запихивать собрался, госпади
Я НЕ КАРТА ВЫСОТ Я ТЕКСТУРКА
НЕ ЗАПИХИВАЙ МЕНЯ, ПОДУМОЙ
Ну ведь бампинг на физическую высоту (имею в виду объекта) не влияет
>>272597
Спасибо, тоже о них подумал, но где-то кто-то пиздякнул мне на ухо, что текстуры массива должны быть одного размера, а оказывается нет.
Кстати, тут еще один вопрос. У меня следующий кусок в шейдере:
http://pastebin.com/MeHspyQ2
Размер структуры равен 76 байт (если посчитать), но gl_uniform_block_data_size показывает, что размер униформа равен 636 байт. Я, так понимаю, 4 байта между структурами добавляется длы 16-байтного выравнивания данных?
> Ну ведь бампинг на физическую высоту (имею в виду объекта) не влияет
при чем тут это
ландскейп совершенно не так делается, ландскейпу свой шейдер пишешь
карта высот я имел в виду топология ландшафта, разумеется, она хайрезная, а эти мелкие текстурки что на траве, земле, песке и прочем их по 512 делай если печешься за производительность на древневидюхах
или в несколько проходов можно рендерить (наверное, я сам не умею). я про то что там процедурный подход нужен
> Размер структуры равен 76 байт (если посчитать), но gl_uniform_block_data_size показывает, что размер униформа равен 636 байт. Я, так понимаю, 4 байта между структурами добавляется длы 16-байтного выравнивания данных?
http://steps3d.narod.ru/tutorials/ubo-tutorial.html
Спасибо. В общем, на верочку, решил прочитать индексы и смещения, и, похоже делаю это вообще неправильно:
http://pastebin.com/WZMKJq0j
Вывод следующий:
>> u_materials: 4294967295 offset 0
>> u_materials.materials: 4294967295 offset 0
>> u_materials.materials[0]: 4294967295 offset 0
>> u_materials.materials.ambientTexture: 4294967295 offset 0
>> u_materials.materials[0].ambientTexture: 4294967295 offset 0
>> MaterialsBlock.materials: 4294967295 offset 0
>> MaterialsBlock.materials[0]: 4294967295 offset 0
>> MaterialsBlock.materials.ambientTexture: 4294967295 offset 0
>> MaterialsBlock.materials[0].ambientTexture: 4294967295 offset 0
>> materials: 4294967295 offset 0
>> materials[0]: 4294967295 offset 0
>> materials.ambientTexture: 4294967295 offset 0
>> materials[0].ambientTexture: 4294967295 offset 0
>> Materials block size 636
Нихуя не нашел, короче говоря, но зато размер блока выводит, сука. Я вот вкурить не могу, как он их ищет то блять. По имени переменной обратился, по имени блока тоже, даже блять без имени, но все тщетно.
Так, короче, хуй с этими поисками размещений, по std140 разобрался, теперь это не нужно (а хотелось бы понять, как делать-то). Но, в общем, мне не дает покоя конченый шейдер, а дело вот в чем, имею вот такой шейдер (делает чуть более, чем нихуя - применяет краску и все):
http://pastebin.com/g8TEaFfx (выводит пикрелейтед 1)
Однако, стоит мне заменить тело main'a на вот это:
> MaterialStruct m = u_materials.materials[vs_out.material];
> fs_color = vec4(m.diffuseColor.rgb (vs_out.normalCoords.z + 1) 2, 1);
Коричневый цвет сразу уебывает в звенящие дали, оставляя цвет только от первого материала. Видимо, компилятор сделал какую-то охуительную оптимизацию и все накрылось пиздой. Как сделать правильно?
в normalCoords я пока что просто пробрасываю значение gl_Position, а вообще просто решил подзатенить чутка, чтобы трехмерно выглядело.
Короче, один тип подсказал, что нужен квалификатор flat для переменной материала, чтобы он не интерполировался, вот теперь заработало, да.
Это не моя модель, я скачал и проверяю работу.
Ебучий матан, ебучая тригонометрия, ебучие матрицы, всё руками делать, охуевать трижды, гроб, гроб, кладбище, пидоры, всё.
Спасибо за внимание.
Щито поделать.
а по моему это круто, хоть где то есть толк моим знаниям лол
ну допустим выполнили какие то операции на данном фрагменте, установили для него цвет сохранили какие то данные в переменных -> перешли к следующему фрагменту, взяли прошлые данные опять выполнили действия опять сохранили данные -> перешли к следующему фрагменту итд
Ну или на крайний случай параллельный буфер, допустим выполнили операции установили цвет в gl_FragColor, установили цвет в буфере -> перешли к следующему фрагменту взяли цвет из буфера прошлого фрагмента, выполнили операции, установили цвет в gl_FragColor, установили цвет в буфере -> перешли к следующему
есть атомики, если тебе нужно в одном проходе хранить данные. Можно зарендерить во фреймбуфер и потом его ебать следующим проходом (так делают тени, и карты отражения, в частности)
ладно иначе сформулирую вопрос, с этим у меня проблема
на пике можно увидеть РАЗМАЗЫВАНИЕ, и вот я ни как не пойму как такое сделать в glsl, ну те если бы изображение было бы массивом то все просто, но вот в glsl же иначе
ага, мне же нужно обращаться к прошлому измененному значению пикселя на позиции выше
Не нужно. Это совсем не так делается. Но тебе ещё рано задумываться об этом, раз ты такую простейшую трансформацию осилить не можешь. Рекомендую изучить базу glsl для начала.
Тут дело не в glsl, а в алгоритме.
>>288897
То есть ты хочешь получить такие же тени как и на гифке?
Дык можно и проще же сделать.
https://www.youtube.com/watch?v=fsbECSpwtig
новичок да, я в общем то и изучаю glsl, а лучший способ учится это же писать код
и так то вот что у меня уже есть
https://www.youtube.com/watch?v=wbIslzIHtss
https://www.youtube.com/watch?v=s_E57cr86YQ
вот только информация на на тему glsl страшно хаотично разбросана по сети и это вызывает некоторые трудности в обучении
о добра тебе
В идеале должна получиться пиксель арт игрушка с нетривиальным сюжетом в нуаркиберпанк bladerunner сеттинге, с боевкой частично как в child of light, но пока графена нет тк художник учится, а я вот на системой света работаю.
все свое, физика, рендер, итд
Веб воркеры работают параллельно. Ты просто отсталый.
этот метод не позоволит нормально использовать карту света, да и тени там не очень они общие для всех источников света 0:53
а я хочу как раз имея на входе карту света, для каждого исочника света ее по своему модифицировать (добавляя тень) и уже потом просто рендерить сам свет
так даже дешевле будет чем то что на видео, но вот я никак не пойму как это размазывание реализовать
черд
вот этого я и хотел избежать - фором по всей высоте экрана проходить в каждом фргаменте, но видимо не получится усидеть на двух стульях, и либо дешево либо красиво
окей, спасибо за наводку
Кто-нибудь знает, в чём может быть проблема?
Первый пик - правильный вид игры.
Второй и третий пики - так, как игра выглядит у других людей.
Сама игра - https://yadi.sk/d/tg9DSCRGu3JfW
Механизм, который передаёт цвет в шейдер:
coin_ptr->get_shader().activate();
coin_ptr->get_shader().set_uniform_vec3("background", glm::rgbColor(glm::vec3(std::fmod((coin_ptr->get_scale() × 360.0f / 0.55f) + coin_ptr->get_color_shift(), 360), 0.45f + coin_ptr->get_scale(), 1)));
Этот код раскрывается вот так:
glUseProgram(this->program_id);
glUniform3fv(glGetUniformLocation(this->program_id, "background"), 1, glm::value_ptr(glm::rgbColor(glm::vec3(std::fmod((coin_ptr->get_scale() × 360.0f / 0.55f) + coin_ptr->get_color_shift(), 360), 0.45f + coin_ptr->get_scale(), 1))));
Может, шейдеры v120 не у всех работают? На легаси нужно переписывать?
Помогите.
Начни с проверки того, что у тебя окно с правильной глубиной цвета создаётся. OpenGL'у же пофиг, он будет пытаться хоть что-то отобразить в любом случае.
Когда делать перекат?
Как достигнем 500 постов или подождать пока Абу восстановит бамплимит?
Подожди пока начнет тонуть, очевидно же.
Если 120 не работают, то какой смысл использовать 330? Вот код шейдеров:
fbo vertex - http://pastebin.com/i36hQ03F
fbo fragment - http://pastebin.com/whC9X3Fj
draw vertex - http://pastebin.com/GU5dDZrA
draw fragment - http://pastebin.com/9AAVZv7J
fbo отвечает за fbo, draw отвечает за отрисовку треугольников.
>>290584
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 6);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
Добавил вот эти строчки - треугольники всё равно белые.
Мне не трудно написать 2 шейдера под 120, если это только расширит аудиторию.
А зачем каждый раз вычислять адрес юниформа в шейдере?
Почему один раз не делать и хранить где-то хендл на это?
Это игра на twg, тут очень много мест, которые можно было бы оптимизировать. Например, добавить кеш для шейдеров, чтобы не загружать один и тот же шейдер несколько раз. В серьёзном проекте я бы это реализовал, но тут не вижу особого смысла.
> Например, добавить кеш для шейдеров, чтобы не загружать один и тот же шейдер несколько раз
В смысле?
Не биндить его дважды?
У каждого объекта dream::engine::entity есть свой dream::gl::vertex_buffer_object, у которого есть dream::gl::shader. Все треугольники - энтити.
> Перед отрисовкой отсекай те треугольники, который за экраном.
У меня таких нет.
Да и оптимизировать я смогу. Но когда нужно торопиться - немного не до этого.
Сохранится ли значение юниформы?
2.11.7 Uniform Variables
... Uniforms are program object-specific state. They retain their values once loaded, and their values are restored whenever a program object is used, as long as the program object has not been re-linked. ...
Делаю все по науке - бинжу тектсуры на разные юниты, передаю номера юнитов в шейдер. При отрисовке в обоих семплерах текстура из нулевого юнита.
Везде написано, что все делается именно так, но у меня не робит. хотя я уверен, что там где-то просто косяк, но я не вижу, где.
c++ код (проблемное место в Matrial8::bindTo())
http://pastebin.com/JwkqUD3d
Фрагментный шейдер
http://pastebin.com/KC6Jcci5
в uniform пердавай не GL_TEXTURE0 и т.д., а просто 0, 1 и т.д.
glUniform1i(location, 0); - биндит текстуру 0
а если MRT, то еще glActiveTexture(GL_TEXTURE<номер);
Нужно рендерить так, чтобы темные участки текстуры смешивались с цветом больше, чем светлые.
Короч, нужно что-то типа Resultcolor = (1 - Texturecolor) x Drawcolor
Все осложняется тем, что дело происходит на lwjgl.
Хотя не, тогда светлые места темными станут.
Алсо треугольники или квады? Говорят лучше треугольники, типа карты под них заточены.
очевидный ньюфаг
Были в 1.1 в виде расширений же.
1) Делаешь один спрайтшит на всех и аплоадишь его в одну текстуру.
2) Каждый объект представляется координатами на экране и индексом спрайта. Фигаришь их в буфер с параметром GL_DYNAMIC_DRAW.
3) В геометрическом шейдере генеришь квады и готовые текстурные координаты, простые как амеба вершинный и фрагментный шейдеры кушают и высирают на экран. И все это за один drawcall.
4) ...
5) ПРОФИТ!!!!!
Пояснение: квады начиная с OpenGL 3.1 выпилены нахуй, делай TRIANGLE_STRIPE или TRIANGLE_FAN, про квады забудь.
Вот есть OpenGL ES 2.0, там, как и положено, пишется версия шейдера
#version 120 и т.п.
А вот и пришел GL ES 3.0, а там уже блять другое
#version 300 es
Они что, опидорели там в своем комитете?!
Почему они не сделали всем суффикс es, а у 2.0 оставили индексы первый шейдеров?
Потому, что начиная с GL ES 3.0 используются специальные версии GLSL. Почему? Потому, что разные платформы.
Думаешь пора перекатываться?
http://pastebin.com/d0FUUfQ7
Получается что-то вроде пикрелейтеда, но проблема, в общем-то понятна - матричный фильтр и большие затраты, у меня это будет выдавать нормальный FPS даже при максимальном разрешении текстур, однако на мобиле железо сосущее, как известно, и будут некоторые веселости с залипаниями и торможениями.
Пробовал рейкастинг, но мне не очень понравился результат, для него нужно считать столкновения с препятствиями, при малом количестве это еще куда ни шло, но с ростом их числа проц заметно проседает в производительности, ну и, собственно, гладкое освещение плохо сочетается с пиксельной графикой.
Еще, как вариант, мне кажется, можно попробовать тепловые карты и этот вариант я тоже пробовал, но регулировать яркость освещения я пока не допер как. Ну и, естественно, чтобы свет появлялся вовремя нужно рендерить за пределами области видимости причем неплохо так, зато ресурсов почти не отжирает (почти тот же матричный фильтр, только за один проход).
Может подскажете еще варианты какие? Хотел бы, конечно, тепловые карты задействовать, но не допер, как считать передачу света (если его заменить теплом), то есть с какими поэффициентами и как уничтожение света, чтобы не залило всю карту.
Короче, подумтил тут шейдер для flood-fill'a, как в террарии используется, похоже (но там он программный был, насколько мне помнится), получается гораздо приятнее, чем на основе передачи тепла, только побочный продукт - ромбик очень уж не нравится
> (для мобилок, естественно)
Ну раз мобилки, то может не стоит городить что-то уж слишком сложное?
Может для начала попробовать простые техники?
Сначала тоже так подумал, а потом решил разные способы попытать в поисках самого привлекательного, все равно сроков не ставил, у меня это как своеобразная развлекуха получается, не просто же целый день сидеть без дела
Все правильно сделал?
слушаюсь
Использую LWJGL
В гугле забанили? http://stackoverflow.com/questions/1513811/getting-smooth-big-points-in-opengl
Трипкод и имя убери
Вангую поинтсайз(который кстати КВАДРАТ) много больше радиуса выводимой окружности. Получается маленькая окружность выведеная вершинами с очень большими квадратами, которые толпятся все в точке +-2 пикселя.
Почему везде по разному - хз.
Допустим у меня есть точка, я нормирую ее координаты (от -1 до 1) в пределах некоторого вида, для этого вида у меня есть совершенно конкретные значения ширины и высота области видимости в пикселах. Так вот, допустим, ширина области будет 200, а позиция х точки 0.01375, это получается ее координата (в пикселах) теперь окажется равной 101.375, что нецелое число, естественно, так вот, каким образом OpenGL определит ее позицию на экране, он вернет 101 или 102, то есть мне важно не само число, а способ его получения.
OpenGL вычисляет позиции пикселей по их центру. То есть он определит позицию как пиксел, центр которого ближе всего к 101.375, что есть 101.5
Opengl ничего не вычисляет. Это как хтмл просто спецификация, а каждый браузер сам определяет как рисовать
Вот спецификация и говорит, как вычислять.
Не похуй ли? Всё равно все существующие реализации принимают за позицию пикселя его центр.
Спасибо
МимоБогГеймДизайна
>glDrawElementsInstancedBaseVertexBaseInstance
Как-то про ДесуСекс у этого чела поподробнее расписано, и про ГТА в принципе тоже. Видимо поторопился он малость.
А есть еще подобные разборки кадров?
Ок, а есть способ сохранить имена переменных? Ну чтобы можно было линковать уже скомпилированные шейдеры для вариантов с геометри или без.
В новых версиях ГЛа можно хранить уже слинкованные шейдеры в бинарном виде.
http://docs.gl/gl4/glShaderBinary
И вроде как можно отцеплять шейдер от программы и прицеплять другой шейдер.
> Ок, а есть способ сохранить имена переменных?
Можешь также ещё попробовать юзать uniform buffer object
Или заранее задавать индекс переменной прямо в тексте шейдера.
Я имею в виду атрибуты вершин. Вот пример
-- vertex
out vec3 n;
-- fragment
in vec3 n;
если сюда вставить геометрический шейдер, как пропихнуть n через него? Это придется менять имена всех переменных в фрагментном шейдере.
-- vertex
out vec3 n;
--geometry
in vec3 n[];
out vec3 n_;
-- fragment
in vec3 n_;
Короче, видимо, придется пилить дефайны и компилировать с ними разные версии шейдеров для программ с геметрическим шейдером и без.
Сделал связывание через layout (location).
Блять, решил выебнутся - сделать вытягивание шэдоу волюма в геометри шейдере, оказалось GL_EXT_gpu_shader4 (нижняя граница совместимости для которой я пишу) не поддерживает GS инстансинг (invocations). За один проход стрипами не вытянишь силуэтные грани. Сука.
Я спиздел. Всё делается за 1 проход. Замутил Carmack's Reverse на z-fail. Пришлось правда перенести все мешы на TRIANGLES_ADJACENCY.
Тебе, по идее, нужно тагент посчитать и его тоже на ГПУ загрузить (как и вершины и текстурные координаты, например)
И вот таким шейдером рисовать
http://pastebin.com/ZJUcY5YA
https://web.archive.org/web/20080512083730/http://www.terathon.com/code/tangent.php
Моделька не замкнутая, поэтому иногда течет. Думаю все же на шедоумапах остановиться. Вот для примера PCF4x4 на 2 скрине. Еще немного поэксперементирую со всякими variance.
А если какой-нибудь FSAA наложить, может норм будет?
Сам сейчас курю тему с тенями, нашел один интересный документик про теневые карты: http://cg.ivd.kit.edu/publications/2015/sssm/StochasticSoftShadows.pdf
Если коротко: обещают за хорошее время рендерить тени достоверного вида.
Добра тебе няша, буду разбираться. Хотя как-то жирно для хелло ворда, я ожидал строк 50. Надеюсь ты меня не обманул.
Kek. У меня значит не-БФГ, там оно GL_CheckErrors( void ).
И проверяет не 15, а 10 ошибок. Вообще пушка. Кармак, как ты мог такую хуйню написать?!
Охуел? Кармак - бог.
Можешь глянуть что теперь он пишет.
https://github.com/SoylentGraham/VRLib/blob/master/jni/GlUtils.cpp#L543
Алсо, кстати интересный момент.
Вот в индустрии есть крутые чуваки которые делают годные вещи и вообще они люди опытные, много чего написали и попробовали.
Интересно читать их статьи и какие-то наблюдения, но не всегда можно посмотреть их код.
Ну как-то вдохновиться им, какие-то интересные моменты найти для себя: "Блин круто! Я даже не думал, что так можно написать" и тд и тп.
>github
Вот так я как раз и думал переписать эту функцию - while, пока все ошибки не собраны. Видимо прошлую версию все же не он писал.
>посмотреть их код
ИМХО Кармак действительно один из немногих, чей реально рабочий код можно вот так просто увидеть. Еще есть утекшие исходники HL2, но это по сути наследие Кармака (Quake 1 -> GoldSRC -> Source).
Правда мне больше хотелось бы видеть статьи с разборкой рендера как в блоге http://www.adriancourreges.com/ - там разобраны Doom 2016, Deus Ex HR, GTA 5 и Supreme Commander.
Скачиваешь renderdoc и разбираешь. Совсем дурак чтоли.
> Видимо прошлую версию все же не он писал.
Прошлая версия писалась лет 17 назад. Она просто перекочевала в Дум.
https://github.com/id-Software/Quake-III-Arena/blob/master/code/renderer/tr_init.c#L241
Большое спасибо, анон!
Всё это обязательно указывать? В других примерах такого не вижу.
Ну вообще вроде как в документации написано, что атрибуты инициализируются какими-то базовыми значениями.
Я написал просто чтоб было.
Может закомментировать и глянуть как будет работать.
И да,
> #include <GL/glew.h>
Везде вижу использование всяких glew/glu/etc. Зачем? Это же надстройки над opengl. Почему нельзя писать на чистом opengl? Поясни пожалуйста за это.
> Почему нельзя писать на чистом opengl? Поясни пожалуйста за это.
Тебе придётся вручную получать адреса функций опенгла, писать константы какие-то и тд.
Ну а библиотека glew всё делает сразу за тебя.
Нашёл хороший сборник ссылок про то, что касается опенгла сразу на одной странице.
https://github.com/eug/awesome-opengl
Это нам позволит сократить шапку раза в полтора.
Стоит ли повесить её?
Весь день тупил в эту пасту, opengl сложный, не могу понять принципа рисования. Вот есть у меня SDL-окно, opengl и glew тоже инициализировал, как мне нарисовать квадрат 40x40 пикселей? Как с пикселями вообще работать? Аноны, спасайте, голова пиздец болит, сложно-сложно-сложно.
Зачем тебе работать с пикселями? OpenGL работает с треугольниками. Переключай голову.
Да можно, работай с пикселями, нах - https://www.opengl.org/sdk/docs/man2/xhtml/glDrawPixels.xml
Потом ты скажешь, что OpenGL тормозной, что уеч быстрее спрайты рисует и ты уйдешь из этого треда так и не узнав, что спрайты сейчас рисуют при помощи текстурированных треугольников.
Это не то. В том примере, про который я слышал меняли opengl'овский 0.000 и 1.000 на обычные пиксели, в итоге можно было юзать всё как раньше, но размеры указывать в пикселях. Там что-то с glMatrixЧётотам было. Я хочу рисовать текстурированные треугольники в пикселях!
Делай матрицу масштабирования с размерами клиентской области, будет тебе натягивание совы на глобус^H^H^H^H^H^H^H^H^H^H^H^H^H^H нормальных координат на оконные.
И все же, прекрати ебать себе могзги, положи их на место и пользуйся по назначению. Что у тебя там, клон марио-террарии-метроидвании с пикселяртом и претензией на олдскул, что ты так в оконные координаты вцепился?
> Делай матрицу масштабирования с размерами клиентской области
Блядь, а можно конкретней? Яж не разберусь.
> прекрати ебать себе могзги
У меня просто 2D игра, зачем мне что-то помимо пикселей?
Блин. Ты треугольник хотя бы нарисовал уже? А то я не знаю, на каком языке с тобой вообще говорить.
>Яж не разберусь.
>У меня просто 2D игра, зачем мне что-то помимо пикселей?
Ну нахуя ты в OpenGL-треде вообще? Надо чтоб "Стильно, модно, молодежно", так что ли?
Сри через GDI пикселями своими, раз не хочешь про то как в OpenGL слушать.
https://msdn.microsoft.com/en-us/library/windows/desktop/dd145078(v=vs.85).aspx
> Ты треугольник хотя бы нарисовал уже?
Нет, там двумерный массив, а это страшно, сложно, я решил отложить и изучить теорию.
> Надо чтоб "Стильно, модно, молодежно", так что ли?
Да я вообще к трудэ не хочу прикасаться, но надо ускорение от карточки.
Алсо, "Стильно, модно, молодёжно" это вулкан, скорее.
> microsoft.com
И всё же, поясни за матрицу. Неужели я на столько сильно туплю?
Я даже не знаю, проигрывать с тебя или плакать.
Пожалуйста, начни вот отсюда (забудь про игру пока): https://code.google.com/archive/p/gl33lessons/
> забудь про игру пока
Это я умею.
> code.google.com
Зачем заливать что-то на такие анальные сайты? Без JS оно не работает, с JS тоже не работает, сукаблядь, бесит. Ладно, хватит баттхёрта, открыл в другом браузере. Буду разбираться, спасибо.
И да, у меня ещё один вопрос на счёт OpenGL, мне всю свою жизнь придётся ебать числа с плавающей точкой? Все эти флоаты, даблы, к чему? С интами нельзя будет работать? Оно же и производительность режет, и просто неприятно.
Не кормите его, это тролль.
Ух, ты на чем сидишь в 2016 году, на 486SX50MHz с 4Mb RAM, S3 Virge 2Mb, HDD 100Mb??
>Пожалуйста, начни вот отсюда (забудь про игру пока): https://code.google.com/archive/p/gl33lessons/
Виндоблядство какое-то, да и объясняет плохо. В общем я решил твою пасту переписывать. Дошел до шейдеров и охуел, сложно, но хотя бы понятно что происходит.
Пикрелейтед, сигфолт, почему? Debug1 ещё выводится, debug2 и debug3 — нет. Уже пол часа пытаюсь найти причину.
>>301886
Huintel core i7-3770, 16Gb RAM.
Не понял к чему ты это написал, поясни.
Включаю режим Ванги: shader_file после fopen у тебя на null показывает, поскольку файл с текстом шейдера не лежит там где его пытается открыть программа. По дефолту клади его пока рядом с экзешником (с путями потом будешь разбираться).
> Huintel core i7-3770, 16Gb RAM.
Нормальная тачила.
Sizeof( int ) == sizeof( uint32_t ) == 4 == sizeof( float ). Про производительность не думай пока у тебя нет вообще ничего. Ты же не пишешь песочницу с отработкой дохулиарда взаимодействий, а значит про производительность не думай пока. Кармак с float работает, значит норм.
> поскольку файл с текстом шейдера не лежит там где его пытается открыть программа
Стоп, какой файл?
> По дефолту клади его пока рядом с экзешником
Что и зачем мне куда-то класть? Он же программой создаётся, нет? Не понял немного. Зачем вообще шейдеры нужны? Я думал они для того, чтобы йоба-грофен сделоть.
> Кармак с float работает, значит норм.
У Кармака задачи другие.
Читай глазками, а не ректальным очком анальной жопы:
> После того как исходный код шейдеров написан их можно загрузить из программы и создать из них шейдерную программу. Исходный код шейдера это обычный текст, загрузить его можно как обычный текстовой файл, в исходника к статье для этого используется функция LoadFile, которая открывает файл, узнает его размер, выделяет под данные файла память и читает весь файл в память, после чего эти данные можно использовать.
Я ту статью вообще дропнул. Сейчас перечитал, стало понятнее, чувствую прилив знаний. Однако я по прежнему не понимаю где мне взять шейдеры не злись, Анончик, я туповат. Вот эта паста http://pastebin.com/raw/rWcQg0QQ генерит сраный шейдер или нет? Я же её переписываю.
>>301892
Но я же не разберусь!
>Все эти флоаты, даблы, к чему? С интами нельзя будет работать? Оно же и производительность режет
Шёл 2016й год, а дауны всё ещё не знали, что операции с плавающей точкой стали быстрее целочисленных операций ещё два поколения назад(а уже в первых пентиумах их производительность сравнялась).
Скорость.
>>301898
Разобрался! Вроде как. Результата не вижу, просто сигфолта нет. Короче вот мой инит, на который я убил полные сутки, если не больше, оно уже рабочее? Как, например, фон белым цветом залить? Мне нужен хоть какой-то результат и я съебу в мир снов, ибо заебался, вас также перестану доёбывать некоторое время.
Треугольник рисовать не хочу, эт сложно.
Функция "build_shader" полностью скопипизжена из аналогичного примера на пастбине.
>Скорость.
Т.е. тех >9000 fps, которые тебе для твоих задач будет выдавать практически любой готовый 2D движок, тебе недостаточно?
> как залить фон белым цветом
glClearColor + glClear например.
Болезный, ты сейчас спрашиваешь как написать сочинение про курочку Рябу (про "Мертвые души" или "Войну и мир" уже не обсуждаем, это недостижимая планка большинства местных кириллов), когда сам еще не заполнил палочками прописи за первую четверть первого класса, и после этого обижаешься, что тебя тут не любят. Понял?
Я пытался так сделать, ничего не работает, вот и спрашиваю что забыл.
> Понял?
Я всё понимаю, и мне за это стыдно, честно-честно, но я ведь сам не справлюсь. Вот я сейчас этот хелловорд добью и больше тут по таким глупостям какать не буду, только с хелловордом помогите.
Не угадал, SwapBuffers (если что, входит в API оконной системы, или того SDK, который юзается поверх окон).
О, круть, работает! Только в SDL это делается с помощью функции SDL_GL_SwapWindow(window), ели нашел.
съебал
640x480
const char g_vertexShaderSource =
"#version 330 core\n"
"in vec4 data;" // quad + tex coord
"out vec2 TexCoords;"
"uniform mat4 proj;"
"uniform mat4 model;"
"uniform mat4 view;"
"uniform vec4 atlas;"
"void main() {"
" TexCoords = atlas.xy + (data.zw atlas.zw);"
" gl_Position = proj view model vec4(data.xy, 0.0, 1.0);"
"}"
;
const char g_fragmentShaderSource =
"#version 330 core\n"
"in vec2 TexCoords;"
"out vec4 color;"
"uniform sampler2D image;"
"void main() {"
" color = texture(image, TexCoords);"
"}"
;
Забейте, я просто еблан, который считает координаты беззнаковыми переменными.
Почему ты решил, что он умер?
Нет, нашёл всё-таки. Надо всего-то было передавать текстурные координаты с типом noperspective.
Шейдер, имитирующий говнографику PS1, почти готов!
И где же он?
В общем решил постигать Constructive solid geometry через буферы stencil и depth, но не могу понять, почему моя сфера исчезает, когда я задаю glDepthFunc(GL_GREATER). Т.е. я ожидаю, что буду видеть задние стенки сферы, а вижу ровно нихуя.
Боюсь, что где-то фундаментально неправ. алсо GL ES2.
Чем изначально инициализирован буфер глубины? Или невидимые стенки каким-то хером не рендерятся вообще? Вырубание кулфейсов не помогает что-то увидеть
А ничо так, миллион кубов на экране без просадок на офисной интегрированной видеокарте. Можно свой майнкрафт(который на этой машине даже не запускается) пилить, лол.
Ну я же не только отрисовкой занят. Мне еще, знаешь ли, физику симулировать нужно, звук проиграть, подготовить анимацию, обработать сетевые данные и локальный ввод. Обеспечить работу геймплейных фич и ИИ. И все это тратит время, причем вполне прилично. Так что хорошо бы, что бы кадры рисовались быстрее, что бы на прочие дела времени оставалось больше.
А что такое мировое пространство ты знаешь? А объектное?
не, вот что было.
Что-то привык к undef-айнам
надо было: glClearDepth(0.0);
>Since the depth buffer values maps 0.0 to the near clip plane, and 1.0 to the far clip plane, there is no chance for any object under any situation to have a depth buffer value above 1.0. If it has, it's beyond the far clip plane and will be clipped instead. If it's not, it's value is less than 1.0 and is rejected by the depth buffer test.
красота!
Ты оппост смотрел, еблан?
понятные*
https://interplayoflight.wordpress.com/2013/12/30/readings-on-physically-based-rendering/
> Я неплохо разбираюсь в обычном PBR рендеринге, во всяких GI алгоритмах, алгоритмах семплинга, брдф
А вот на счёт этого что можешь посоветовать почитать/посмотреть?
Ну чтобы понять о чём это и ориентироваться в теме.
ну вот я подумал ок возьму от квейка, ток чот в гугл не осилил документацию как устроен мап файл что там ваще надо чтоб загрузить такую карту себе в прогу
Мне почему-то кажется, что если проект большой и там присутствуют всякие точные расчёты, то если скомпилить потом на другом компиляторе, получится нерабочая хуйня. Как минимум будут проблемы со всякими там округлениями. Хотя если использовать только GL типы, то хуй знает.
У кого-нибудь есть опыт подобный?
>2016
>программировать под шиндовс
>в студии
Как же жалко спермохлёбов, которые качают многогигабайтную VS, чтобы скомпилировать несколько десятков строк кода. И к тому же, лишены таких полезных штук, как clang и valgrind. Я вот хз как еще под виндой профилировать эффективность использования процессорного кеша. Наверное только какие-нибудь платные профайлеры от интел.
Детерминизм может иметь значение только в сетевом коде. В графике всем на это довольно сильно похуй, так как ты всё равно не сможешь наговнокодить погрешности достаточно крупные хотя бы для того, чтобы у тебя хоть один пиксель не совпал.
Короче, ты хуйнёй страдаешь.
>>307850
А вот и нитакоекакфсе красноглазое уёбище подползло. Которое студию видело последний раз, наверное, десять лет назад, и не знает, что нынче она обладает самым мощным и удобным дебаггером, до которого валгриндам срать и срать, и всё равно не просраться. И да, профилировать использование процессорного кэша она тоже умеет. И загрузку процессорных каналов показывает. И распределение инструкций по ядрам. И скомпилированный код вплоть до уровня машинных кодов. И ещё много чего, но ты же ведь всё равно не поверишь, а посмотреть и убедиться сам не можешь, потому что ставить окнеблядиксное говно принципиально не будешь(экспресс-версия которого весит 160мб, хуй знает где ты гигабайты нашёл)?
Вот и пиздабол подъехал.
Во-первых, выпуски express устарели лет на 6 и уже давно не поддерживаются. Они более чем всраты, никакого вразумительного дебага ты там не найдешь, а компилятор даже с++11 поддерживает не полностью.
Во-вторых, дебаггер самый обычный, ничем не отличающийся от оного в любой опенсорсной среде типа codelite или qt creator.
В-третьих, попробуй поставить visual studio 2015 community, и охуеешь от размера, минималка (только цепепе, без шершавого и тулзов для мобилок/веба) выйдет в несколько Гб. Полный комплект исчисляется уже десятками гигабайт.
анон можешь посоветовать примеры структур файлов моделей, карт, шейдеров.
Например лучше модель хранить в одном запакованом файле, или в папке где обж файл, текстурка рядом лежит и прочие вещи. Или в одном гиганском файле хранить все модели. Такая же фигня и с картами.
Алсо вопрос по шейдерам, шейдер привязан к карте, или шейдер больше относится к модели? Тоесть мне на каждую модель хранить шейдер? или например внутри шейдера построить условия например что мне нужно на одной модельке сделать рефлекшн, а на другой не нужен он, мне передавать в шейдер булевую униформу? как вообще с шейдером работать, при наличии множества моделей в сцене.
Книжки из оп поста и сайты смотрел, большинство из них рендрит треугольник а потом начинает сразу рендрить готовые сцены, что бы описать всякие фишки работы с шейдером.
Отрендери треугольник для начала, чтобы не задавать идиотских вопросов, не имеющих отношения к теме треда.
Толсто, петушара.
В каких случаях их стоит использовать?
Например, скажем, я написал свой бичёвый аналог glm (вектора/матрицы/всякие трансформации). Что будет, если я перепишу с GLfloat вместо float?
В С и С++ встроенные типы данных могут иметь разные размеры, в зависимости от версии компилятора или платформы. Использование псевдонимов позволяет повысить платформонезависимость.
Хотя сейчас это и не так актуально для ПК.
Не нужны, это костыль для устаревших платформ.
...Но все равно получается криво. Ты, либо, разрешение текстур подними, вместе с размерами экранного буфера, либо разрешение карты нормалей сделай соответствующим.
еблан, блять, пиздуй на филфак.
Не, это я параллакс мэппинг хуйнул, но поначалу проебался с инвертированными координатами и тем, что текстуру высот без сглаживания скармливал(охуеть артефакты от этого лезут). Плюс у меня все текстуры в одном атласе, и если для цвета и нормалей тайлить всё норм, то для текстуры глубины я пока так и не могу окнчательно избавиться от шакальных артефактов на стыках. Похоже, придётся для глубины каждый тайл отдельной текстурой делать всё же(которые, впрочем, всё равно можно нарезать из одного файла прямо в коде).
насколько помню в ярости мегатекстуры всем кускам текстуры ещё в "атласе" (что и есть мега-текстура) обрезали не по рамке, а ещё толи 16 пикселей "за рамкой" оставляли чтобы артефактов не было
возможно это твой случай
> Шутан. Хотя кого я обманываю, движок я пилю.
Прикольна. Я тоже время от времени делаю, лел.
Ищи в треде вебмки, они мои, лел.
Охуеть, два дня с этой хуергой трахался, но подебил таки.
Итого выяснилось, что артефакты на стыках лезут не из-за протекания текстур, а из-за того, что на стыках неправильно определяются ЛОДы, и берётся мипмэп не того уровня, как остальная текстура.
Проблема известная, но только вот почти нихуя не описанная нигде. Лечится обычно хранением в атласе текстуры в четыре раза большего размера, но я вылечил просто отключением нахуй мипмэпов, так как всё равно вместо текстур у меня гигантские говнопиксели, выглядящие одинаково на любых имеющихся расстояниях.
В отдалении эти пиксели будут выглядеть ещё хочу без мипмаппинга.
Хотел задать вопрос, но пока писал - сам придумал ответ, проверил - работает, всем спасибо, идите нахуй.
Молодца, всё правильно сделал.
Все, разобрался. Надо просто на каждый фрейм создавать новую матрицу view.
То есть, если я не могу что-то осилить, значит нельзя к этому прикасаться? А какие базовые вещи ты подразумеваешь - матрицу поворота, представляющую из себя ебаное нагромождение тригонометрального хаоса?
А вообще я уже разобрался, просто гуглил немного неправильно.
Пока ты не знаешь базовых вещей (линейной алгебры), к написанию трехмерного движка прикасаться нельзя, все верно.
Речь о линейной алгебре и шла, болван. И да, все детали знать все равно невозможно. Никто и не мог подумать, что поворот можно описывать несколькими разными способами, ведь ни в википедии, ни в некоторых учебниках, приведенных в шапке об этом не было сказано ни слова.
Учитывая, что в первом же туториале из шапки это подробнейшим образом расписывается со всей математикой, то болван тут только ты. Иди уже возьми юнити, там всё за тебя сделано.
Только после всех правок и отладок мне самому на геометри шейдер смотреть страшно теперь.
Есть такое. Чтобы нормально выглядело, теперь надо нарисовать приличные спрайты травы(а не взять первый попавшийся из гугла), добавить освещение, анимацию и тени на переднем уровне. А то пока что свет считается банально по нормали земли.
>>313061
Ничего не пилю. Просто нарабатываю скиллы и изучаю возможности.
Можно ли напрямую попиксельно выводить в color buffer?
Дело в том, что это и есть один из самых производительных способов.
>Статичную?
Нет. Есть поток изображений от прибора (рентген-аппарт), нужно наложить на них некоторый цифровой фильт и показать результат в окне. Так как скорость потока заранее неизвестна, нужно позаботиться о производительности в самом нагруженном случае. Может есть достатчно быстрый способ выводить в идеопамять (без OpenGL), желательно с двойной буферизацией?
>Двумя треугольниками с текстурой
Не понимаю. Какие треугольники и текстура? У меня нет 3D моделей, у меня - 2D изображения.
Не бейте сильно - я раньше с графикой не работал.
Тебе нужно просто выводить прямоугольник с текстурой, как тут: http://www.learnopengl.com/#!Getting-started/Textures
3D это 2D с еще одним измерением.
Обрабатываешь свой результат, как тебе нужно, а потом просто делаешь из него текстуру и загружаешь.
Ты уверен, что тебе нужен OpenGL? Может тебе и какой-нибудь GDI+ подойдет?
Лечится текстурными массивами. Тоже когдато ебался с атласами и протеканием в мипах. Потом забил и перешел на Array Texture.
ВебГЛ - это отличная идея для демоверсий, например, чтобы не парить юзера качанием бинарника и установкой его на свой компьютер, а ты - ёбаный даун.
Опа! То ли я слепой, то ли мне подсунули табличку с ошибкой, когда я их доступность смотрел.
Отлично, пошёл опробовать.
>Ты уверен...?
Нет, не уверен.
>OpenGL или GDI+
А как у GDI+ со скоростью и двойной буферизацией?
И вот ещё вопрос к профессионалам. Как согласовать частоту кадров (и моменты производства кадров) с частотой работы видеосистемы? Может быть видеосистема может посылать какой-нибудь сигнал о том что нужно, чтобы приложение срочно выдало ей следующий кадр (не знаю как правильно сформулировать)?
google vsync
https://bitbucket.org/pinkierton/dgl/src/41e0d5fb8eca4f2431d0bbeb55280e43c07d644c/app02/source/app.d
167:0
Суть - нихуя не работает матрица перспективы. Перепробовал и считать ее в функции, и подставлять константную - хуй там плавал, черный прямоугольник.
Если заменить на единичную - разумеется все работает (это же все равно что ее и нет), но тогда нихуя нету перспективы - как камеру от объекта не удаляй, он сука всегда одного и того же размера.
Объяви свои брушбоксы глобально (за пределами функции) или сделай их статическими.
У тебя на 9 и 10 строчки идёт объявление функций же.
Чего это? Пользуюсь сам, брат жив. Вещь просто незаменимая.
у тебя усеченная пирамида начинается на расстоянии 1.0 от камеры, а объект находится на расстоянии 0.5.
а как альтернативу, но годную, что использовать?(меня в гугле забанили, моск кипит немного)
не слушай этого дебила, если разрабы сказали использовать cmake, значит используй cmake
SCons, WAF, как альтернативу, одного поля ягоды
> не слушай этого дебила
Программа, которая ищет (и не находит) компилятор в реестре и по захардкоженным путям, в то время, когда он настроен и есть в PATH, просто не заслуживает аргументированного обсуждения.
>как Cmake юзать
в твоем конкретно случае
http://www.glfw.org/docs/latest/compile.html
а лучше не выебываться и скачать уже готовый билд
http://www.glfw.org/download.html
Я уже решил не ебаться с Cmake.
Пишет вам полный GL ньюфаня. Вопросов есть у меня.
1. Я пытаюсь нарисовать плоскую картинку из квадратных спрайтов по типу как на пике. Для этого я прохожу в цикле по всем тайлам и каждый накладываю, как текстуру. В принципе получается нормально, но только тогда, когда размер текстуры в пикселах совпадает с размером области ее наложения. Когда я пытаюсь зумить изображение, оно превращается в тыкву, текстуры уродуются и становятся заметны швы между ними. По-видимому, как-то нужно это дело сглаживать. Как?
2. У меня есть условно неподвижный пользовательский интерфейс на переднем плане и некий 2д вид на заднем, который может двигаться и отдаляться. Сейчас я использую для всего одни фиксированные координаты по типу
GL.Ortho (0, w, h, 0, -1, 1);
GL.Viewport(0, 0, w, h);
Мне приходится заниматься неудобными пересчетами координат. Подозреваю, что есть более рациональный способ это организовать. Как?
3. Мне приходится рисовать линии и точки. Я освоился со стандартными методами вроде GL.Begin(PrimitiveType.Lines);
Но все нарисованное выглядит пиксельно и убого. Хочется рисовать красивые плавные линии ( к примеру, с градиентом цвета от середины линии к краям в перпендикулярном направлении). Как это делать?
Пока все, может потом еще вспомню.
Спасибо.
Во-первых, всё, что ниже GL 3.3 выкинь на помойку.
Во-вторых, для какого-то простого 2д лучше юзай SFML.
Там, кстати, есть возможность использования шейдеров.
Ну так возвращайся, когда выучишь, дебил.
наверни, блджад, хотя бы десяток уроков, все вопросы отпадут сами
Опенггл это набор си функций. Практически любой язык поддерживает вызов си функций из себя. Вот к примеру один такой список: https://www.khronos.org/opengl/wiki/Language_bindings первая ссылка в гугле.
Естественно ты не найдёшь материалов по этим библиотекам. По сути там просто обёртка вызова аналогичных си функций из твоего языка программирования. И что бы написать, что то на нужном тебе языке тебе нужно: Знать какую функцию ты хочешь вызвать на си - это написано в книжках по опенгл и не важно на каком языке все функции всегда вызываются одинаково. И знать как запись этой функции выглядит в твоём языке, это написано в мануале библиотеки обёртки. Конечно некоторые библиотеки поддерживают всякие плюшки, но об этом написано отдельно в их мануалах.
Просто делаешь сетку и отрисовываешь.
Если есть какие-то арф. ошибки в посте, то сори
char * vertexShaderSource;
Не забудь в нее исходник шейдера положить, а то компилировать нечего будет.
спасибо, с меня пиво
если убрать все из рендера и оставить только очистку буферов все равно падает?
сообсвенно вопрос , как это исправить.
>предварительно отсортировав, начиная с дальних от камеры.
т.е. каждый квад прорисовывать отдельно( я прорисовываю пачкой).
GL_ONE, GL_ONE_MINUS_SRC_ALPHA
>скармливай ему в каждом кадре сортированный набор точек, пусть он из них генерит квады.
так я и делаю, только скармилваю не отсортированный.
>Советую подумать насчет сортировки частиц. Если их не 10кк, то можно быстро отсортировать, только не пузырьком, я например предпочитаю поразрядную сортировку - время почти O(n), только памяти жрет примерно дополнительно 200% от исходного массива, если делать побитово.
частиц всего 5к
использую движок, там он немного специфичен
http://rgho.st/8fWZFQMSr
лол, убрал дискард
сделал
>умножением обоих параметров на коэффициенты в районе (0.7;1.0).
и стало не плохо
ага
спасибо! пока без сортировки и ZWriteEnable = false ( не пишем в буфер глубины , что бы убрать просвет)
выглядит довольно таких приемлимо
Слушай, сделал сортировку
но все равно если писать в буфер глубины, то получается херня как на скрине, только теперь с другой стороны( ну раньше грубо говоря смотря слева так было, теперь справа)
и еще , ровно в центре моей текстуры
вот такая поебота , фпс на ней падает в 100-150 раз!
не знаю откуда она и как ее убрать( думал там много частитиц алгоритм нагенерил в одном месте, сделал сортировку на выброс рядом стоящих и одинаковых , но не помогло)
проблему не решило(
>Пацаны правда уже на вокселях и с самозатенением делают
пробовал я делать на вокселях
производительность полная дерьмо
1024x576
вот видос, что выходит.
разницу в 1 частицу не получится сделать, ибо генерируется все процедурно.
1024x576
а вот так, если не писать в zbuffer.
>Пока поэкспериментируй с их яркостью и прозрачностью, помнишь про домножение итоговых частей вектора цвета во фрагментном шейдере?
Помню-помню)
я еще за освещение не брался.
>И еще имеет смысл добавить прозрачность при приближении к камере
а как это сделать?
>В конце надо домножать альфу на одну хитрую функцию
у меня кстати еще трабл, у меня ща альфа умножена на 0.7
если умножать на меньшее значение , текстура начинает светиться по ебаному , ща покажу
вот такое вот дерьмо
помогло
кто такие последние 3?
ну у меня ~4к вершин на облако
наверное надо поменьше
ну и функцию которая их генерит надо подкрутить немного, что бы не такое круглое было.
неа
окей
бля еще ни хуя не выходит сделать его не однородного цвета
ну у меня освещения вообще нету пока
фпс ~25 это не кайф , особенно когда в сцене одни облака.
выглядят конечно они пиздато, как сделанны ?
т.е. это частицами?
Стоит ли перекатываться в кресты?
https://drive.google.com/file/d/0B5eCY5SALqIZTENvWUVkSm01LTQ/view
отпиши плиз на почту woIJRwerqANUSya8UYPUNCTUMrs'@u если есть возможность, подскажи как размутить таких облаков, хотя бы без освещение
Если, например, я установил swap interval равным 1 (в духе setSwapInterval(1)); далее, если вход в функцию SwapBuffers() произойдёт раньше чем драйвер получит v-blank-сигнал от монитора, то этот поток будет остановлен до получения этого v-blank-сигнала драйвером. Сразу после этого передний и задний буферы поменяются местами и монитор считает изобржение из переднего буфера без разрывов ("tearing"), а поток, вызвавший SwapBuffers(), будет "разбужен" драйвером. То есть приём и обработка событий (пользовательского ввода, таймера...), которые могут произойти пока первый поток "спит" (в SwapBuffers()), нужно производить в других потоках. Если же драйвер получит v-blank-сигнал раньше, чем будет вызвана SwapBuffers(), то поток, вызвавший SwapBuffers(), не блокируется, буферы меняются сразу же, ну и тк делее.
Это всё верно, или нет?
Не очень понятно, поток будет остановлен точно внтри SwapBuffers(), или есть вероятность, что он может проскочить дальше?
Или может все же как-то можно передать флажок из шейдера?
Текстурки кривые, описать формально сложно.
Так-то, конечно, и без gpu не с хер задержка в двадэ-то, но хочется чтоб малейшее соприкосновение на экране детектилось. Да и спортивный инетрес.
Мб в дальнейшем будут тысячи невыпуклых фигур -- поди посчитай все!
Видеокарта для такого не подходит из-за сильных задержек и доступа через PCI-E. Сделай софтовый растеризатор с консервативной растеризатором, должно выйти если не годно, то хотя бы забавно..
С пылесоса пишешь?
Нормально никак, ведь тебе нужен не только факт столкновения, но и информация о столкнувшихся объектах?
Но через жопу (glReadPixels, occlusion query) можно попробовать:
https://www.opengl.org/discussion_boards/showthread.php/180072-Pixel-perfect-collision
http://stackoverflow.com/questions/16416955/2d-pixel-perfect-collision-detection-with-opengl
Еще можно попробовать рендерить в текстуру, которую одновременно использовать в качестве семплера, как-то кодируя в фрагметнах пересекающиеся спрайты, но разработчики стандарта говорят, что так делают только мудаки и поведение будет непредсказуемым:
https://www.khronos.org/opengl/wiki/GLSL_:_common_mistakes#Sampling_and_Rendering_to_the_Same_Texture
если setSwapInterval(1), и SwapBuffers() ждет двух событий: когда закончится рендер и затем v-blank-сигнала, пока эти события не произойдут поток заблокирован.
> То есть приём и обработка событий, нужно производить в других потоках.
Если нужно управление, пока рендер тупит, да, нужно всю параллельную обработку выносить в параллельный поток.
Вот тут чувак придумал костыль, с использованием glDeleteSync, нахуя не знаю, но может пригодится.
http://stackoverflow.com/questions/5829881/avoid-waiting-on-swapbuffers
> GL.Begin(PrimitiveType.Lines);
Забудь. OpenGL 4.0 Core Profile + GLSL - это твоя дорога.
> Для этого я прохожу в цикле по всем тайлам и каждый накладываю, как текстуру
Текстурные атласы используй. Это более гибкий способ, карту можно, например, хранить в текстуре: один пиксель - индекс тайла, тайлы отрисовывать на плоскость на лету из атласа. (Кольцо вычетов по модулю - наше все, да)
>Когда я пытаюсь зумить изображение, оно превращается в тыкву, текстуры уродуются и становятся заметны швы между ними.
Не хрена не понял из твоего описания. Просто зумить текстуру ты можешь матрицей в вершинном шейдере, но разумеется, она будет обрезаться / уродоваться (в зависимости от настройки границ) по границам полигона на который ты её натягиваешь. Если ты работаешь с тайлами, зумь полигоны, а текстурные координаты не трогай.
> Мне приходится заниматься неудобными пересчетами координат.
Нахуй не надо ничего пресчитывать (в твоём случае). Умножение в вершинном шейдере геометрии на одну-две (если с вращением) элементарные матрицы выдранные из википедии решат твою проблему. Не забывай, что умножение матриц некоммутативно (некоммутативная группа по умножению, да).
> Хочется рисовать красивые плавные линии
Это отдельная песня. Можно формировать точки для сплайна на Си и рисовать линии шейдером, но что бы они были красивые и плавные точки надо брать опираясь на производные - чем резче изгибы, тем быстрее меняются производные, тем чаще выбираешь точки. Можно хуярить сплайны прям в шейдере, но придется ебашить построцессингом и рендерить во фреймбуффер, да и циклы в шейдере - вещь дорогая.
> Пока все, может потом еще вспомню.
В какой среде хуяришь? Видюха какая?
В пиксельном шейдере при отрисовке кота заменяешь условный цвет глаз, на тот который передаёшь снаружи через uniform переменную.
Более нормальный подход: используешь для задания цвета смещение его в спектре в цветовой модели HSV/HSB, нак удобне поменять желтый на зеленый с оттенками. Для обозначения областей можешь использовать альфа-канал, размечая разные области для закраски можешь использовать альфаканал.
Первые же ссылки в гоголе:
haskell : https://wiki.haskell.org/OpenGLTutorial1
ruby : http://ruby-opengl.rubyforge.org/tutorial.html
Опять забанили за порнуху?
Хуя ты молодец. Еще возмущаешся, что детерминированная машина из-за твоего косяка видишь ли не работает. Охуенчик.
Бля. У тебя лог ошибок для того и дан, что бы ты читал, что там написано.
Возьми любой физический движок и заюзай библиотеку обнаружения столкновений из него. Для столкновений уже давно придуманы быстрые алгоритмы, не надо изобретать велосипед.
Шта?
это воксели?
Хуй знает, туда ли вкатился, но попробую. Решил попробовать попипасть под ГейОСь на СДЛ, запилил по первому попавшемуся туториалу окошко - а в нем какие-то артефакты, и хуй знает, нормально ли это и как их убрать. SDL_RenderClear пробовал, не помогает.
Что я делаю не так?
Такс-такс, у меня прошка 2011 года, там таки АМД. Ты же не будешь мне намекать на ЗАПЕКАНКУ? В играх-то все нормально.
>>369010
Отсюда:
http://lazyfoo.net/tutorials/SDL/02_getting_an_image_on_the_screen/index.php
> Отсюда
Потом выше ты привёл функцию SDL_RenderClear
Эта функцию из SDL2, а ты даёшь ссылку на урок по SDL1
Зачем?
Я про гры ни слова не написал.
В любых других областях используют движки. Или ты думаешь что NASA отрисовывает треугольники и изучает GL_BLENDы, бесконечными списки ARB констант и всякое говно вида glEnable glDisable.
> Я про гры ни слова не написал.
> /gd/
> движкописатели
Да, наверное, ты говорил про аэродинамику.
</thread>
Бери сразу какой-нибудь ImageMagic или DevIL и проблем знать не будешь, как с каким-нибудь libpng.
Я этот хедер глянул, ебать они его на 7 тыщ строк развели...
У меня взлетело. Сейчас подпиливаю к ним Bullet
>FreeType
В нём метода нарисовать_заебись(строку), рисует он исключительно по буквам, а потом эти буквы ещё и в слова собрать нужно будет. Это только кажется тривиальным, пока не знаешь, что такое кернинг и лигатуры (а если ещё захочешь для жирного саудовского рынка что-то напедалить - тогда вообще можно будет повеситься с арабским письмом).
Короче, использовать нужно harfbuzz.
>Хорошо, для шрифтов - FreeType.
Нахуя этого монстра тащить? Для всего хватает stb_truetype, да и свой рендер навелосипедить - дело пары недель.
Сделать консоль как в квейке.
uniform sampler2D texture;
main()
{
if(texture == ???)
.......
чтобы переключить подсветку. Какие там значения возможны-то?
Спасибо за предложение. Проблема вот какая была:
кручу через шейдер, если текстурки не передаю, то всё чорное.
Нужно было, что при отсутствии текстур, fragment shader считал хотя бы то нормалям отражённый свет.
Решением было (как советовали на ссылке), делать вкл/выкл через uniform
Сделал вот так:
uniform float no_tex;
void main()
{
//
if(no_tex == 0.0)
{
ct = vec3(1.0, 1.0, 1.0); // fiat lux cykablat!
at = 1.0;
}
else
{
ct = texel.rgb; // from the texture
at = texel.a;
}
gl_FragColor = vec4(ct cf, at af);
}
Спасибо за предложение. Проблема вот какая была:
кручу через шейдер, если текстурки не передаю, то всё чорное.
Нужно было, что при отсутствии текстур, fragment shader считал хотя бы то нормалям отражённый свет.
Решением было (как советовали на ссылке), делать вкл/выкл через uniform
Сделал вот так:
uniform float no_tex;
void main()
{
//
if(no_tex == 0.0)
{
ct = vec3(1.0, 1.0, 1.0); // fiat lux cykablat!
at = 1.0;
}
else
{
ct = texel.rgb; // from the texture
at = texel.a;
}
gl_FragColor = vec4(ct cf, at af);
}
это для меня сейчас временная мера, пока не разобрался, как решено с текстурами у второй модели.
Первая - PMD, вторая - PMX. Но японец, написавший парсер, сваял два класса с несовместимыми по духу структурами данных.
Поэтому во второй ещё ничего не биндится совсем.
Вообще у меня такое чувство, что моя прога - куча из OpenGL версий от 1 до 3.1. Эти говна ещё раскидать надо будет
Текстуру тебе надо всегда передавать во фрагментный шейдер.
Если, например, хочешь отключить отображение текстур на мешах моделях либо делай отдельный шейдер либо передавай прозрачную текстуру.
> Вообще у меня такое чувство, что моя прога - куча из OpenGL версий от 1 до 3.1. Эти говна ещё раскидать надо будет
Лучше пиши сразу на 3,3+ версии
>Текстуру тебе надо всегда передавать во фрагментный шейдер
туда и передаю
>Лучше пиши сразу на 3,3+ версии
какая альтернатива для gluSphere, gluCylinder и т.д.
У меня есть необходимость рендерить в 3д пространстве большое количество плоских поверхностей с составным содержимым. Можно воспринимать это как карточки, они могут состоять из большого количества слоев - фон, рамка, текст, элементы декора. Порядок слоев определен. Плоскости могут быть повернуты в пространстве.
Я не могу рендерить каждую вариацию в свою текстуру (или в одну мегатекстуру), на это уйдет вся память, их может быть около 1000 разных и каждая должна иметь разрешение в районе 1000х1000х32бпп, а это уже 4гб. Я хочу найти способ как мне эффективно рендерить слоеные плоскости в трехмерном пространстве. Может быть есть известные решения? Можно, наверное, их постоянно сортировать и рисовать без z-буфера, но я не знаю насколько это эффективно (учитывая что они довольно часто перемещаются в пространстве, хотя камера в основном неподвижна).
> плоских поверхностей с составным содержимым. Можно воспринимать это как карточки
Что это значит?
Анон, у меня вопрос простой.
Как посчитать матрицу вида?
Работающую камеру брал отсюда: https://code.google.com/archive/p/gl33lessons/
А там она на матрицах, а не на векторах.
Как ты себя реализовывал эту матрицу?
https://www.youtube.com/watch?v=nLnqnB4QU-4&index=51&list=PL0AB023E769342AFE
классные тьюториалы у него
заль, что уже года 3 не появлялся...
Ну смотри, у тебя есть карточка. У нее есть рамка, рисунок, подпись. Все это в каком-то лэйауте лежит на плоском кваде. Вот лэйаут задается набором квадов, лежащих в одной плоскости. У каждого лэйаута свои размеры и своя текстура.
Это как слои в фотошопе, только разного размера, а не каждый слой по размеру листа.
Ну сами текстуры можешь хранить в GL_TEXTURE2D, а в GL_TEXTURE2D_ARRAY.
А при помощи инстансинга рисовать свои плоскости.
Но квады лежат в одной плоскости, там будет z-tearing, если включить z-buffer. А если выключить, то придется на каждое движение все сортировать.
Это костыли. Если объект будет достаточно далеко от камеры, проекционная матрица съест всю точность и будет тот же z-fighting. А если делать отступы с рассчетом на дальность, то при приближении они будут слишком большими.
Я уже писал что это займет слишком много памяти. Такие тривиальные решения я и сам рассматривал, я ищу что-то более глубокое.
Рендери свои квады тогда на определённом расстоянии друг от друга и мастурбируй.
Чем ближе квад к камере тем он меньше.
И если смотреть под определённым углом то будет казаться, что они все в 1 плоскости.
Я считать умею.
>проекционная матрица съест всю точность и будет тот же z-fighting
http://outerra.blogspot.ru/2012/11/maximizing-depth-buffer-range-and.html
Ну, можно и VBO мацать. Я про то спрашивал, не перданут ли их из стандарта, продумав замену.
О своей махарайке: парсю японские PMD/PMX. Как и везде, материалы и прилежащие текстурки относятся к отдельным частям модельки.
То есть для рисовки прокручиваю список материалов, для каждого ставлю свет, альфу, текстуры. Эта часть выглядит как из прошлого века при том, что вершинки с нормальками рисуются через VBO/VAO.
У всех с материалами/текстурами такая же фигня (ручками блеат) или я делаю через жёпу?
Мне кажется ты не очень понимаешь что делаешь и что за что отвечает.
То есть помогает с вершинами, нормалями, цветами. Текстуры и материалы как бы этим методом не покрываются. Их ручками.
>Я про то спрашивал, не перданут ли их из стандарта, продумав замену.
Ты собираешься делать свою игру дольше 20 лет?
В том, что у тебя стейт не глобальный, а локальный.
Вот анон подтолкнул меня к одной мысли.
Надо ли при перекате делать подробное шапку?
Не однократно в треде всплывали дауны которые упорно не видят шапки.
По факту то ведь, с появления первых игор на вулкане уже прошло более года, и, насколько мне известно, вулкан - новое название для OpenGL Next, то бишь дальше 4.5 версии он не пойдет?
Думаю теперь, а не стоит ли заранее начать изучать новую технологию.
Vulkan пока что не имеет костылей, в отличие от OpenGL. Но, видится мне, с развитием технологий он, как и GL, неизбежно их приобретет. А сам OpenGL забрасывать не планировали. Его будут саппортить еще лет 20 как минимум.
Видел шапку, но в ней мало конкретики, порог вхождения довольно высокий. Извините если грубо ворвался в тред, просто заметил дружественную атмосферу треда и попросил пояснить по хардкору. Разбираюсь в графоне и фичах, сам тридешник, но очень хочется получить знания богов индустрии, благодаря которым мы, холопы тут без сарказма существуем.
> но в ней мало конкретики, порог вхождения довольно высокий
Поясни что значит "мало конкретики" и "порог вхождения довольно высокий".
Блджад, в шапке первая же ссылка в разделе туториалов:
http://www.learnopengl.com/
Всё разжевано и положено в рот. Куда уж ещё проще-то?
Здорова, бандиты. Не совсем по теме, но посоветуйте какую-нибудь годную либу для звука, чтобы поддерживала максимальное количество платформ, была без LGPL-параши в лицензии и поддерживала статическую линковку.
Не знаю. Ты чего такой злой?
SDL?
Кокос2д не хочу, потому что пошел он нахуй, вот почему (а на самом деле у него кучка довольно неприятных и я даже сказал бы ебаненьких багов)
Да я хочу по-минимуму чужие библиотеки в проект таскать, я даже от zlib отказался.
Вот именно поэтому и stb_image. Оно легче и компактнее upng, и лицензия "делайте что хотите, мне похуй".
sdl_ttf
>>387703
Да, stb_image явно лучше upng - поддержка куча форматов и плюх вроде интерлейсинга. Разве что собирается долго - аж целых две секунды. Есть вопрос по блендингу - появилась какая-то непонятная для меня вещь:
Сначала включаю glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA), рендерю свет. Потом - glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA) и рендерю соника - но вокруг него вдруг появляется какая-то левая рамка, причем разная для разных изображений.
Знаю, что двухмерный свет надо делать по-другому - сначала рендерятся предметы, затем отдельный черный фреймбуфер для сплошной тени, потом из него вырезаются кружки света, и уже потом он рендерится поверх всего остального. Но все равно интересно, отчего такое происходит.
Хоть в какую сторону копать?
массив под текстуру просто в коде заведи и всё
Передавай массив в glTexSubImage или как там эта функция называется.
Двачую вопрос.
Не проблема, в общем-то, главное, чтобы зашло.
>Хм, вижу, что там и рендеринг шрифтов есть
Неужели рисовать текст так сложно? Велосипедный SDF рендер текста пишеться за пару дней. За неделю можно написать лейаут для рич текста.
Но зачем? Велосипеды велосипедами, но зачем решать задачу, которая была тысячу раз решена для тебя и существуют проверенные, вылизанные до мелочей решения, лучше которых ты всё равно не сделаешь?
>которая была тысячу раз решена
С чего ты взял, что она решена? До сих пор нет нормального способа векторную графику рисовать целиком на видяхе. С текстом такая же хрень.
>существуют проверенные, вылизанные до мелочей решения
Которые тянут тысячи зависимостей и которые ты заебешься собирать под нужные платформы.
>До сих пор нет нормального способа векторную графику рисовать целиком на видяхе.
Настало время прохладных историй.
Приятно, наверное, ощущать себя дебилом, сидя в треде про OpenGL и утверждая, что нет способов рисовать векторную графику на видяхе?
>>389372
У того же stb_truetype 0(ноль, нуль, зеро, О с черточкой, нисколько, ни одного, отсутствуют) зависимостей, кроме CRT(но блеать мы не на ассемблере пишем, чтобы зависимостей от CRT не было).
>нет способов рисовать векторную графику на видяхе?
Представь себе, именно так дело и обстоит. На мобилках есть OpenVG, на десктопе решения у отдельных вендоров вроде NV_path_rendering, а нормальной (корректно рисующей) полностью ускоренной либы для графики до сих пор нет. Skia, например, частично на проце все рисует, direct2d - тоже.
> stb_truetype
> вылизанные до мелочей решения
Там такой же велосипедный рендер на коленке, причем тормозной и кривоватый. Она вполне может неправильно рассчитать геометрию для какого-нибудь хитрожопого глифа и нарисовать тебе сегфолт или тихо насрать в память.
Раньше в OpenGL можно было рисовать, используя не float, а integer-координаты. Тогда они означали пикселы. Сейчас, с приходом разных шейдеров, функции вроде glVertex2i устарели, не так ли (теперь, DrawElements и проч.)? Какой наилучший способ рисовать 2D в пиксельных координатах сейчас?
Насколько я понял, что бы я не передавал в вертексный шейдер, gl_position всегда ждёт флоаты в формате vec4.
Целочисленные координаты тебе не тут точно не помогут. Артефакты скорее всего от оконного менеджера идут, а не от того, как ты рендеришь.
Возможно мою проблему решит замена glfwGetFramebufferSize на glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
И как в примере с сайта GLFW:
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
glViewport(0, 0, width, height);
}
Попробую, наверно, завтра, если время будет.
https://github.com/georgy7/dtype/blob/97c9bcd66236ecdd91b6941ccae20a4669f21969/examples/base/abstract_app.d
https://github.com/georgy7/dtype/blob/97c9bcd66236ecdd91b6941ccae20a4669f21969/examples/blank1_rectangle.d
Иначе о чём без кода говорить.
Там проблема ниже, чем glfw. Где-то в wgl/xgl. Отрисовка окна происходит быстрее, чем изменение размера контекста, из-за этого и артефакты. Обычно на это все забивают, все равно через кадр все устаканивается.
Бамп воросу. После анлока буффера можно сказать драйверу что у меня там текстура, а не гонять данные туда-сюда по VRAMу?
Не вникал особо в текст, но походу то, что тебе надо.
http://www.songho.ca/opengl/gl_pbo.html
>// copy pixels from PBO to texture object
>// Use offset instead of ponter.
>glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, WIDTH, HEIGHT, GL_BGRA, GL_UNSIGNED_BYTE, 0);
PBO и прочая шняга это условности. Нужно замапить видеопамять и перегнать из системной все что нужно в любом формате. А так получается лишний оверхед на копирование. Надеюсь в Вулкане такой хуйни нет.
Надейся.
Первое что тебе придется делать в вулкане, елси ты хочешь использовать физическую память на видеокарте, - это самому перегонять кучу данных сначала в область памяти API (та же оперативка, только ОСОБЕННАЯ), а уже потом удаленными командами для видяхи коипровать их в видеопамять.
https://github.com/georgy7/dtype/commit/727bba4419c38f1646c4de227d80d84bb1bfbb56#diff-211c4ecbe22099ab129604fde1df4b2c
>>389512-кун
Код: http://pastebin.com/iZQuARGw
Потому что учи шейдеры, вот почему
Я хотел задать вопрос, но сам нашёл ответ. Нельзя between glBegin i glEnd
Почему Опенгл такой ебанутый?
Нет, почему в Опенгле такая ебанутая система координат? Впрочем это наверное моя оплошность, ведь я его пытаюсь использовать для создания 2D игры. А сам опенгл очень лёгок. Я SDL не осилил, на простом WinAPI жуткие тормоза, а Опенгл легче всего этого дерьма. Но другие библиотеки для создания 2D игры я не нашёл.
>такая ебанутая система координат?
Почему ебанутая? Как в математике: если х вправо, то у - вверх, x cross y = z, y cross z = x, z cross x = y. Все строго и логично. Плюс матрицы в памяти лежат по столбцам, что гораздо удобнее - можно сразу с векторами базиса работать.
Так SDL это обертка над opengl & directx. Он же наоборот упрощает разработку. Как он может быть сложнее, или я что-то не понимаю?
>два треугольника
хорошо. спрошу подробнее.
мне нужно нарисовать изображение с помощью примитивов и использовать его потом, как текстуру.
очевидные ответы вроде "используй fbo " мне не помогут. я не очень хорошо умею в жл.
напиши хук, который скриншоты делает.
Это же всё кресы. А в первой ссылке ещё и винда, упаси боже.
Алсо, третья версия разве не устаревшая? Сейчас же 4.5 есть.
Весеннее обострение, похоже.
Попробуй рисовать модель с записью в стенсил, а потом обычный screen space motion blur с тестом.
Смысл в том, что формируется два (на самом деле нужен один) массива, в одном даны числовые значения (values), во втором - им соответствующие параметры цвета (colors).
В текущем варианте использую готовый способ считывания файла с jpg-текстурой (готовая цветовая шкала) из библиотеки FreeImage, но это не то, нужна возможность динамического изменения её (шкалы) свойств что-то типа bitmap без файла, отдаленно
Один из шейдеров (пиксельный):
varying float VinL1L2;
uniform float umin;
uniform float umax;
uniform sampler2D texture_sampler;
void main() {
float u = VinL1L2;
vec2 tc;
tc[0]=0.9;tc[1]=0.5;
if(u<umax)
{
tc[0]=(u-umin)/(umax-umin);
gl_FragColor = texture2D(texture_sampler, tc);
}
}
Блин, спасибо большое, это то что нужно. Я чет проморгал stncil buffer, впервые узнал а нагуглить раньше чет не получалось.
Не понял что ты имеешь ввиду, но просто запиши в массив RGB данные и в функции создания текстуры указывай на этот массив.
Ладно, извини, я не разобрался.
Сейчас дошёл до матриц, хочу крутить треугольник. Везде для этого предлагают библиотеку GLM, но работает ли она под Си? На википедии написано, что это для C++, в 3.5 статей всё на C++, у неё заголовки .hpp, я не могу скомпилять прогу с ней, gcc ругается. То есть только кресты? Есть ещё какие-то библиотеки? Я бы не хотел велосипедить всё это дело, я хочу трудэ писать.
Ты говноед и не понял ещё, что кресты - ужасающее дерьмо.
У GLM же вроде была си-версия?
Впрочем, хуй с тобой, идейные пидарасы, не понимающие сути идеи, за которую борцуют, должны страдать.
Если ты не можешь добавить одну строчку в код и набрать три символа в консоли - то ты таки идейный пидарас, так что продолжай сосать.
О чём ты говоришь? О glm? Ну расскажи мне как что-то скомпилять с ним сишным компилятором. Если нет, то выражайся яснее.
Блять, у возьми и напиши сам тогда.
От написания пары десятков функций ещё никому не было плохо.
Тогда бери готовое, проверенное, и оптимизированное(вплоть до поддержки всех simd) решение, и не выёбывайся.
Да, прокатило, спасибо. Однако не нравится формат "текстурных координат" в формате 0-:-127 (допустим цветов 128), вместо 0-:-1, целочисленные, короче. Не совсем уверен, как сделать промежуточный интерполированный цвет, если координата где-то между "пикселями".
Юзал инфу из https://gist.github.com/roxlu/5090067
и частично из http://steps3d.narod.ru/tutorials/draw-instanced-tutorial.html и http://stackoverflow.com/questions/12834058/texturing-using-texelfetch
В шейдере нельзя в texelFetch задавать вещественный тип. Я конечно могу сам смешивать цвета, например, если координата 98,3, то взять координату 98 и тупо прибавить к каждой rgb-составляющей 30% от разницы между цветом[99] и цветом[98].
Просто не хочу лишний раз нагружать шейдеры еще и этим (хотя если сделать это в вершинном, то вроде сильно не скажется).
>Я бы не хотел велосипедить всё это дело, я хочу трудэ писать
Написать базовую либу для векторов/матриц - дело пары дней. Заодно и разберешься что там к чему. Хинт: инверсия матрицы 4х4 общего вида требуется в 0.0001% случаев.
> Однако не нравится формат "текстурных координат" в формате 0-:-127 (допустим цветов 128), вместо 0-:-1, целочисленные, короче.
В смысле? Можно попробовать упаковывать во float16 координаты.
Ну texelFetch для дискретных и быстрых выборок используется. Я не думаю, что твоя линейная интерполяция будет работать быстрее, чем встроенная.
Да мне бы с самим opengl сначала разобраться. А то два дня пердолился а понял ровным счётом нихуя. Сейчас всё переписал, вдумчиво, и чёто-както дошло до головы-то моей, но захотелось мне камеру повращать, а тут матрицы, бляяяя пиздеееец, сложно. И вот сейчас я кажись понял суть ШОК КАМЕРА НЕ ДВИГАЕТСЯ ЭТО ПРОСТРАНСТВО ВОКРУГ МЕНЯЕТСЯ, и надо бы воплотить всё в жизнь закрепив знания, а ты предлагаешь мне на написание своей либы отвлечься. Нельзя так делать, нельзя отвлекаться.
>а тут матрицы, бляяяя пиздеееец, сложно
Если ты матриц не понимаешь, то за трехмерку можешь даже не браться.
Если не умеешь пользоваться гуглом - тем более:
https://github.com/arkanis/single-header-file-c-libs/blob/master/math_3d.h
> Если ты матриц не понимаешь, то за трехмерку можешь даже не браться.
Ты так говоришь, как будто все с рождения гуру матриц а я особенный. Всё приходит со временем.
Спасибо.
> Да мне бы с самим opengl сначала разобраться.
Блять, да что с тобой такое?
То не нравятся ему туторы на С++, то не нравится ему шинда, то не устраивает версия ГЛа.
Может просто заткнуться и взять готовое, научиться, а потом от этого отталкиваться с понимаем что ты делаешь и к чему это приведёт?
> То не нравятся ему туторы на С++
Я запутаюсь.
> то не нравится ему шинда
Сложно.
> то не устраивает версия ГЛа.
Я не разобрался, о чём уже писал. Извиняюсь за это.
> Может просто заткнуться и взять готовое
Либу уже нашёл, так бы временно использовал glm.
Бля, не осиляю камеру. Может кто доставить понятный гайд по ней? Если этот гайд будет на русском, то вообще заебись.
Просто посчитать я посчитаю, а куда дальше просчёты отправлять, что с ними делать, зачем что-то с ними делать, как быть с шейдерами и т.д. непонятно. Помогите, Анончики. Нужно доходчивое объяснение.
Кресты? RAII, смартпоинтеры, исключения, стандартную библиотеку (коллекции на шаблонах, треды, файлы, строки, регекспы и т.п.), ООП в конце концов.
А ещё лучше - пиши на джаве, там всё то же, только лучше.
Ты вот сейчас шутки шутишь, а потом для своего ёба-оптимизированного движка на Ши будешь писать логику на каком-нибудь говноскрипте с багами, тормозным рантаймом, ебанутым ГЦ и прочими радостями опенсорса.
>для своего ёба-оптимизированного движка на Ши будешь писать логику на каком-нибудь говноскрипте
Да оставьте человека, пусть сам разберется. Я тоже таким был, прошло, когда знаний больше появилось.
Если ты лично настолько дебил, чтобы так делать, это ещё не значит, что все остальные вокруг тебя тоже дебилы и будут делать как ты.
То чувство, когда в джаве нет деструкторов...
Пичаль беда, хотя бы на GC деструкторы завязывали бы, а то так, как ни крути, на крестах ресурсами в некоторых случаях управлять гораздо удобнее.
Ну как, есть try-with-resource, который позволяет автоматически освободить ресурсы при выходе из блока. Для простых случаев этого достаточно.
Вот именно, что для простых, а если пилить кэш ресурсов с истекающим сроком жизни, то кресты выигрывают.
> SDL хороший выбор на 2017 год
А почему он должен быть плохим?
> нужен вулкан
В GLFW вроде бы добавили поддержку Вулкана.
> А что вы скажете?
Скажу то, что раз ты юзаешь библиотеки Qt то почему бы контекст создавать безо всяких сторонних либ того же SDL?
> А почему он должен быть плохим?
Не знаю, мне он вполне нравится, да и выглядит логичным. Главное запомнить как называются все элементы, а то без комплнетишинов тяжело писать-приходится вечно в доки лазить.
> В GLFW вроде бы добавили поддержку Вулкана.
Так это всё равно интерпритатор в API вулкана, не нужно.
> Скажу то, что раз ты юзаешь библиотеки Qt то почему бы контекст создавать безо всяких сторонних либ того же SDL?
Ты имееншь ввиду зачем мне QT? В нём удобные сигналы, и цикл выполнения. На чистых крестах пришлось бы делать что-то вроде while (true).
Или ты спрашиваешь зачем мне SDL если есть QT? В кт опенгл какой-то непонятный, почти нет документации. Ни асилил короче.
Есть мысля залить её на https://gist.github.com/ и со временем что-то убирать/добавлять т.к. в текущей шапке есть мёртвые линки (ну по крайней мере месяц назад точно).
И в будущем всё равно найдутся долбаёбы которые просят ссылки на туторы игнорирую шапку вообще.
Что скажешь?
Всё правильно считаешь. Надо как в /s - шапка на гейхабе, её никто не читает, (впрочем шапку треда тоже не читают).
>>393166
Тогда перекатываемся:
https://2ch.hk/gd/res/393168.html (М)
https://2ch.hk/gd/res/393168.html (М)
https://2ch.hk/gd/res/393168.html (М)
Вы видите копию треда, сохраненную 23 сентября 2018 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.