Тут не поспоришь. До тех пор, пока заказчики не начнут подсчитывать убытки от позднего обнаружения багов, для них главным аспектом будет скорость и лёгкость разработки. Надеюсь, они таки образумятся ;)
Битовое представление float нужно хотя бы для того, чтобы определить, достаточно ли точности в определённых сценариях. Допустим, в каком формате экспортировать упакованные нормали? Или какой формат HDR поверхности лучше подойдёт для Вашей модели освещения?
Вашего смутного представления не достаточно хотя бы потому, что Вы забыли про бит знака.
Про математику и ортонормированную матрицу… грустно. Знать такие трюки нужно хотя бы для интуиции. Чтобы при поисках решения графических задач, уже на этапе моделирования (а не реализации) Вы могли оценить возможные варианты их сложность. Любой инженер может по учебнику написать алгоритм и даже оптимизировать его. Настоящего мастера отличает высокоточная интуиция, умение быстро и уверенно плавать в пространстве решений.
Вся красота игры Жизнь в простоте её правил, точно также как и фракталы красивы своими порою однострочными уравнениями (аля z' = z^2 + c). Ваши эксперименты с усложнением системы имеют слишком много параметров. Я бы ограничился разделением видов на хишники/травоядные и посмотрел, как далеко с этим подходом можно зайти.
Как и прошлая статья в серии, эта значительно обделяет вниманием BWT семейство алгоритмов. Там ведь столько всего интересного: DC, MTF, WFT, IF, и другие, а не только bzip2, который, к слову, не так уж и прост в своей BWT реализации. С другой стороны, LZ расписано довольно подробно, и на этом спасибо!
Какое интересное замечание! С другой стороны, для женщины данная статья не показалась бы такой ценной/сочной, как для мужчины, ибо ей всё это очевиднее. Так что же побудило авторшу перевода на подвиг?
Грустное впечатление осталось у меня после статьи. Если мы каждому студенту будем говорить «ты не программист, ты средство увеличения прибыли работодателя», то в сухом остатке получим лишь быдлокодеров и карьеристов. Нет уж, спасибо.
Программист — это не только профессия, но и состояние души, и как-раз эту романтическую составляющую и пытается искоренить данная статья. Прибыль для компании, как и зарплата, это лишь побочный эффект. Главное же — созидание, творчество, инновация. Не важно, на работе или дома; не важно, на Java или Asm, не важно даже, в Сан Франциско или в Минске.
То, что многие программисты слишком увлекаются строительством своих песочных замков, это не проблема с их самоопределением. Это проблема с вниманием и пониманием работодателя. Другими словами, тут нет ничего особенно программисткого. Любой человек, связанный с чем-либо или кем-либо (контрактом с работодателем, кольцами с супругом, обещанием с другом), просто должен понимать, чего хочет другая сторона, и чего от него сомого ждут.
Разумеется использование функции discard (а также функции if и непоследовательного доступа к текстурам) в пиксельном шейдере – это зло и низкий fps.
Ничего страшного в discard нет, if у Вас всё равно сильно не меняет ход событий, а непоследовательного доступа к текстурам я в этом шейдере не вижу. Проблема плохого FPS скорее всего просто в том, что Вы рисуете весь экран лишний раз.
делаю один фреймбуфер c маленькой текстурой газа, строю VBO трафарета, в который складирую координаты текстур трубопровода, координаты текстур газа, и координаты экрана и рендерю на экран
> В данном случае, главное — идея, я же не делаю коммерческий продукт.
Идея-то создать 3d движок на javascript отнюдь не нова… Вы не подумайте, я не против, если хабру полезно почитать Ваш подход. Просто если уж подходить к написанию статьи тут, то, мне кажется, качество кода нужно держать на высоте.
> А я не знал, что это выкрутасы ))).
Так зачем всё-таки брать по модулю и отдельно для каждой компоненты?
> «When a buffer is bound to a target, the previously bound buffer for that target is automatically unbound.».
Так и есть, Вы не смущайтесь. Буффер и не должен быть подключён во время отрисовки. Всё, что определяет входную геометрию, заключено в gl.vertexAttribPointer. Когда вызываете эту функцию, то соответствующий слот входов шейдера получает ассоциацию с неким участком видеопамяти (с дополнительной семантикой типов). Эта функция зависит от текущего подключенного буффера. А когда вы эти слоты привязали — можете и отключить буффер вовсе.
Ну да, только не очевидно 1: почему не abs(), и 2: зачем там вообще брать модуль. Это не говоря о том, что одинаковое длинное выражение написано для всех 3-х компонент, вместо простой векторной арифметики…
Мы будем использовать один буфер для всех объектов и соответственно всех вершин и индексов. В дальнейшем, если будет возможность использовать несколько буферов — тип фигуры будет находится в самом объекте примитива. (Если такая возможность уже есть — напишите, пожалуйста, в комментариях.)
Не понял. Вы спрашиваете, есть ли возможность использовать разные буфера для разных объектов или их атрибутов? Конечно, есть, с незапамятных времён есть в OpenGL. Основы этого замечательного API я бы Вам порекомендовал изучить более обстоятельно прежде, чем начинать писать свой движок (а тем более учить других):
1. gl.vertexAttribPointer вызываете и в attributeSetup, и в отрисовке. Определитесь уж, пожалуста. А что самое печальное, так это отсутствие gl.bindBuffer перед ним, так что Вы полагаетесь на то, что со времён вызова initBuffers ничего не поменялось.
2. gl.enableVertexAttribArray так вообще в трёх разных местах (attributeSetup, initBuffers, initProgram). На всякий пожарный, да?
3. Зачем вообще трогаете botuPositionAttr в initBuffers? На этот момент Вы уже вызвали initProgram, который эту позицию определил.
4 К чему такие выкрутасы в шедере: max(botuPosition.x,(-1.0) * botuPosition.x)?
Жаль… А потом говорят, что Rust сложный. Там хотя бы вся стандартная библиотека написана на самом языке и ничем не лучше частного кода.
А Роб прикольный чувак. Видел его в битве с Страуструпом, Александреску и Максакисом на LangNext.
Мне нравится, каким позитивным у Вас получился комментарий. По-больше бы добра в наши языковые войны ;)
Я очень искренне хотел бы любить и Go, я согласен про классы (вопрос о том, хорошо ли неявное совпадение с интерфейсами, оставим на сладкое), и исключений не хочу касаться за милю. Убогим Go назвать ну никак нельзя. Объясните мне только, когда, наконец, можно будет самому написать такие же обобщённые контейнеры, которые предоставляет стандартная библиотека? Версия 1.2 уже вышла, что явно не располагает к масшабным изменениям в будущем.
Весело Вы сравниваете. Слева и небо есть, и земля не вклеточку, и (что самое главное) текстуры детализированные, в том числе и нормалей.
Битовое представление float нужно хотя бы для того, чтобы определить, достаточно ли точности в определённых сценариях. Допустим, в каком формате экспортировать упакованные нормали? Или какой формат HDR поверхности лучше подойдёт для Вашей модели освещения?
Вашего смутного представления не достаточно хотя бы потому, что Вы забыли про бит знака.
Про математику и ортонормированную матрицу… грустно. Знать такие трюки нужно хотя бы для интуиции. Чтобы при поисках решения графических задач, уже на этапе моделирования (а не реализации) Вы могли оценить возможные варианты их сложность. Любой инженер может по учебнику написать алгоритм и даже оптимизировать его. Настоящего мастера отличает высокоточная интуиция, умение быстро и уверенно плавать в пространстве решений.
«Методы сжатия данных. Устройство архиваторов, сжатие изображений и видео» ISBN 5-86404-170-X; 2003 г.
Написана титанами отечественного архиваторостроения.
Программист — это не только профессия, но и состояние души, и как-раз эту романтическую составляющую и пытается искоренить данная статья. Прибыль для компании, как и зарплата, это лишь побочный эффект. Главное же — созидание, творчество, инновация. Не важно, на работе или дома; не важно, на Java или Asm, не важно даже, в Сан Франциско или в Минске.
То, что многие программисты слишком увлекаются строительством своих песочных замков, это не проблема с их самоопределением. Это проблема с вниманием и пониманием работодателя. Другими словами, тут нет ничего особенно программисткого. Любой человек, связанный с чем-либо или кем-либо (контрактом с работодателем, кольцами с супругом, обещанием с другом), просто должен понимать, чего хочет другая сторона, и чего от него сомого ждут.
(Шикарная статья, по-больше бы таких!)
Ничего страшного в
discard
нет,if
у Вас всё равно сильно не меняет ход событий, а непоследовательного доступа к текстурам я в этом шейдере не вижу. Проблема плохого FPS скорее всего просто в том, что Вы рисуете весь экран лишний раз.Это зачёт :)
Идея-то создать 3d движок на javascript отнюдь не нова… Вы не подумайте, я не против, если хабру полезно почитать Ваш подход. Просто если уж подходить к написанию статьи тут, то, мне кажется, качество кода нужно держать на высоте.
> А я не знал, что это выкрутасы ))).
Так зачем всё-таки брать по модулю и отдельно для каждой компоненты?
> «When a buffer is bound to a target, the previously bound buffer for that target is automatically unbound.».
Так и есть, Вы не смущайтесь. Буффер и не должен быть подключён во время отрисовки. Всё, что определяет входную геометрию, заключено в
gl.vertexAttribPointer
. Когда вызываете эту функцию, то соответствующий слот входов шейдера получает ассоциацию с неким участком видеопамяти (с дополнительной семантикой типов). Эта функция зависит от текущего подключенного буффера. А когда вы эти слоты привязали — можете и отключить буффер вовсе.Не понял. Вы спрашиваете, есть ли возможность использовать разные буфера для разных объектов или их атрибутов? Конечно, есть, с незапамятных времён есть в OpenGL. Основы этого замечательного API я бы Вам порекомендовал изучить более обстоятельно прежде, чем начинать писать свой движок (а тем более учить других):
1.
gl.vertexAttribPointer
вызываете и вattributeSetup
, и в отрисовке. Определитесь уж, пожалуста. А что самое печальное, так это отсутствиеgl.bindBuffer
перед ним, так что Вы полагаетесь на то, что со времён вызоваinitBuffers
ничего не поменялось.2.
gl.enableVertexAttribArray
так вообще в трёх разных местах (attributeSetup
,initBuffers
,initProgram
). На всякий пожарный, да?3. Зачем вообще трогаете
botuPositionAttr
вinitBuffers
? На этот момент Вы уже вызвалиinitProgram
, который эту позицию определил.4 К чему такие выкрутасы в шедере:
max(botuPosition.x,(-1.0) * botuPosition.x)
?А Роб прикольный чувак. Видел его в битве с Страуструпом, Александреску и Максакисом на LangNext.
Я очень искренне хотел бы любить и Go, я согласен про классы (вопрос о том, хорошо ли неявное совпадение с интерфейсами, оставим на сладкое), и исключений не хочу касаться за милю. Убогим Go назвать ну никак нельзя. Объясните мне только, когда, наконец, можно будет самому написать такие же обобщённые контейнеры, которые предоставляет стандартная библиотека? Версия 1.2 уже вышла, что явно не располагает к масшабным изменениям в будущем.