Это копия, сохраненная 30 октября 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Спрашиваем, сами же решаем проблему, сами же отписываемся. Постим книжечки, гуглим, учим математику. Посылаем нахуй за легаси.
Добро пожаловать.
http://arhivach.org/thread/28624/ - Первый
http://arhivach.org/thread/47586/ - Второй
Доки:
https://www.opengl.org/sdk/docs/man2/ - OpenGL 2.1
https://www.opengl.org/sdk/docs/man3/ - OpenGL 3.3
https://www.opengl.org/sdk/docs/man4/ - OpenGL 4.5
https://developer.nvidia.com/opengl
https://www.opengl.org/wiki/Main_Page
Туториалы:
http://en.wikibooks.org/wiki/Category:OpenGL_Programming
http://www.gametutorials.com/tutorials/opengl-tutorials/
http://www.opengl-tutorial.org/
http://www.tomdalling.com/blog/
https://code.google.com/p/gl33lessons/ -
http://steps3d.narod.ru/articles.html - много статей по расширениям
http://www.lighthouse3d.com/tutorials/glsl-core-tutorial/ - GLSL туториалы
http://ogltutor.netau.net/index.html
http://www.arcsynthesis.org/gltut/
Книги:
https://www.dropbox.com/s/ct7a7byynnbm5qf/0123750792Rendering.pdf
http://mrelusive.com/books/books.html - большой список книг по геймдеву
http://rutracker.org/forum/viewtopic.php?t=625086 - GPG 1-6 части
http://www.amazon.com/Computing-Gems-Edition-Applications-Series/dp/0123859638
http://www.amazon.com/gp/reader/0321902947 - Superbible
http://kickass.so/game-engine-architecture-second-edition-2014-t9574312.html - Game Engine Architecture
Maths:
http://www.amazon.com/Math-Primer-Graphics-Development-Edition/dp/1568817231/
http://www.amazon.com/Mathematics-Programming-Computer-Graphics-Edition/dp/1435458869
по GLSL:
http://www.amazon.com/OpenGL-Development-Cookbook-Muhammad-Movania/dp/1849695040/
http://www.amazon.com/OpenGL-Shading-Language-Cookbook-Edition/dp/1782167021/
Презентации, слайды:
Красивая вводная презентация по основам графики со всякой интерактивщиной:
http://acko.net/files/fullfrontal/fullfrontal/webglmath/online.html
http://www.slideshare.net/TiagoAlexSousa/secrets-of-cryengine-3-graphics-technology
http://www.slideshare.net/cellperformance/data-oriented-design-and-c - Data-oriented Design
https://software.intel.com/en-us/articles/designing-the-framework-of-a-parallel-game-engine/
Надеюсь, ничего не забыл.
Что же мы рисуем?
http://en.wikipedia.org/wiki/Rendering_equation
http://en.wikipedia.org/wiki/Bidirectional_reflectance_distribution_function
Математика онлаен:
http://www.essentialmath.com/tutorial.htm
http://chortle.ccsu.edu/vectorlessons/vectorindex.html
Математическая библиотека:
http://glm.g-truc.net/
Библиотеки для создания контекста:
http://www.glfw.org/
http://freeglut.sourceforge.net/
Подключение расширений:
http://glew.sourceforge.net/
Ещё тюториалы:
http://code.google.com/p/gl33lessons/
http://vbomesh.blogspot.ru/
https://developer.nvidia.com/opengl
http://ogldev.atspace.co.uk/
http://www.tomdalling.com/blog/
ТЕХНОЛОГИИ
Диферд
http://www.neuroproductions.be/opengl/making-a-3d-game-with-opengl-deferred-shading-and-stuff/
http://onlygraphix.com/2014/01/18/oglplus-tutorialdeferred-renderer/
http://steps3d.narod.ru/tutorials/lpp-tutorial.html
http://steps3d.narod.ru/tutorials/ds-tutorial.html
ССАО/ССДО
http://habrahabr.ru/post/204260/
http://people.mpi-inf.mpg.de/~ritschel/Papers/SSDO.pdf
Инстансинг
http://ogldev.atspace.co.uk/www/tutorial33/tutorial33.html
https://www.youtube.com/watch?v=dMVhGJkALW0
Двигло
http://www.slideshare.net/cellperformance/data-oriented-design-and-c
http://www.slideshare.net/TiagoAlexSousa/secrets-of-cryengine-3-graphics-technology
Нарисовать текст в ОГЛ
http://jonmacey.blogspot.de/2011/10/text-rendering-using-opengl-32.html
Добавочка
Что же мы рисуем?
http://en.wikipedia.org/wiki/Rendering_equation
http://en.wikipedia.org/wiki/Bidirectional_reflectance_distribution_function
Математика онлаен:
http://www.essentialmath.com/tutorial.htm
http://chortle.ccsu.edu/vectorlessons/vectorindex.html
Математическая библиотека:
http://glm.g-truc.net/
Библиотеки для создания контекста:
http://www.glfw.org/
http://freeglut.sourceforge.net/
Подключение расширений:
http://glew.sourceforge.net/
Ещё тюториалы:
http://code.google.com/p/gl33lessons/
http://vbomesh.blogspot.ru/
https://developer.nvidia.com/opengl
http://ogldev.atspace.co.uk/
http://www.tomdalling.com/blog/
ТЕХНОЛОГИИ
Диферд
http://www.neuroproductions.be/opengl/making-a-3d-game-with-opengl-deferred-shading-and-stuff/
http://onlygraphix.com/2014/01/18/oglplus-tutorialdeferred-renderer/
http://steps3d.narod.ru/tutorials/lpp-tutorial.html
http://steps3d.narod.ru/tutorials/ds-tutorial.html
ССАО/ССДО
http://habrahabr.ru/post/204260/
http://people.mpi-inf.mpg.de/~ritschel/Papers/SSDO.pdf
Инстансинг
http://ogldev.atspace.co.uk/www/tutorial33/tutorial33.html
https://www.youtube.com/watch?v=dMVhGJkALW0
Двигло
http://www.slideshare.net/cellperformance/data-oriented-design-and-c
http://www.slideshare.net/TiagoAlexSousa/secrets-of-cryengine-3-graphics-technology
Нарисовать текст в ОГЛ
http://jonmacey.blogspot.de/2011/10/text-rendering-using-opengl-32.html
Добавочка
Ты бы хоть шапку почитал бы, а так спасибо.
то что записал, то и будет. Если ничего не записывал, будет мусор, записывай нули
Спасибо.
https://github.com/nothings/stb
Очень годная.
Автора её Кармак готов пригласить в Окусул. Так что тру.
Рендери отдельно сцену и отдельно гуй в картинку с прозрачностью. Потом мерджи обе картинки в одну, как в фотошопе.
мимо вообще ниибу в огл
Нонсенс.
Рисуешь сцену.
Выключаешь з-тест.
Рисуешь гуй.
Это не первый тупорылый вопрос в ОГЛ тредах, зачем ты это делаешь?
>OpenGL 4.5
Трепетно ожидаем новой ревизии.
https://ru.wikipedia.org/wiki/Mantle_%28API%29
http://www.guru3d.com/news-story/amd-mantle-might-end-up-in-the-next-revision-of-opengl.html
Когда пробовал и изучал гл по началу, то для вершин, текстурных координат заводил новый vbo и, соответственно, с атрибутами у меня было меньше возни. Ну то есть для вершин, текстурных координат был свой vbo и начало данных в атрибутах я ставил 0.
Проблема такая. Как в один буфер поместить все данные и выставить атрибуты правильно?
Разобрался.
Тащемта, нужно в начале узнать сколько данных в байтах нам надо засунуть в буфер, но не заполнять его данными, а потом через BufferSubData пихать.
Примерно так:
offset = 0;
BufferData( sizeof( position ) + sizeof( tex_coord ), null );
BufferSubData( sizeof( position ), position, offset );
offset += sizeof( position );
BufferSubData( sizeof( tex_coord ), tex_coord, offset );
и тд
Теперь решил переделать с шейдерами и добавить текстуры.
Собственно вопросы:
1) Мне теперь придется самому реализовывать все повороты/увеличения с помощью матриц?
2) Как лучше всего отрисовывать ландшафт?(Имеется карта высот)
3) Какую версию OpenGL юзать? Я читал, в 4+ там появились какие-то еще шейдеры. Они мне нужны вообще?
4) Как мне научиться писать шейдеры? Что лучше прочитать? В основном попадаются просто абсолютно бесполезные статьи, из которых ничего не понятно.
Я понимаю, что вопросы, наверное, очень глупые, но я я буду благодарен, если кто-то пояснит.
Лучше загугли готовое, разберись и перепеши с нуля. Велик шанс, что ты забудешь какую-нибудь фигню и потом будешь всем мозги ебать.
http://www.mbsoftworks.sk/index.php?page=tutorials&series=1&tutorial=24
Ладно, я подумаю. Спасибо.
В отрисовке ландшафта главное запилить алгоритм LOD, а это задача по сложнее чем просто нарисовать треугольники по карте, особенно если нужен большой ландшафт и качество.
Неужели в геймдеве используют только это? glBegin и glEnd же устаревшее говно, которое уже давно никому не сдалось.
У меня сомнения насчёт эффективности VBO, когда дело касается динамических объектов. На статичную карту-то похуй, а вот персонажей я захочу сделать двигающихся или там кубик повертеть, мне же придётся сперва себя на хую вертеть и в бубен бить, долго ебаться с установкой всяких указателей на нужные вершины. Развейте мои сомнения насчёт затратности VBO в динамике.
И что делать, если я хочу для 1000 кубов создать уникальный VBO, а потом крутить, вертеть кубы, хехей?!
Какой максимум на количество VBO объектов определён? На opengl.org что-то читал про 4Mb, но я так понял, это рекомендуемый максимум только на один объект VBO?
Что-то я проиграл с твоего поста.
Алсо, я вот изучаю код Дума 3, ну который бфг - он переписан на гл 3.3.
Так вот я там заметил класс который хранит данные для уровня, ну то есть та геометрия которая не меняется и для данных динамических - противники, оружие и тд. Может быть это оно.
Но я вот я уже давно их изучаю да и с гл тоже не первый день, но всё равно не понимаю многого оттуда.
https://github.com/id-Software/DOOM-3-BFG/blob/master/neo/renderer/VertexCache.h#L75
>И что делать, если я хочу для 1000 кубов
Рисуешь куб 1000 раз с 1000 разных матриц.
>максимум только на один объект VBO
Да.
>что все объекты должны быть сохранены как вершинные буферные объекты
А кроме ВБО нету способа что-либо нарисовать в ОГЛ 3.2+. ГлБуферСабЭррей тееб в помощ.
Вращение объектов происходит относительно глобального центра, а не вокруг собственной оси. Пробовал перемещать позицию игрока в центр и сбрасывать угол камеры, потом крутить объект, перемещать его и возвращать обратно позицию игрока и угол камеры. В итоге не работало. Не понимаю логики работы.
В Super Bible 6 издании на странице 125 твой ответ.
http://www.gamedev.ru/community/ogl/articles/lesson02
и в конце, когда делается рендеринг я вижу вот такую строку
glDrawArrays(GL_TRIANGLES, 0, vertexCount);
Как определяется что именно отрисовывается? Ну например у меня есть массив не из 3, а из 9 элементов. Как они нарисуются? Что мне сделать, чтобы нарисовать, к примеру, куб, который строится по 4 точкам?
>Как определяется что именно отрисовывается
glBindBuffer(GL_ARRAY_BUFFER, meshVBO);
>4 точкам
Индексы.
Сначала поворачиваешь, потом мапишь из локал в ворлд, ан е как ты - сначала в ворлд потом ротейт.
Треугольники рисуются просто поочереди? То-есть 0, 1, 2 элемент - первый треугольник и 3, 4, 5 - второй? Просто по-порядку каждые 3 вершины?
>просто поочереди
Почти всегда - нет. Ибо сейчас унифицированые процессоры, так что пара сотен треугольников за раз.
Всё, почитал про индексы. Тогда получается, мне нужно создавать еще огромный массив, в котором будут индексы?
Смотри.
Есть куб, у него 8 вершин.
Но если делать его треугольниками, то будет 66 = 36 вершин.
36 вершин == 363 == 108 флоатов == 432 байта.
Если делать индексами - будет 8 вершин == 24 флоата
и 123 == 36 инедксов == 36 уинта == 72 байта.
В сумме - 96 байт против 432.
И я там не уинты, а ушорты поситал, но тебе пока хватит 65к индексов.
Кто-нибудь может объяснить почему сглаженные полигоны делаются с помощью какого-то там мультисэмплинга, а не просто алгоритмом Ву? Чего я не улавливаю?
Сап, гдач.
Начал читать вторую книгу из раздела Maths.
Вначале книги говорят о том что читатель должен знать как строятся модели из вершин и полигонов. Так вот, я этого не знаю, что почитать кроме страницы в википедии? Вообще стоит ли мне это изучать, если я не делал ничего кроме тетриса в готовом движке? Мне 21, из Дефолт-сити, нехиккан и я сижу дома, так что время свободное есть, и могу в общение. Наверно таких как я миллион.
Ну я тупой. Я хоть и переиграл в кучу игр и немного умею в программирование, не совсем понимаю что значит это. Есть вершины в модели и они соединены полигонами, которые представляют примитивные фигуры?
>алгоритмом Ву
Для каждого внешнего пикселя полигона нужно посчитать растояние до его ближайшей прямой контура полигона и сделать его полупрозрачным. А если считать что полики рисуются в несколько ядер по сетке, то вангую ошибки смешивания полупрозрачных контуров.
А он более затратен, чем простая отрисовка в больше разрешении и масштаб с мультисемплингом.
Студент 1 курса узнал про алгоритмы арстеризации? Окай, лет через 10 и до шейдеров дойдешь такими темпами.
Представить что такое полигон - гугли "карта высот".
Представить что такое 3Д фигура - нарисуй куб.
Понять - гугли "постоение моделей из треугольников."
А какое значение З-буфера ты запишешь в пиксель с полутоном?
Есть одна obj модель из которой я вытаскиваю всякие потроха в виде:
vector<short> v = {v1.x, v1.y, v1.z, v2.x ... }
vector<short> n = {n1.x, n1.y, n1.z, n2.x ... }
vector<unsigned short> t = {t1.u, t1.v, t2.y ... }
И индексы:
vector<unsigned short> e = {V1, N1, T1, V2, N2, T2 ... }
Рисую так:
[CODE]
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, mdl->VertexBuffer());
glVertexAttribPointer(0, 3, GL_SHORT, GL_TRUE, 0, nullptr);
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, mdl->UVBuffer());
glVertexAttribPointer(1, 2, GL_UNSIGNED_SHORT, GL_TRUE, 0, nullptr);
glEnableVertexAttribArray(2);
glBindBuffer(GL_ARRAY_BUFFER, mdl->NormalBuffer());
glVertexAttribPointer(2, 3, GL_SHORT, GL_TRUE, 0, nullptr);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mdl->ElementBuffer());
glDrawElements(GL_TRIANGLES, mdl->ElementsSize(), GL_UNSIGNED_SHORT, nullptr);
[/CODE]
И получаю пикрелейтед. Что делаю не так?
Есть одна obj модель из которой я вытаскиваю всякие потроха в виде:
vector<short> v = {v1.x, v1.y, v1.z, v2.x ... }
vector<short> n = {n1.x, n1.y, n1.z, n2.x ... }
vector<unsigned short> t = {t1.u, t1.v, t2.y ... }
И индексы:
vector<unsigned short> e = {V1, N1, T1, V2, N2, T2 ... }
Рисую так:
[CODE]
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, mdl->VertexBuffer());
glVertexAttribPointer(0, 3, GL_SHORT, GL_TRUE, 0, nullptr);
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, mdl->UVBuffer());
glVertexAttribPointer(1, 2, GL_UNSIGNED_SHORT, GL_TRUE, 0, nullptr);
glEnableVertexAttribArray(2);
glBindBuffer(GL_ARRAY_BUFFER, mdl->NormalBuffer());
glVertexAttribPointer(2, 3, GL_SHORT, GL_TRUE, 0, nullptr);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mdl->ElementBuffer());
glDrawElements(GL_TRIANGLES, mdl->ElementsSize(), GL_UNSIGNED_SHORT, nullptr);
[/CODE]
И получаю пикрелейтед. Что делаю не так?
И буферы генерирую так:
[CODE]
glGenBuffers(1, &_vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(short) _vertexes.size(), &_vertexes[0], GL_STATIC_DRAW);
glGenBuffers(1, &_uvBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _uvBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(unsigned short) _uvs.size(), &_uvs[0], GL_STATIC_DRAW);
glGenBuffers(1, &_normalBuffer);
glBindBuffer(GL_ARRAY_BUFFER, _normalBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(short) _normals.size(), &_normals[0], GL_STATIC_DRAW);
glGenBuffers(1, &_elementBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _elementBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned short) _elements.size(), &_elements[0], GL_STATIC_DRAW);
[/CODE]
struct vertex
{
float[3] v;
float[3] n;
float[2] t;
}
....
glBufferData(GL_ARRAY_BUFFER, sizeof(vertex) _vertexes.size(), &_vertexes[0], GL_STATIC_DRAW);
or
struct point
{
float[3] v;
}
struct normal
{
float[3] v;
}
struct uv
{
float[2] v;
}
....
glBufferData(GL_ARRAY_BUFFER, sizeof(point) _vertexes.size(), &_vertexes[0], GL_STATIC_DRAW);
...
glBufferData(GL_ARRAY_BUFFER, sizeof(normal) _normals.size(), &_normals[0], GL_STATIC_DRAW);
Не до конца понимаю чем оно отличается от того что у меня.
В https://www.opengl.org/wiki/Vertex_Specification_Best_Practices#Formatting_VBO_Data
Написано, что что индексы можно представлять в разных видах (VVVV) (NNNN) (CCCC), (VVVVNNNNCCCC) или (VNCVNCVNCVNC). Как передать openGL какого формата данные я в него заливаю?
vector<unsigned short> e = {V1, N1, T1, V2, N2, T2 ... }
That's a bullshit.
vector<unsigned short> e = {e1,e2,e3,.... }
Вот тут годно и наглядно поясняется принцип рендеринга.
Думаю стоит добавить в шапку.
Да, годнота.
Чего-то не нравится?
http://opengl-tutorial.blogspot.ru/p/6.html
Пытался вот по этому уроку делать. Попробовал сделать без движения, просто обзор мышкой. Вышла хуита даже не похожая на камеру.
Начинать изучение гла я начинал вот по этим урокам:
https://code.google.com/p/gl33lessons/wiki/Lesson04
И вот дошёл до 4 и там как раз камера, но используется своя мат библиотека и соответственно функции немного различаются. Например поворот матрицы.
Знаю про вертексы, знаю про текстуры. Разжился знаниями по ВБО. Хочу собрать их в хорошую, но не шибко сложную архитектуру.
Пробовал читать исходники, но они часто бывают наполнены магическими числами, которые ничего не объясняют.
Хочется какую-нибудь статейку хотя бы с разбором внутреннего содержимого двигла, так чтобы хотя бы с куском теории о том как и зачем все это было написано.
Ну началось. Ясен хуй, что все придумано до меня, но я хочу знать, что же там блядь, придумано. Я хочу разбираться в том, что там внутри, как оно работает и почему оно так работает.
Конечно, давайте опять пообсасываем тему того, что нужно использовать движки.
Ну давайте, скажите это тем, кто блядь на Юнити с использованием физического движка будет делать арканоид, жрущий дохуя памяти и тактов процессора на то, чем в действительности он не польлзуется.
Как же надоели эти кукарекания.
Почитай исходники опен-сорцного движка.
В шапке же ссылки.
вот книжка
http://kickass.so/game-engine-architecture-second-edition-2014-t9574312.html
вот сайт не из шапки
http://gameprogrammingpatterns.com/
все же написано, глаза разуть лень. гугл есть. или ты думаешь тебе первому в истории надо разобраться как же движок работает.
Не лень. Я прошелся по ссылкам.
Название "Game Engine Architecture" мало говорит о том, что речь пойдет именно о разработке графического движка.
Не говоря уже о "Game Programming Patterns" ведь паттерны в играх встречаются тоже разные.
Но как бы там ни было, спасибо.
Может можно как-нибудь привязать атрибуты раздельно?
ARB_vertex_attrib_binding вроде только с opengl 4.2, а моя говнокарта может только в 3.3.
Ты нихуя не понял, читай еще.
Я тебе уже пояснил и с кубиком и хуюбиком и тыкнул в то, что у тебя структуры ВБО - говно. Короче, пиздуй читать еще.
>Например поворот матрицы.
Хм.. вектора же.
Есть вектор, который нужно вращать в системе координат камеры пропорционально dx и dy курсора мышки. Вращать можно последовательно вокруг "верха"(UpVec) на dx, затем "бока" (StrafeVec) на dy.
После того как повернутый вектор найден нужно заново
расчитать матрицу вида mLookAt(куда).
И еще есть морока с определением нового базиса камеры. Камера может "завалится", для избегания этого я всегда беру как ось верха "Y+" вне зависимоти от реального верха как cross(X, Z).
Еще забыл добавить, во второй статье рекомедуют на колесо повесить изменение fov'а для приближения без измения позиции. Это требует каждый кадр пересчета матрицы прекции(не как что-то плохоe).
Но имхо не очень удобно, у меня по колесу изменение позиции наблюдения вдоль вектора "вперед", т.е. камера приближаться к центру вида.
Из меня обеснялка никакая.
>Есть вектор
Это вектор вперед в системе координат камеры или normalize(DirOnTarget).
>Ты нихуя не понял
Иначе бы не спрашивал.
>читай еще.
Пять раз перечитал, не понимаю.
Вот результат индексации из того примера с кубом, вершин стало использоваться меньше, но почему их осталось 28, а не 8?
Потому что при индексировании считается уникальность по всем атрибутам.
v(p1, n1, t1) != v(p1, n1, t2) - в индексе такие вершины будут считаться разными.
Для куба хватает 8 позиций которые образуют 12 треугольников или 36 вершин. Внимание вопрос: сколько для куба надо различных нормалей и текстурных координат?
Допустим нормалей тоже 6. Это нормали к грани, а не к вершине.
Тогда одна грань куба будет:
v(р1, n1) v(р2, n1) (р3, n1) - первый треугольник
v(р3, n1) v(р2, n1) (р4, n1) - второй треугольник
Занимает 4 вершины в индексе, итого 24 вершины для куба.
Теперь если добавить текстурные координаты у тебя вылезет еще 4 уникальных вершины. Хз почему, зависит от степени ебанутости экспортера и артиста который делал развертку.
Вот именно это меня и напрягает, на нормальных моделях экономия при индексации почти никакая, какой толк тогда, если можно пилить VAO и не париться? Или есть другие подходы к этому вопросу?
Да можно на простых моделях типа куба особо нет разницы рисовать в лоб 36 вершин или 24 через индекс. Но попрошу заметить, что ультра хардкор сжатие это рисование куба всего за 8 вершин вида v(pN, nN, tN). - сглажениые нормали(четкие грани редко когда нужны) и впритык заполненое текстурное пространство(на это влияет кол-во швов у модели, чем меньше тем меньше дублей вершин по текстурам).
>на нормальных моделях экономия при индексации почти никакая
Наоборот максимальная. У твоего сферического примера четкие грани и я нащитал(могу ошибисться) 14 швов. УГ кароч.
Пжлс.
Хотел еще сказать - не заморачивайся байтоеблей и рисуй все через индекс. Индекс ебут 3д-редакторы и руками строить его не нужно, памяти у видеокарт от 1 гига и дай б-г если 10% ее заполнено сетками и шейдерами, а все остальное тонет в full-hd текстурах. Бери проще!
Больше таких картинок.
http://tfpsly.free.fr/bookmarks.html
Кончил с анимаций.
Не совсем понимаю что с ними делать. Сейчас, когда изучаю, рисую простые кубики и понятное дело можно с мип уровнями не возиться. Но надо будущее надо учесть.
Вот есть функция glGenerateMipmap, мне её нужно применять, наверное, не для всех текстур например к текстуре оружия нет, он и так постоянно рядом с near plane.
Я так понимаю драйвер сам будет выбирать какой мип уровень использовать?
Такой умный - укажи на ошибку переводчикам. Ой, погодите-ка! Ты местный школьник-циник, ты не опустишься до помощи другим.
> драйвер сам будет выбирать
Да.
>glGenerateMipmap, мне её нужно применять, наверное, не для всех текстур
И да и нет. Если оружие под углом к плоскости экрана - то мипы нужны.
А где про них ещё почитать?
Как генерировать? Сколько уровней задавать для текстуры? Удаление их из памяти?
Ну в общем пока вот такие вопросы.
Если у тебя в работе планируется "использовать" текстуру на разных от камеры расстояниях, то для нее мипмапы нужны.
Обычно мипмапы генерируют при сохранении текстур, типа DXT.
Драйвер по умолчанию сам выбирает, но можно и самому указывать.
Буду рад, если что-то подскажете.
Спасибо.
Раньше делали отрисовку в glBegin/glEnd. Потом через буфер (VBO, VAO - всё такое).
gluSphere - какой вариант использует? Если первый - какой тогда вариант есть отрисовки через vertex buffer, кроме как самому генерить вершины(т.е. есть ли стандартые функции)?
Боресков, блять.
Нихуя нипонел - какое такое?
Еcли нужно преобразовать первый пик во второй, то нужно сделать дополнительную одномерную текстуру маски по Х c со значением (начало затенения по Y). Это можно сделать через свертку, отдельным проходом.
Затем уже делать чистый проход типа:
if (TexCoord.v - Tex1D(TexCoord.u) > 0)
FragColor = Белый;
else
FragColor = Чорный;
мимо диван
О, я нашол что мне товй пик напоминал.
Суть это графическое представленя построения одномерной теневой карты, для затенения в двумерном пространстве.
Строится так:
Оределяется шаг в градусах как (TexResolution / 2pi)
Трасируется луч(начало - позиция ИС, с шагом угла)
Ищется пересечение с 2d геометрией.
Растояние заносится в тектуру как Tex[CurrentAngle] = Distance(или MaxLightDistance, если нет пересечения ни счем).
Потом, при отрисовке геометрии, растояние из текстуры сравнивается с растоянием текущего пикселя до ИС по заданому углу - елси больше то пиксель в тени, иначе он на свету.
>>144411
>>144415
Ну значит будем так делать. Вот преобразования в и из полярных координат. Я всё правильно сделал?
void to(in vec2 uv, out vec2 cart) {
float theta = uv.x 2.0 PI;
float r = uv.y;
cart = vec2(-r sin(theta), -r cos(theta));
cart = (cart/2.0) + 0.5;
}
void from(in vec2 cart, out vec2 polar) {
vec2 p = ((cart-0.5)2.0);
float r = length(p);
float theta = atan(p.y, p.x);
polar = vec2(-theta, r);
polar.x = (polar.x-PI/2.0)/(2.0PI);
if(polar.x < 0.0) polar.x+= 1.0;
}
Взял, да передрал посмотрел.
https://github.com/mattdesl/lwjgl-basics/wiki/2D-Pixel-Perfect-Shadows
Я именно это и курю. Только мне ещё надо разобраться с самими шейдерами. Надо бы прочитать весь этот гайд от начала. Пользы больше будет.
Ниблохо. Осталось понять теорию о 1Д радиальном луче Ведь можно просто топ-даун сканлайном пройтись.
Сажа прилипла.
Если сейчас начну учить, не придется все заново переучивать потом?
В общем, подскажите, как запилить инвертирование цветов из фоновой текстуры.
Допустим, если на фоне чёрный цвет, то мне нужно окрасить свою текстуру в белый.
Не-не-не, ты не понял.
Вот смотри, есть рандомная фоновая картинка. С цветом, и прочим. Например, горелый дарт вейдер.
Есть текстура с отрендеренным туда текстом. Прозрачный фон, чёрный текст.
Что делает шейдер:
1) Берёт пиксель из дарта вейдера
2) Инвертирует ему цвет
3) Присваивает этот цвет пикселю, который находится уже в текстуре с текстом.
Таким образом, текст должен быть виден на любом фоне и поебать на цвет фона.
Не переходите на главную, если у вас Firefox - виснет.
(как это сделать?)
Че ты несешь, поехавший? Тебе дали шейдер, рендери с ним в текстуру все, что хочешь.
Ну бля
https://www.shadertoy.com/view/llX3zM
На шейдер той нельзя запилить свою пикчу, но я подобрал шахматную доску и сделал ее белый прозрачным, типа чёрные кубики получились.
Хотя как тулзень - штука годная.
Но отсутствие скрола и автопроигрывание с открытия - это пиздец.
1) Программа стартует.
2) Загружает необходимые данные для уровня, например.
3) Запускается главный цикл.
4) Считывает данные с клавы/мыши.
5) Расчёт игровой логики/мира.
6) Рендеринг
7) Goto 4
>заметил что с его помощью можно обрабатывать столкновения объектов
>заметил
>обрабатывать столкновения объектов
Где?
У меня вопрос.
Изучаю освещение по уроку
https://code.google.com/p/gl33lessons/wiki/Lesson04
И не могу понять, почему на теневой стороне тора есть свет?
Код шейдеров один и тот же.
ИМХО это спекуляр вылез с обратной стороны. Где-то минус потерял или что-то такое.
If на знак результата поставь.
> это спекуляр вылез с обратной стороны
Да, это был он. Я убрал передачу его в шейдер и всё ок заработало, но, понятное дело, это не решение проблемы.
>>145570
>либо минус у дота потерял
Зыс.
Я использую GLM, а в тех уроках юзается самописная либо.
Так вот, я шейдере ( который у урока, а не мой ) поставил у дота поставил минус и стало также как и у меня!
Ну и я, соответственно, поставил у себя минус и у меня эта проблема пропала.
Вот эта строка:
https://code.google.com/p/gl33lessons/source/browse/tags/lesson04/data/lesson.fs#61
Если данные входные одни и те же, даже шейдеры ( ну почти ) идентичны, то думаю проблема в математической либе.
Это ещё и подтверждается тем, что начальные координаты камеры тоже идентичны, однако моя камера стартует где-то в жопе сцены, а в уроке всё норм!
>однако моя камера стартует где-то в жопе сцены
Ты их каждые фрейм передаешь в шейдер?
Матрицы пересчитываешь?
>Матрицы пересчитываешь
При каждом изменении их надо пересчитывать.
В шапке в одном из туториалов пояснено за класс камеры.
Ну дак это я знаю.
Перед отправкой их в шейдер view на projection умножаю.
Передаю матрицу модели и матрицу нормалей этой модели ( это для освещения ).
Ещё эти пляски с освещением не нравятся:
> Стоит отметить, что при использовании FFP OpenGL освещение рассчитывалось не в мировой системе координат, а в видовой. На мой взгляд это не очень удобно, т.к. видовая система координат связана с камерой, а источники освещения удобно задавать в мировой системе координат и именно там и производить весь расчет.
Ты можешь считать в любой системе в какой нравится.
Но в общем освещение считают во вью спейсе, а перевести из мира в вью спейсе - это совсем не проблема.
FFP уже лет 10 используется. ВЫкинь нахуй туториал.
Начал изучать OpenGL 3.3 по туториалам с http://opengl-tutorial.org
Всё нормально компилируется, но при отладке даже самой первой программы в Visual Studio программа не работает как надо, потому что использует интегрированное видео вместо моей GT630M на ноуте. Как заставить программу использовать дискретное видео по-умолчанию? Неужели для каждого туториала придётся в панели управления видеокарты устанавливать для каждой программы использование GPU вместо CPU?
Забыл упомянуть, драйвера на ПЕЧ стоят последние. Может где нужно включить опцию автоматического использования карточки при вызовах процедур OpenGL 3.X?
Чтобы работало всегда - запускай саму студию с поддержкой дискретки. дебагер как чайлд запустится тоже с интегрированой.
> дебагер как чайлд запустится тоже с интегрированой
С дискретной, ты наверно имел в виду?
Да, я как раз подумал об этом, потому что при автовыборе дискретки все кому не лень будут использовать её. Однако опять же при запуске скомпилированного приложения не из студии придётся делать лишние движения для запуска приложения с поддержкой GPU. Думаю, на время разработки можно оставить автовыбор GPU.
Ну, да.
Краткий курс компьютерной графики: пишем упрощённый OpenGL своими руками
http://habrahabr.ru/post/248153/
>Начинается
>из песочницы
Мечтай. Теперь у него есть инвайт - одной статьёй всё и ограничится.
От тебя один негатив.
http://joshbeam.com/articles/simple_line_drawing/
http://groups.csail.mit.edu/graphics/classes/6.837/F02/lectures/6.837-7_Line.pdf
Уже все давно написано, идите нахуй с "преподами" для школьников c их переводом статей на руSSкий.
В общем: Использую ogl3.3. Научился генерировать ландшафт, научился настраивать текстуры, двигать камерой, масштабировать, вот это всё. Теперь я хочу научиться, например, создавать шар и двигать его по ландшафту. С чего мне начать? Как происходит взаимодействие шара с ландшафтом (Имеется карта вершин).
Ты про коллизии? Это уже не к огл. Не знаю, почитай про буллет какой-нибудь.
Самое главное то забыл для js. То есть чтобы я мог в браузере opengl вертеть, чтобы делать вещи типа прилеплейтеда без всяких плагинов, но и без низкоуровневых матриц
http://play.ironbane.com/
three.js
>BlendFunc
Пиздуй нахуй со своим Блендом, в шейдере обрезай по значению.
Или же делай правильный порядок вывода, чтобы бленд сработал, ато ты рисуешь сначала шрифт а потом остальное.
Да говорю же, не разобрался еще с ним. Если можно заменить шейдером, то заебись.
>заменить шейдером
Так ты еще и на легаси пишешь?
Да пойди ты нахуй, тут ОГЛ ниже 3.2 не обсуждается.
Ты детектор чини, я ж говорю, блендинг не юзал ни разу, пишу на 3.3+, пытаюсь понять нахуя он нужен.
>Если тот же функционал можно перенести в шейдеры, а не ебаться с непонятной хуйней, то заебись.
Расскажите кто-нибудь, как вы устанавливаете проективные текстуры? Или покажите код.
Какой-то анон посоветовал:
>Передавать в текстурные координаты нужно только вертексные координаты, умноженные на model матрицу.
но это похоже на неправду. Или я просто не понял. Или другой пайплайн.
Вот мой тред: https://2ch.hk/gd/res/148803.html
Я уже заебался. На стаковерфлоу постоянно кидают эту статью http://home.xyzw.us/~cass/qcoord/, но она нихуя не очевидная. Какие-то вертексы задают vec4 векторами.
Да, но там координаты заданы уже.
Объясню популярно еще раз. Итак, для чистоты эксперимента ты будешь передавать в шейдер только координаты вершин. Текстурные координаты оставь в стороне, закомменть. В шейдере, до перемножения на всякие матрицы, ты присваиваешь текстурным координатам (которые vec2) два координаты из позиции вершины (поиграйся со значениями, xy, yz, xz, я хз какая у тебя там система отсчета). Потом ты накладываешь текстуру с помощью этих самых полученных координат и выкладываешь скрины.
А нет, как-то странно просвечиваются некоторые части.
Вот на пике пример. Вот это странное пятно - это бугор, который на ландшафте там дальше находится. То-есть, видно его часть снизу-вверх.
По-хорошему, нужно сначала освещение сделать, а то хуево видно всё это.
Я может напишу еще как-нибудь.
glEnable(GL_DEPTH_TEST);
Решил давеча сделать отражения в экранном пространстве, но столкнулся с тем, что трейсинг стреляет уж очень не точно - малейшее движение и пиксели на отражении скачут как кролики весной.
Есть у кого идея или статья какая, где описано решение?
Там нету рефлекшена.
Нормально ответить можешь? А то я нашел гайдики на 3.3, но они морально устарели, это не говоря о том, что у меня cmake отказывался что-то там конфигурировать (я нихуя не понел, гугел не помог)
>Ну-ка, ткнули меня носом
Могу ткнуть в говно.
>меня cmake отказывался что-то там
и послать нахуй.
Что тебе в тех туториалах не нравится? С 3.3 в пайплайне ничего принципиально не поменялось. Учи базу по этим, дальше уже расширениями и тесселяцией обмазывайся, если так надо.
Хочу поделиться с аноном своей маленькой находкой, которая возможно не всем очевидна.
В своем велосипеде я хочу дать возможность пользователю легко переключаться между оконным и полноэкранным режимами.
Проблема №1. В винде стандартное окно (с рамкой и заголовком) и для полноэкранного режима (без ничего) - две большие разницы, поскольку нельзя сделать из одного другое после создания.
Решение: создавать два окна и переключаться между ними по команде (например в крузисе по wm_maximize для первого и wm_restore для второго, лoл).
Проблема №2. Для первых экспериментов ещё куда ни шло завязывать процедуру рендера на оконные сообщения типа wm_paint, wm_timer, но теперь это мягко говоря странно. Плюс создавать по контексту на каждое окно и потом расшаривать между ними объекты. Гемор наверняка тот ещё будет.
Решение: по наденным в инете рецептам видно, что вполне нормально использовать один контекст рендеринга по необходимости переключаясь между несколькими контекстами устройства (окнами). Тогда выносим весь код рендера в отдельный поток, и туда же можно код создания контекста - чтоб оконные потоки уже этим не занимались. Остается только вовремя подавать потоку рендера сообщения о смене контекста устройства и изменении размера окна.
Проблема №3. Первое окно работает, из второго сыплется ошибка 2000 - неправильный формат пикселя.
Преамбула: изучение OpenGL ещё во времена 1.1-1.2, привычка писать в одну харю одно окно, спагетти и т.д. Короче процедура создания контекста тогда состояла из установки формата пикселя в контексте устройства и создания контекста рендеринга, и была слеплена воедино, а ныне добавилось еще объявление реального контекста для третьей или более новой версии. Решение: отделяем установку формата пикселя из общей процедуры создания контекста в потоке и переносим ее в обработчик wm_create для каждой формы, а передача контекста устройства при смене окна уже работает.
Итог: рендер работает в собственном потоке независимо от окон (их можно теперь насоздавать пачками), ну и не забываем при закрытии окон сначала завершить поток рендера, освободить ресурсы и закрыть контекст.
Надеюсь кому-то поможет.
P.S.: gDebugger - сила.
Хочу поделиться с аноном своей маленькой находкой, которая возможно не всем очевидна.
В своем велосипеде я хочу дать возможность пользователю легко переключаться между оконным и полноэкранным режимами.
Проблема №1. В винде стандартное окно (с рамкой и заголовком) и для полноэкранного режима (без ничего) - две большие разницы, поскольку нельзя сделать из одного другое после создания.
Решение: создавать два окна и переключаться между ними по команде (например в крузисе по wm_maximize для первого и wm_restore для второго, лoл).
Проблема №2. Для первых экспериментов ещё куда ни шло завязывать процедуру рендера на оконные сообщения типа wm_paint, wm_timer, но теперь это мягко говоря странно. Плюс создавать по контексту на каждое окно и потом расшаривать между ними объекты. Гемор наверняка тот ещё будет.
Решение: по наденным в инете рецептам видно, что вполне нормально использовать один контекст рендеринга по необходимости переключаясь между несколькими контекстами устройства (окнами). Тогда выносим весь код рендера в отдельный поток, и туда же можно код создания контекста - чтоб оконные потоки уже этим не занимались. Остается только вовремя подавать потоку рендера сообщения о смене контекста устройства и изменении размера окна.
Проблема №3. Первое окно работает, из второго сыплется ошибка 2000 - неправильный формат пикселя.
Преамбула: изучение OpenGL ещё во времена 1.1-1.2, привычка писать в одну харю одно окно, спагетти и т.д. Короче процедура создания контекста тогда состояла из установки формата пикселя в контексте устройства и создания контекста рендеринга, и была слеплена воедино, а ныне добавилось еще объявление реального контекста для третьей или более новой версии. Решение: отделяем установку формата пикселя из общей процедуры создания контекста в потоке и переносим ее в обработчик wm_create для каждой формы, а передача контекста устройства при смене окна уже работает.
Итог: рендер работает в собственном потоке независимо от окон (их можно теперь насоздавать пачками), ну и не забываем при закрытии окон сначала завершить поток рендера, освободить ресурсы и закрыть контекст.
Надеюсь кому-то поможет.
P.S.: gDebugger - сила.
>удалять окно и создавать новое
Вот это точно не нужно.
>SetWindowLong
У меня ещё ни разу не работало, не знаю, что я не так делал.
>В винде стандартное окно (с рамкой и заголовком) и для полноэкранного режима (без ничего) - две большие разницы
Это враньё.
Хуле я ещё не видел тут?
Я знаю инглиш на некотором левеле, но русский куда приятнее
В ОП посте ссылки на тьюториалы на русском, полуёбок.
Ребята, я конечно понимаю, что вопрос тупой, но вот в этой статье код написан на питоне, в чем его можно компильнуть? В статье, я так понял, он работает на Линуксе и начал туда особых Линукс онли ИДЕ, а для Вин64 какие есть аналоги?
> но вот в этой статье код написан на питоне, в чем его можно компильнуть?
Питон это интерпретируемые язык программирования.
Дело в том, что там библиотеки подключаемые, как ты их без питона интерпретируешь?
Боресков и Шикин "Компьютерная графика. Полигональные модели."
Подскажите пожалуйста.
Назначают текстуры. Примерно так
- Для каждого объекта
-- Для каждой части
--- Поставить текстуры
--- Нарисовать
Алсо, пешу на кьютэ.
Подозреваю, что отрисовка вместе с изменением угла забита тупо в бесконечный цикл. Прибавляй к углу вместо простой константы константу умноженную на время с момента предыдущей итерации.
Псевдокод:
Перед циклом:
OldTime = GetTickCount
В цикле:
Time = GetTickCount
Angle = Time - OldTime * X
OldTime = Time
X подбирай изходя из необходимой скорости вращения, в зависимости от того, в градусах или в радианах углы используешь, и с учетом, что GetTickCount возвращает миллисекунды.
Нет. Если есть время/студент - пиши, поймешь много. А так - читай теорию и доки.
Упарывался раньше. Не треугольниками, конечно, ведь это бессмысленно. Софтрендер - это воксели, безграничная деталь и все такое. Тут раньше треды были, но постепенно кроме меня все забросили.
Я в /гд/ недавно, скажи, сам упарывал воксели или на БесконечноДетальный фапал?
И то, и другое.
Да не, он прав. Без вкуривания деталей - это тебе в юнити тред надо, иди туда и не отсвечивай больше тут.
А что не так то? Ну может не перекат, синтаксис тот же, но материал то новый.
>для создания контекста.
Под Шиндовс еще так можно:
https://msdn.microsoft.com/en-us/library/windows/desktop/dd374379%28v=vs.85%29.aspx
А вот эта:
>>https://www.opengl.org/sdk/docs/man2/ - OpenGL 2.1
>>https://www.opengl.org/sdk/docs/man3/ - OpenGL 3.3
Старые доки впринципе не нужны, плюс туториалы по старым хуитам ненужны.
Ясно.
GLFW + сырой OpenGL
Идиот.
https://sites.google.com/site/opengltutorialsbyaks/introduction-to-opengl-3-2---tutorial-01
В догонку. И перестань уже кукарекать без знания матчасти.
красноглазый ублюдок, твое мнение никого не волнует, ползи обратно в свою парашу
Драйвера уже накатил?
Сейчас куча врапперов появятся. Точно всякие юнити будет первыми, так что первые набигатели будет из юнититреда, а так же всякое школие.
В любом случае, скоро ОГЛ, каким мы его знали, исчезнет Как только выйдет железо под некст заточеное..
Железо уже давно есть. Главный вопрос конечно в том когда будут драйвера.
>скоро ОГЛ, каким мы его знали, исчезнет
Шо, опять?! Еще одного фокуса с исчезновением он может и не пережить. Как бы навеки не исчезнуть.
SDL не предлагать, он какой-то ебанутый, хз как его параллелить.
приклеилась
Qt
А что за проблемы с SDL?
Его не надо параллелить. Он просто универсальная прослойка между игрой и железом, позволяющим забыть про тонкости устройства конкретной ОС.
>параллелить окошко
Ебанутый? Ебанутый.
Winapi, если спермолох, голые иксы, если линуксогосподин. GLFW если кроссплатформа-бог.
Кутэ это какой-то мамонт со своими строками и прочим ненужным хламом.
GLFW + OpenAL
Часа 3. Но тебе мы рекомендуем пройти нахуй, тут лабу тебе делать никто не будет.
Кут слишком тяжеловесное говно. 50 мегабайт для пустого окошка? Как-то дохуя. Нет, он хорош, тут не поспоришь. Но не для геймдева. Для энтерпрайза, для тяжелых гуёв. Но для геймдева - очень плохой вариант, ты фактически будешь использовать 5% функциионала, но заплатишь всю цену в виде огромного дистрибутива, недостатка скорости в критичных местах и долгой компиляции проекта.
>>157676
Иксы полезно покопать чисто в образовательных целях, когда хочется поближе понять систему, и кроссплатформа не нужна. Для кроссплатформы да, GLFW рулит, тут спору нет.
Я и не просил писать лабу, я хотел узнать как много мне нужно знать чтобы сделать это и основываясь на этих знаниях поставить сроки. Проебусь конечно, как всегда
Тебе нужно знать как загрузить модель, как ее перевести в ВБОи как этот ВБО нарисовать. Потом тебе нужен класс камеры.
Плюс нужен ВБО с осями и ВБО с плоскостью Аж 2 треугольника.
А, еще шейдеры, да.
Все.
Плюс нужен класс ВБО с классом осей и класс ВБО с классом плоскости. Аж 2 класса треугольников.
А, еще класс для шейдеров, да.
Все.
Время идёт, крестобляди не меняются.
Тогда это был бы "xml для загрузки модели…" етц. У жаборабов выбора нет, да и не лезут они со своими классами куда попало. А вот крестобляди всегда всё начинают с классов. В жопу алгоритмы, в жопу проектирование, в жопу структуры данных - у нас будет класс для хранения вот этой хуйни и ещё класс для обработки вон той хуйни.
Повбiвав би.
Хуевые крестобляди тебе попадались.
Даже сейчас хеллоу ворлд из одного треугольника занимает несколько сотен строк.
>Даже сейчас хеллоу ворлд из одного треугольника занимает несколько сотен строк.
Это так уже со времен перехода на шейдеры. Ничего не поделаешь, технология усложняется ради повышения производительности. Для упрощения есть движки, конструкторы. А ГЛ всегда был крайне низкоуровневым.
>работы будет ещё больше
Вот это да. И что самое приятное - порог вхождения повысится. А значит и наши з/п :3
Я начинал его осваивать когда треугольник можно было отрисовать кодом умещавшимся в экран тех же времен. Сейчас в принципе так же, только монитор нужен WQXGA.
Не ссы, все норм будет. Только рекомендую подумать заранее о делении всего этого добра на потоки. Меньше лагать будет когда разжиреет.
>>158236
Он имел в виду всякие врапперы типа GLFW. Я сам когда-то с glScene начинал, а потом понял, что мне не нужен код, который влияет на производительность, который я не контролирую, и который в принципе могу убрать.
wglGetProcAddr возвращает NULL, т.е. в драйвер видеокарты не имеет эту функцию. Драйвера последние (2009), видеокарта древняя Intel GMA 3100. При этом старым способом, glBegin glEnd нормально всё рисует. Кто-нибудь сталкивался с таким?
Если видеокарта не поддерживает GLSL, то кроме как покупать новый ПК выхода нет?
Педивикия вангует, что твой потолок на этой карте - OpenGL 1.4, то есть чуть-чуть выше dniwa ebanogo. Это эквивалент nVidia 2002-2003 года выхода. Купи себе хотя бы хотя бы GeForce 210 (самая дешевая с поддержкой OpenGL3), полтора килорубля. Можешь потратить больше - ищи по яндекс-маркету.
Ты тут вызываешь команды ГЛ еще до того, как щакончишь с контекстом.
Сначала создай контекст потом давой ГЛ.
Еще - подключи GLEW - позволит юзать расширения без мозгоебство.
>Вот эти?
Да.
>glShadeModel
Устарело.
http://en.wikibooks.org/wiki/OpenGL_Programming/Migrating_from_1.x_to_2.x
Только с 1 до 2, но идея понятна, а в тексте детали.
Целься на ГЛ 4+
На самом деле 3.2+ дальше только различия в фичах.
Наконец перестали шатать яндекс-капчу.
Есть вариант для мсье знающих толк: Mesa 3D. На офсайте даже написано, что OpenGL 3.3 может, и что под даже под Windows можно поставить.
Если у нашего комрада нету бабла на новое железо А я подозреваю что он студент то твой вариант не худший, особенно учитывая некоторое повышение цен на железо и ноуты.
Но это надо быть полностью знающим толк
Во-первых, до вулкана ещё как до китая раком. Лет через 5 только девайсы появятся.
Во-вторых, «старые» девайсы на ogl4 будут жить ещё долго, а дюк нюкем должен умереть
> Во-первых, до вулкана ещё как до китая раком. Лет через 5 только девайсы появятся.
Смотрим на сайте Кроноса:
> Will work on any platform that supports OpenGL ES 3.1 and up
Смотрим в вики про OpenGL 3.1:
> Supported by Windows, Linux, Android (since Lollipop) on devices with appropriate hardware and drivers, including:
> Nvidia GeForce 400 series onwards (Windows)
Вывод?
Да никакого, кроме того, что ждать придётся на год меньше.
Я сейчас в том же положении, что и ты, но 5 лет ждать новый стандарт не собираюсь, и учу OGL сейчас.
Я не в плане совместимости. Всё равно это всего лишь просто данные.
>Octree, Frustum culling
Я туториалы читал, ни хуя не взлетело. Поясни, как делать или туториал ссылку дай
Ай, спасибо
пасиба
Родился.
Я так понимаю, перед отрисовкой опенгл-ом, нужно пошаманить с координатами камеры и объекта, а то, что получилось, совать в опенгл?
чукча нечитатель
И ещё вопрос: как организовать мультипоточный рендер?
Всё гарантированно же пойдёт по пизде, если один поток рисует жирную модельку белым цветом, а другому потоку в это время приспичило нарисовать модельку зелёным.
Для этого тебе будет нужно создавать несколько контекстов отрисовки.
Суть токова.
Нужно lookAt матрицу перевести в vec3 для view матрицы.
Пока что могу только в С++, да и хочу заниматься не только игорами, но графикой в принципе
Ты чет хуйню написал.
ОпенГЛ - либа рисования 3д и соответственно 2д графики. Альтернатива - Direct3D.
GLUT - кросплатформенная либа для создания окон с глконтекстом и получинем инпута.
SDL - делает тоже самое что и GLUT только есть еще возможность рисования 2д спрайтов в общем, на ней можно сделать платформер без использования опенгл. Так же в сдле еще куча хуйни типо звуков, сети и так далее, никогда ими не пользовался.
Я считаю, что и GLUT, и SDL устарели, протухи и нахуй не нужны. Можно самому создавать окна и получать инпут. Благо, операционных систем всего 2.5, не много переписывать придется
Тебе скорее всего нужен графон, следовательно OpenGL. Сразу рекомендую туториал: http://ogldev.atspace.co.uk/
Благослови тебя господь, спасибо что всё разъяснил. Улетел читать тутор.
>Можно самому создавать окна и получать инпут.
А можно взять SFML и не париться. Тамошнее окошко и в мультитрединг может, да и код для обработки инпута писать не надо.
Не смотри на уроки с GLUTом это вроде только первый урок, создай окно с глконтекстом другим путем и иди по туториалу дальше.
Полтора дня ебался lookAt!
Оказывается формула та что в тьюториале и в glm отличаются!
Просто пиздос!
Это просто ты ничего не понимаешь.
Если ты не знаешь, что такое vec3, lookAt матрица и тд, смысл тебе что-то объяснять.
Я знаю что такое vec3 и lookAt матрица, только не могу понять как и нахуя тебе ее переводить в вектор.
Я знаю это.
Но в моей камере есть матрица проекции 4х4 и 2 вектора: углы поворота и положение в пространстве.
Не хотел ещё одну матрицу под вид.
Так вот когда я не в фуллскрине, то примерно 20-30% процессорного времени отжирается.
Когда же я включаю фуллскрин, то там доходит до 50% и больше.
Как решить эту проблему?
Менял pollEvents на waitEvents и вообще ничего не меняло.
Есть тут люди кодящие на FPC в лазарусе под линя? Не могу найти как к нему цепляются библиотеки опенгла. Даже не понимаю, цепляются ли они как внешние .so или там в палитру надо что-то добавлять, или пакеты к ide (как castle_egine), а может как под виндой (там через winAPI) как-то. Короче, кто в теме, поясните мне по хардкору.
Цепляются через стандартные модуди gl и glext. Но сейчас есть одна проблема: поменялась спецификация вызова glGetString, из-за этого glext.pp надо переписывать. Раньше glGetString(GL_EXTENSIONS) выдавал цельную строку, которую надо было парсить, сейчас эта функция выдает названия расширений по одному, надо только указать номер расширения в последовательности. У себя я эту проверку вырезал нафиг и тупо гружу все подряд под OpenGL 3.3, хотя формально это неправильно.
Хотя я под вендой работаю, не думаю, что под линем будет что-то иначе в этом плане.
>Цепляются через стандартные модуди gl и glext
Вот это и вызывает у меня непонятки, на вики пишут:
> OpenGL units in Lazarus
>Lazarus includes a TOpenGLControl - a LCL control with an OpenGL context. The Lazarus package >LazOpenGLContext can be found in lazarus/components/opengl/lazopenglcontext.lpk. An example can be found in lazarus/examples/openglcontrol/openglcontrol_demo.lpi.
>If you want to modify TOpenGLControl implementation, for example to add new properties like ColorBits and AuxBuffers, see Extending TOpenGLControl.
Third party OpenGL units
>GLScene is a Lazarus package with lots of extra features for OpenGL applications.
>Castle Game Engine allows you to navigate and render 3D worlds (in VRML, X3D and other 3D formats).
Т.е. под LCL есть стандартные компоненты, под GLUT есть 3парти, второй я попробовал, там фактически готовый 3д движок, не то, что я хотел. Под GLUT я не вижу стандартных компонент. Сам freeglut у меня установлен, вместе с пакетом никаких пакетов самого лазаруса не шло (во всяком случае я не нашел в папках куда он поставился). Вот я и не врубаюсь, как оно цепляется.
Вики у лазаря вообще тухлая какая-то, видимо основная аудитория - соскочившие с дельфей где-то около 7 версии, уже научившиеся всему более-менее нужному, и бомбящие от того, что уютная идешечка превратилась в монстростудию.
Ты сначала gl и glext подруби и попробуй создать контекст. Готовые библиотеки и компоненты (ох, как же припекало от запросов "кокой компонент скочать шоб было заебись?") конечно есть, но лучше не надо. GLScene - это наверное уже какой-то недоюнити стал, я помню его ещё году в 2006 щупал. Хотя было зашибись из первой халфы модельки в него пихать и анимацию гонять.
И лучше потрать недельку чтоб понять как оно изнутри фурычит, хотя бы как инициализируется, чем с места, в карьер, да по компонентам. В принципе ничего сложного нет, я даже когда-то писал лапшу из ifdef-ов, и в результате имел недовелосипед (под OpenGL 1.1, лoл), который успешно компилировался сразу и под виндой и под линем. Самое сложное было - заделать кросплатформенно обработку мыши и клавиатуры - у winapi и Хserver отличаются принципы работы с вводом.
Посмотри вот это: http://andru-kun.inf.ua/articles/linux_opengl_fpc_part1.html
Заодно сравни с инициализацией под виндой, для просветления.
>Ты сначала gl и glext подруби и попробуй создать контекст
Да емае, я это и пытаюсь сделать. Я раньше на DevC ебашил на опенгл, там вообще хидеры подцепил и понеслась. Как в лазаре это делается не пойму хоть убей. Под спермой, через винапи можно ддлку опенгла подключить динамически и оттуда невозбранно вызывать что тебе надо, в лине .so также цеплять или что?
>И лучше потрать недельку чтоб понять как оно изнутри фурычит
Да я только за, с удовольствием поковыряю, только нет годного гайда. Есть старые православные уроки нехе, как раз по глуту, но они как я понимаю протухли. Конкретно в лазаре все гайды выглядят так, "Создаем приложение - Подключаем опенг компоненты - Ебашим код" и дальше листинг кода, а как все подключается нигде, сука, не написано. Или может я какой-то деревенный?
>Посмотри вот это: http://andru-kun.inf.ua/articles/linux_opengl_fpc_part1.html
Чет мертвая ссыль, не открывается.
>который успешно компилировался сразу и под виндой и под линем
Я поэтому лазаря и мучаю, он умеет сразу под кучу платформ без гемороя компилить, типа один раз написал и сразу кросплатформа сплошная.
Распиши по шагам если не сложно или ссыль на почитать, будь любезен.
>я это и пытаюсь сделать
И что? Неужели пишет "модули не найдены"? Но они же входят в стандартную поставку freepascal.
Модули gl и glext собственно и занимаются динамическим подключением, и сами выбирают через проверку платформы (в compile-time) dll тягать или so. Надеюсь у тебя стоят свежие проприетарные дрова, и ты не будешь мучать проц месой.
А ссылка живая, я спецом для тебя в гугле за минуту нашел ее. Может у тебя особый провайдер, который считает, что лазить в домен ua - instant zashquar? Тогда вот тебе другая ссылка, там статья №1 та же, но теперь кури все три: https://mirgames.ru/topics?tag=freepascal
Ну совсем без геморроя под кучу платформ не выйдет, все равно придется лапшу с ifdef-ами писать, по крайней мере при успешной декомпозиции кода будет не очень много.
Через год-два у нас будет Vulkan, от этой инфы останется только как создать окно и отдать драйверу ссылку на его контекст.
>Неужели пишет "модули не найдены"?
Да нет же. Ну как-то так, как на пикрелейтед.
Установил фриглут, смотрю список пакетов - его там нет, смотрю стандартную панельку лазаря, там только LCL компонент. Что, куда и как ставить и подключать, вот в чем вопрос. Посмотрел папки с фриглутом, там дохуя разных .so и конфигурационных файлов, .lpk файлов нет.
>Может у тебя особый провайдер
Через тор тоже не показывал, а заблоченые сайты подругому отображаются. Впрочем спасибо за ссылку, тоже почитаю обязательно.
>Да нет же. Ну как-то так, как на пикрелейтед.
Yoptvojmatt...
uses
gl, glext, glx, x, xutil, xlib;
begin
end.
Вот этот код компилится или нет?
>gl, glext, glx, x, xutil, xlib
Да компилится. Только он нихуя не видит функций глута, ни glutSwapBuffers, ни glutInit.
Но я тебя понял, тупо хидерами значит цепляется, спасибо просветелел.
Glut просто ненужен.
Читай те статьи и применяй на практике.
Для OpenGL от третьей версии и выше (надеюсь ты не будешь топтаться в 1.х, legacy и FFP), ты будешь делать всё это своими руками сам.
SDL
Практически все уроки ограничиваются тем, что "создаем шейдер, VAO, VBO, IBO, и рисуем один треугольник/квадрат/куб". Но что делать если я хочу рисовать несколько разных VBO с одним шейдером, или один и тот же VBO с разными шейдерами за кадр?
Меня сильно смущает следующее (подозреваю последствия бездумного копирования и безумные умения в говнокоде):
в процессе создания VAO-VBO-IBO надо получить из текущей шейдерной программы входные атрибуты для свойств вершин (XYZ, UV, нормали, цвета), и по сути привязать их к VBO. Почему привязать? Ну потому что в glVertexAttribPointer надо указать свойства массива с данными вершин - размер записи по одной вершине и смещение в записи для определенного свойства. И не забыть еще glEnableVertexAttribArray.
Правильно ли я понимаю, следующее:
1) glGetAttribLocation надо выполнить один раз на каждый входной атрибут для каждой шейдерной программы и сохранить в записи/объекте, который будет представлять этот шейдер в моем велосипеде;
2) при создании в runtime уникального объекта, в котором будут храниться ссылки на VAO-VBO-IBO (от уже неуникального меша) надо создать новый VAO, забиндить старые VBO и IBO, и заново привязать атрибуты шейдера к VAO через glVertexAttribPointer;
3) при рисовании не потребуется ничего более, кроме как забиндить соответствующие VAO и шейдер.
> 1) glGetAttribLocation надо выполнить один раз на каждый входной атрибут для каждой шейдерной программы и сохранить в записи/объекте, который будет представлять этот шейдер в моем велосипеде;
Можно при заполнении буфера установить адреса атрибутов.
Гляди пикчи.
> 3) при рисовании не потребуется ничего более, кроме как забиндить соответствующие VAO и шейдер.
Смотря, что ты рисуешь.
Может быть ты рендеришь в текстуру, то для начала надо забиндить текстуру ( ну это для построения теней, например надо )
А так да.
Я имел в виду, что хочу по возможности использовать разные VBO с одним шейдером, и наоборот, один VBO с разными шейдерами, и все это в одном кадре. При этом в вершинном "супе" могут быть заданы UV, цвета, нормали, могут быть не заданы (соответственно разные смещения). Я правильно понимаю, что glVertexAttribPointer устанавливает связь между конкретным VAO и конкретным шейдером или нет?
Рендерить в текстуру пока не планирую, но вроде там не должно быть больших подводных камней?
> Я имел в виду, что хочу по возможности использовать разные VBO с одним шейдером
Можно.
Например какой-нибудь шейдер для освещения, а там всё равно на что светить. Кубили или шарики.
> и наоборот, один VBO с разными шейдерами
Можно.
Например. Рендерить тот же свет с тенями и без теней. С картами нормалями и без них и тд.
> Я правильно понимаю, что glVertexAttribPointer устанавливает связь между конкретным VAO
Да, типа того.
Но перед рендерингом можешь отключать не нужные атрибуты
Типа так:
vao.Bind();
glDisableVertexAttribArray( адрес_атрибута );
glDraw...
vao.Unbind();
> конкретным шейдером
Если ты при написание шейдера не установил явно номер атрибута ( как на 3ей пикче выше ), то видеокарта это сделает за тебя.
Ага. То есть по сути надо биндить каждого с каждым заново. Последний тогда вопрос (на закрепление понимания): куча VAO, каждый со своим шейдером, но все с одним VBO-IBO - будет нормально работать как масса объектов с одним мешем и разными материалами, или надо из RAM под каждый VAO заново загонять меш в отдельный VBO-IBO?
> То есть по сути надо биндить каждого с каждым заново
Не обязательно.
> куча VAO, каждый со своим шейдером, но все с одним VBO-IBO - будет нормально работать как масса объектов с одним мешем и разными материалами, или надо из RAM под каждый VAO заново загонять меш в отдельный VBO-IBO?
Я нихуя не понял.
Чего ты хочешь?
https://code.google.com/p/gl33lessons/
Вот эти уроки посмотри.
Вот как раз смотрю. Ладно, вроде бы что-то доходит. Спасибо за поддержку, анон.
Немного крипоты.
Нашел glGetTexImage(). Надо таки прочитать все доки.
Что видеокарте отрисовать проще один quad с пустыми участками в текстуре или десяток другой полигонов образующие контур тех мест что заняты на текстуре.
смотря который шейдер жырнее.
Ставлю 16 пикселей на квад.
значит особой разницы нет, что рисовать два трингла(quad) как плоскость для всей картинки, или произвести отсечение пустых участков образуя контур картинки с помощью полигонов.
Кто-нибудь может пояснить за order independent transparency? Какой самый простой алгоритм, и реально ли новичку реализовать его в программе на opengl? (и обязательно ли для реализации алгоритма работа с шейдерами?)
> Какой самый простой алгоритм
Сортировка по глубине на цпу. Самописные шейдеры ненужны. Баги у пересекающихся полупрозрачных квадов/мешей.
а что мешает его юзать ? все браузеры уже поддерживают. куча библиотек тоже есть.
Был у меня тупой процедурный код, рисовавший один квад, все как положено: vertex array object, vertex buffer object, index buffer object, шейдерная программа (OpenGL 3.3).
Стал я заворачивать все в объекты.
Текстура: пиксельный массив (хранится до передачи на видеокарту) и параметры, включая текстурный объект.
Материал: шейдерная программа и ссылки на текстуры;
Меш: вершины, индексы, vertex buffer object и index buffer object;
Модель: ссылки на материал и меш, vertex array object, атрибуты для шейдерной программы.
Основной целью заворачивания было обеспечить асинхронную загрузку ресурсов, и она в целом работает, в память с диска все читается в отдельном потоке, через очередь запускается загрузка в видеокарту в потоке, который владеет контекстом отрисовки, отрабатываются зависимости для повторного использования объектов.
Пока все это барахло писал, ни разу естественно не запускал на отрисовку, только отлаживал взаимодействие между объектами и потоками. Сейчас перенес кусок кода из старой процедуры в метод отрисовки модели и обломался. Ловлю SegFault на вызове glDrawElements/glDrawArrays (однофигственно). Даже попытка вызвать через них отрисовку только первого треугольника падает. Сижу второй день, отлаживая в gDEBugger, он мне показывает, что вроде бы сейчас все норм, все буфера правильно заполнены (была например тупая ошибка экспорта меша, когда я забыл правильно выставить endianness, и еще более тупая, когда не в том порядке читал данные из файла), правильно прицеплены, и т.д. Надеюсь, что gDEBugger доверия заслуживает, и что правильно показывает данные,
которые уже в видеопамяти.
Я даже попробовал вместо загрузки модели из файла заполнить ее буферы с помощью старого кода на один квад (4 вершины по 3 флоата на координаты и 2 на текстурные координаты, 6 индексов - целое без знака). Результат тот же самый - Segmentation Fault. Кто выбивает его? Не понимаю вообще.
Вот тот метод отрисовки: http://pastebin.com/mAvkBjUC
Кто-нибудь ещё сталкивался с такой проблемой?
Был у меня тупой процедурный код, рисовавший один квад, все как положено: vertex array object, vertex buffer object, index buffer object, шейдерная программа (OpenGL 3.3).
Стал я заворачивать все в объекты.
Текстура: пиксельный массив (хранится до передачи на видеокарту) и параметры, включая текстурный объект.
Материал: шейдерная программа и ссылки на текстуры;
Меш: вершины, индексы, vertex buffer object и index buffer object;
Модель: ссылки на материал и меш, vertex array object, атрибуты для шейдерной программы.
Основной целью заворачивания было обеспечить асинхронную загрузку ресурсов, и она в целом работает, в память с диска все читается в отдельном потоке, через очередь запускается загрузка в видеокарту в потоке, который владеет контекстом отрисовки, отрабатываются зависимости для повторного использования объектов.
Пока все это барахло писал, ни разу естественно не запускал на отрисовку, только отлаживал взаимодействие между объектами и потоками. Сейчас перенес кусок кода из старой процедуры в метод отрисовки модели и обломался. Ловлю SegFault на вызове glDrawElements/glDrawArrays (однофигственно). Даже попытка вызвать через них отрисовку только первого треугольника падает. Сижу второй день, отлаживая в gDEBugger, он мне показывает, что вроде бы сейчас все норм, все буфера правильно заполнены (была например тупая ошибка экспорта меша, когда я забыл правильно выставить endianness, и еще более тупая, когда не в том порядке читал данные из файла), правильно прицеплены, и т.д. Надеюсь, что gDEBugger доверия заслуживает, и что правильно показывает данные,
которые уже в видеопамяти.
Я даже попробовал вместо загрузки модели из файла заполнить ее буферы с помощью старого кода на один квад (4 вершины по 3 флоата на координаты и 2 на текстурные координаты, 6 индексов - целое без знака). Результат тот же самый - Segmentation Fault. Кто выбивает его? Не понимаю вообще.
Вот тот метод отрисовки: http://pastebin.com/mAvkBjUC
Кто-нибудь ещё сталкивался с такой проблемой?
ГДач! Ты резиновая уточка!
Я потратил два дня на отладку, полчаса на вдумчивое описание проблемы, а через десять минут заметил, что в методе загрузки модели на видеокарту (то место, где связываются меш и шейдер) ПРОСТО ОТСУТСТВУЕТ привязка входных атрибутов шейдера к непосредственно разреженным данным в вершинном супе (glVertexAttribPointer). Разумеется glDrawArray/glDrawElements охреневает от моей попытки послать его читать неопределенный указатель.
Всем удачи, успехов, и тоже быть повнимательнее!
Почему в доках для OpenGL ES 2 написано, что glVertexAttribPointer можно кормить всякими приколюхами таких типов: GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_FIXED, GL_FLOAT.
А в доках для GLSL 1.0 (который юзается в этом огл), написано что есть только такие типы: bool, int, float.
Есть какой-то смысл, чтоб скармливать glVertexAttribPointer GL_UNSIGNED_BYTE, GL_SHORT etc, или есть смысл кормить только GL_FLOAT?
> написано что есть только такие типы: bool, int, float.
Это в шейдере.
> Есть какой-то смысл, чтоб скармливать glVertexAttribPointer GL_UNSIGNED_BYTE, GL_SHORT etc, или есть смысл кормить только GL_FLOAT?
Обычно да, юзается gl_float, но можно попробовать упаковывать эти самые флоаты в инты для передачи в шейдеры и там распаковывать
ты не путаешь названия типов с именами констант?
а ещё и дя, я пидараск, лол, :3
я юзаю примерно такой код.
\tglutSwapBuffers();
\tglFinish();
\tFPS();
рисую 2 ёбанных треугольника . фпс в Release-e без glFinish примерно 6000-7000.
с финиш до SwapBuffers примерно 4000
с финиш после SwapBuffers примерно 3700
если я вызываю 3 Finish после SwapBuffers фпс проседает до 2000. почему так?
поцчеиу ви таг считаете?
вот на самом деле тоже интересует этот вопрос. почему все ноют о том что OpenGL нинужен. Насколько я знаю и представляю OpenGL используется в слабых смартфонах, высокопроизводительные смартфоны Android ные смартфоны поодерживают DirectX? На ИФоны есть Metal вроде как уже. Хотя вопрос с DirectX тоже стоит. Он там есть? Или может все юзают CoreGraphics? Или может всем похуй и все юзают Сасоs2Д? Или можэт вапще мёртворождённый Флешь? Или все писают кипятком от каробки Unity. Или таки удобнее юзать OpenGL?
OpenGL по идее везде работает. Почему все ноют, что на нём всё так плохо. Куча подявзок на многие языки. В Android ной Jav-е есть аж 3 вида подвязок. из пэкиджа com.android, com.khronos и в NDK. Всякие там приставки хуеставки его тоже поддерживают вроде как. В Цпп родной интерфейс. Под сладкий-тупой-медленный Python есть подвязки. Этот ваш не нравящийся вам WebGL вполне себе на OpenGl основан. Вай соу сериоуз?
Чем ДиректХ так лучше OpenGL?
Хуй знает как но сделал кое какой код:
fragmentShader:
[CODE]#ifdef GL_ES
precision mediump float;
#endif
varying vec4 v_color;
varying vec2 v_texCoords;
uniform sampler2D u_texture;
uniform sampler2D u_maskTexture;
void main() {
vec4 color = v_color texture2D( u_texture, v_texCoords );
\tvec2 maskCoords = vec2(v_texCoords.x 2.0, v_texCoords.y 12.0);
vec3 mask_color = texture2D(u_maskTexture, maskCoords).rgb;
if( color.a == 0.0 ) gl_FragColor = vec4( color.r, color.g, color.b, color.a );
else gl_FragColor = vec4( mask_color.r, mask_color.g, mask_color.b, color.a );
}[/CODE]
vertexShader:
[CODE]attribute vec4 a_position;
attribute vec4 a_color;
attribute vec2 a_texCoord0;
attribute vec3 a_maskTexture;
uniform mat4 u_projTrans;
varying vec3 v_maskTexture;
varying vec4 v_color;
varying vec2 v_texCoords;
void main() {
v_color = a_color;
v_maskTexture = a_maskTexture;
v_texCoords = a_texCoord0;
gl_Position = u_projTrans a_position;
}[/CODE]
Не особо понял что такое v_texCoords и что вместо него передать надо. Плиз гдач выручай
Хуй знает как но сделал кое какой код:
fragmentShader:
[CODE]#ifdef GL_ES
precision mediump float;
#endif
varying vec4 v_color;
varying vec2 v_texCoords;
uniform sampler2D u_texture;
uniform sampler2D u_maskTexture;
void main() {
vec4 color = v_color texture2D( u_texture, v_texCoords );
\tvec2 maskCoords = vec2(v_texCoords.x 2.0, v_texCoords.y 12.0);
vec3 mask_color = texture2D(u_maskTexture, maskCoords).rgb;
if( color.a == 0.0 ) gl_FragColor = vec4( color.r, color.g, color.b, color.a );
else gl_FragColor = vec4( mask_color.r, mask_color.g, mask_color.b, color.a );
}[/CODE]
vertexShader:
[CODE]attribute vec4 a_position;
attribute vec4 a_color;
attribute vec2 a_texCoord0;
attribute vec3 a_maskTexture;
uniform mat4 u_projTrans;
varying vec3 v_maskTexture;
varying vec4 v_color;
varying vec2 v_texCoords;
void main() {
v_color = a_color;
v_maskTexture = a_maskTexture;
v_texCoords = a_texCoord0;
gl_Position = u_projTrans a_position;
}[/CODE]
Не особо понял что такое v_texCoords и что вместо него передать надо. Плиз гдач выручай
http://codeflow.org/entries/2012/aug/25/webgl-deferred-irradiance-volumes/
Вот тебе эпическая шняга, с разъяснениями, осилишь сам такую сделать?
Только в чем смысл диплома? Бакалаврский курсач что ли?
держи охуенны тут. всё по шагам. и всё такое.
http://www.webglacademy.com/courses.php?courses=0|1|20|2|3|4|23|5|6|7|10#0
Ебанутый? В гугле забанили? Формулу сферы не знаешь? Найти не можешь? Пиздец.
Ну пиздец. Берешь формулу, проходишь по ней циклом с нужным шагом. Триангулируешь. Готово!
Залей на пастбин какой-нибудь, я слепой и непонятно нихрена без подсветки и отступов нормальных.
А еще поставь себе RenderMonkey, он хоть и старый, но довольно годный для быстрой обкатки шейдеров на GLSL.
Вот это просто запредельная штука, ребята, а есть такая же, но с видео-туториал на 10 часов, где всё наглядно объясняется?
Юзай лучше glsl 330
Что если партиклы от эффектов считаются на ГПУ? Заранее вычисляются препятствия на ЦПУ? Или что-то передается в шойдеры?
> Я тут думал-думал и вот что надумал: как в диабло-3D-дрочильнях с видом сверху обрезаются спрайты и объекты за стенами?
Z-Buffer
Как в д2 просто if пл draw orderу, если тип спрайта стена и его порядок отрисовки выше чем у героя, то рисовать с прозрачностью. Как в ф2 так же, просто в 2 драв кола, рисуешь все что ниже героя и героя, потом меняешь шейдер на другой с яйцом и дорисовываешь остальное (в шейдер передаешь координаты героя и радиус).
Wasteland 2 на том же хуюнити, расковыряй его да посмотри.
Сделал 2 вектора up и right, и вращаю их друг относительно друга пропорционально перемещению мыши, а направление получаю как cross(up, right), по началу ок, но беда в том, что через некоторое время эти вектора становятся не перпендикулярными, понимаю, что это из-за погрешностей floating point, но сука, как побороть? Мне нужно именно вращение камеры именно относительно ее предыдущего положения, а не как в шутерах.
Зачем тебе right? Он тупо без задачь.
Попробуй (dir, up), dir - вращай пропорционально мышке.
Если, dir буду вращать вокруг up для того чтоб смотреть влево-вправо, то вокруг чего вращать up чтоб смотреть вверх-вниз?
Подчеркиваю, мне ненужно чтоб камера сохраняла ориентацию относительно какой либо плоскости, пусть заваливается в любые стороны, но нужно свободное вращение без ограничений.
Что тебе мешает вместо двух векторов изменять view-матрицу и хранить каждое ее состояние?
То есть у тебя есть изначальное положение и view-матрица для каждого состояния камеры. Таким образом вектора всегда будут перпендикулярны и предыдущее состояние будет так же задаваться view-матрицей.
То, что ньюфажина, и не понимаю как это сделать. Точнее я понимаю, как сделать матрицу поворота, но как ее менять нужным мне образом уже не понимаю. Будь няшей, поясни или ссылочку дай.
Какая специальность?
float[] c = camera.getCamera();
float[] u = camera.getUp();
float[] orto = Vector3f.crossProduct(u, c);
Vector3f.normalize(orto);
Quaternion q = Quaternion.product(
Quaternion.fromAxisAndAngle(u, cameraLeftRight_),
Quaternion.fromAxisAndAngle(orto, cameraUpDown_));
c = Quaternion.rotate(c, q);
Vector3f.divLength(c, cameraRadius_);
camera.setCamera(c);
float[] t = camera.getTarget();
t = Quaternion.rotate(t, q);
camera.setTarget(t);
u = Quaternion.rotate(u, q);
camera.setUp(u);
Здесь еще таргет поворачивается и меняется расстояние между камерой и таргетом. Все на float, вращал много но проблем не было.
Возможно нужно пересчитывать up не поворотом старого а произведением orto x up
Кватернионы-кватерниончики. Спасибо анон, покурю.
Впрочем мой способ тоже заработал, когда я стали пересчитать не оба вектора от старых значений, а последовательно.
Мне это показалось проще чем разбираться с движками. Сейчас думаю попробовать какой-нибудь но хер же выберешь.
Чтоб разобраться в основах. Начав с самого верха, часто сталкиваешься с непониманием, откуда взялся косяк и как его победить.
>Это если бы ты начал дом строить с добычи руды для выплавки молотка.
Если бы я лез под капот opengl, то аналогия была бы верной.
А так скорее изучение материалов, методов строительства, инструментов.
Если придётся заниматься какой-то просто задачей, то монструозный игровой движок, конечно хорош, но слишком большой для такого дела.
Также не стоит забывать про OpenGL ES.
>Это если бы ты начал дом строить с добычи руды для выплавки молотка.
С изучения сопромата, изучения разных материалов типа кирпича, газобетона и всей подобной хуйни для нормального рассчёта нагрузки на разные части здания.
Выплавка молотка — это свой софтверный рендер городить.
Первое. Так ты можешь заранее определять, что какая-то часть интерьера в принципе рисовать бессмысленно.
А вот у таких блоков есть прикол, что два соседствующих ребра двух моделек хоть вроде и имеют одинаковые координаты, на стыке этих двух ребер появляется просвет в виде точечек или небольших отрезков. Как с таким бороться?
Уже делаю.
А будет ли 3.3 работать на виндопланшетах на атоме? Просто я так мельком посмотрел все атомы, и все они вроде бы (я могу ошибаться), не поддерживают 3 версию. Из-за этого я и не могу определиться. Ибо для меня сенсорные устройства все же приоритетнее, да и сама по себе игра не шибко требовательна к графике. Другое дело что я могу ошибаться насчет атомов и поддержки на них версии 3.3
Ты смотри что за железо в этих атомах и смотри драйвера к нему.
ОГЛ - набор расширений, каждая новая версия добавляет какие-то свои новые расширения. Если, например, использовать только расширения начальной версии ogl 2.0, то приложение будет работать на любой версии. Если использовать расширения, которые не входят в состав начальной версии, то приложение будет на любой версии, в состав которых входят используемые расширения.
Потом добавим в шапку, спасибо.
офтоп
Бже, сколько же кириллов повсплывало в ГД, я хуею.
Хорошо хотьв уютный ОГЛ тредик не лезут.
Я тут)))0
Просто тут байтоебы тупые хуйней страдают вместо того чтоб игры делать и вообще тут все дохлое и тухлятиной воняет)) Пошел на хуй мамку таою ибал азазаз))0
Но ведь байтоебам действительно не место в этом разделе.
Надо поднять вопрос о переселении этих петухов куда-нибудь подальше отсюда, так как их фактическая деятельность к тематике раздела относится чуть более чем совсем никак. Рисование квадратиков и верчение кружочков по полтора года - это не геймдев.
>пидорнули, как остальную тематику
Падажжи, ебана.
Тоесть основной да-да, основной и единственный тред по АПИ для мобильных устройств пидорнут из /гд? Учитывая что сейчас все уходит в мобильное
Как-то глупо получается.
Имел в виду, что если бы было мало посещений, то убрали бы доску из списка досок, как многие другие.
Первые 2 int в файле это количество вершин и количество треугольников.
Далее подряд идут координаты вершин (по 3 float), за ними нормали (по 3 float), и после них текстурные координаты (по 2 float). После этого идут индексы вершин, образующих треугольники (по 3 int на треугольник).
Нормально ли так делать или можно придумать что-нибудь получше?
Зависит от того, как ты биндишь аттрибуты. Если все в один буфер, но локаторы аттрибутов линкуешь через смещения, то оставляй как есть. Если биндишь типы аттрибутов в отдельные буфера, то сначала идут n-значений одного типа аттрибутов, потом другого. Помести в начало заголовка инфу, что этот бинарник хранит меш. Если хочешь еще больше ускорения, то склеивай все меши в один файл, не забыв поместить в заголовок названия каждого меша и смещения головы и хвостов.
Бля, это кукла картинку прицепила))
Спасибо, подумаю.
Для когерентности доступа лусше пихать все в один буфер но не со смещениями, а структурой ( со всеми атрибутами пер обджект).
Обязательно. Спасибо.
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Простой апгрейд, кроссплатформенность, именно, что платформы, то есть и мобилы, и пека, и сосноли на мой взгляд, OpenGL проще осваивается, чем DX, да и код выглядит проще. Но под DX больше всяких материалов, учебников там, статей, в сдк кучи примеров.
>нубу
Нубу в рендер лезть противопоказанно.
Юзай Анрыло или еще какое двигло, там тебе будет графон за пару строчек.
Бля, а если анрыл не сможет в многопользовательность и большой мир? А он сможет, кстати? Ну то есть если это не получится у меня, я хотя бы буду представлять, какие костыли куда поставить. Да и вообще велосипеды - наше все. Я отдаю себе отчет в том что я долбаеб, но все же я всегда мечтал написать игру, а с использованием готового движка это уже как-то не то. Хотя хуй знает. Глядишь закончу институт и там мои амбиции пообрежуться
>>177546
Недавно наткнулся на один полезный ресурс.
Можно создать что-то вроде каталога линков и разбросать их по категориям.
Да и редактировать удобно.
Выглядеть будет, примерно, вот так: https://papaly.com/alinnert/dMw6/Web-Development
Что думаете по этому поводу?
Эх, хотел еще линков добавить, а тут такая хуйня. Ну ладно, в тред накидаю.
Хипсторство какое-то. Просто длинный список отгоняет нюфаков по-лучше.
Хотя если не лень чому бы нет..
Вроде все актуальные должны быть. Сам пока только Game Engine Architecture и Superbible читал, очень годные. На остальные времени не хватает, к сожалению.
А, збс.
Я собрался начать читать связку OpenGL Red Book + еще что-нибудь. Про архитектуру движков тогда и почитаю
А теперь сделай energy conservation и linear colorspace.
Просто интересно, кто-нибудь тут вращал кубик в Cogl? И как оно? Действительно так легко, как обещают?
upd. если бы был бы дан угол поворота относительно центра было бы можно высчитать по формулам:
[code]
\tx = x0 cos(a) - y0 sin(a);
\ty = y0 cos(a) + x0 sin(a);
[/code]
но как высчитать этот угол я тоже не знаю, да и должны быть более прямые способы
Вот твой угол.
Вот твой угол.
Для нахождения тангенса придёться использовать достаточно тяжелый sqrt
>да и должны быть более прямые способы
Ты игры хочешь делать, или в оптимизатора играться? Это самый очевидный способ и он хорошо работает. У тебя же не сто мини-карт (или для чего тебе такой фетиш) будет, а всего одна. Не еби гусей, бери что дают, иначе твои поиски грааля на каждом шагу доведут тебя до того, что игоря не будет, а будут вечные поиски. Перфекционизм оставь при себе, будешь надрачивать на него когда займешься оптимизацией УЖЕ ГОТОВОЙ игры.
sqrt по производительности равен делению. Если использовать тот трюк из движка первокваки, то он перестаёт быть медленным.
Юзаю, торт
Это копия, сохраненная 30 октября 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.