Pull to refresh

Comments 53

Что такое точечный продукт?

Садитесь, кол!
Какую последнюю научную статью по графике вы читали, можете ли её объяснить (это довольно распространённый вопрос)
о_О
А что не так? Статья претендует на «Программиста графики», а не на Engine/Gameplay/Animation/General программист. тут скорее имелось в виду «Расскажите что-нибудь с последнего SIGGRAPH»
Если для «Программиста графики» требуется читать научные статьи, то от «Engine developer» будут требовать чтение научных статей по матану?

Моя главная претензия именно к термину «научный». Может имелись ввиду «технические статьи»?
What is the last graphics paper you read, and can you explain it to me?(this was a pretty common question)

Чем «технические статьи» не «научные»? Вот, например, ссылка из этого поста на статью: cg.cs.uni-bonn.de/aigaion2root/attachments/MomentShadowMapping.pdf

А так программирование графики — это вполне себе R&D, там активно публикуют научные статьи, выступают на, например, вышеупомянутом SIGGRAPH. У «Как делают игры» пара выпусков подкаста посвящены программированию графики, они относительно старые, но их хватит для базового понимания работы графического программиста
kdicast.com/e/69-petr-sikachev-iz-eidos-o-programmirovanii-grafiki
kdicast.com/e/116-siggraph-2015-i-grafika-v-igrah
Статьи на хабре могут быть техническими, но они не научные. Научные, для меня,- это статьи в аккредитованный журналах.
Хорошо, тот мой вопрос и плохой, и не к месту. Мне непонятно, почему вас удивляет, что интерес к научным статьям является одним из критериев оценки графического программиста?
Научное = непроверенное на продакшене. Программирование графики это как «нарисовать сову». Рисуешь тень для куба… рисуешь тень на террабайтном террейне на андроиде в 120 fps (8ms)
Удивляет, потому что это бесполезный вопрос, который тратит и время собеседующего, и время собеседуемого. Почти со 100% вероятностью можно сказать, что если кандидат назовёт научную статью, то собеседующий её не читал и, зная специфику научных статей, маловероятно, что он вникнет в объяснения.
Это вопрос-ловушка.

Весь фокус во втором вопросе: «Расскажите, что вы вам помогла понять эта статья?»
Это не бесполезный вопрос, он помогает понять уровень интереса и погруженности человека в его профессиональную область, а так же системность его знаний. Лично я, помимо широты и глубины знаний, очень ценю их системность — имхо, это один из ключевых показателей их качества.

«Научная статья» звучит страшно, но на самом деле во многих из них ничего особо страшного нет, и там бывает можно найти реально полезные для практики техники, алгоритмы и тд. Например, я читал около десятка статей по алгоритмам построения выпуклой оболочки. Те куски, где автор пускается в сухие математические доказательства — пропускал. Но саму идею метода, в чем его плюсы и минусы — почерпнуть несложно. И понимание получается намного более цельным и системным, чем если прочитать пару обзорных статеек на том же Хабре.
Заинтересованность — это хорошо. Но, скажем, если человек не читает научные статьи — это будет плюс или минус? Это просто факт. Я к тому, что не совсем понимаю, как это поможет в принятие решения о найме.
Если не читает — это минус относительного другого кандидата, который читает.
Не решающий, не фатальный, но всё же.
в аккредитованных журналах
Вы, наверное, хотели сказать "в реферируемых"?
Хм, видимо с аккредитацией СМИ напутал. Спасибо за поправку.
Вы, наверное, хотели сказать «в рецензируемых»?
Да нет, я написал ровно то, что хотел :)
Ваш вариант, пожалуй, более правильный по-русски, но мне ближе калька с английского, а, судя по Википедии, можно и так и так.
Статья на хабре (вкупе с комментами, конечно) зачастую куда более толковая вещь, чем статья в абы-каком научном журнале. Особенно — на технологическую тему. Если в приличном журнале редактор перекинет твою статью 2-3-м людям, которых он считает специалистами в теме, они тебя попинают по делу, ты доработаешь и статью выкатят, то в средне-фиговом — это будет доцент с соседней кафедры, который в лучшем случает поправит какие-то совсем тупые нестыковки, и оно вылезет. На хабре же придёт куча народу (если тема интересная и картинку покрасивее воткнуть), и пинать будут нещадно, и комменты видны — рецензии же сильно не все журналы публикуют.
До публикации в журналах публикуют препринты на arxiv.org, где сможет пнуть кто угодно.
А где там комменты можно почитать?
Комментов нет :) Внизу обычно есть e-mail автора для обратной связи.

Хе! В настоящих абы каких журналах автора просят принести рецензию с собой. И за деньги.

Ох, вы промптом переводили, что ли? Большая састь вопросов просто некорректна. А перевести features как функция — это, конечно, особое видение.
ps. Знаю, что такое обычно в ЛС пишут, но тут куда не ткни — ошибка.
Сколько собеседований вы прошли? Большая выборка?
UFO just landed and posted this here
обычный вчерашний студент, вроде
Как показывает практика, книги, собственный опыт проведения собеседований, да и подтверждают давние дискуссии на различных технических площадках (за последние 15-20 лет) список вопросов почти один и тот же, а вот список «правильных» ответов на эти вопросы всегда меняется из года в год и от одной головы к другой.
Что такое прямой и обратный порядок байтов?

Это вы так про little- и big- endian???
Да, это оно. Вопрос просто для того знаком ли человек с бинарной совместимостью. И что бывает разное выравнивание, порядок байт. Что бинарный фаил на одной платформе не будет читаться на жругой.
Начинающий программист? Хорошо что я фронтендер.

Мне никто не задавал вопросов, скажем, о том как JS реализует механизм Proxy в движке V8.
Ну так-то на собеседованиях вполне себе спрашивают, что там внутри движка. Например, чем отличаются следующие две конструкции?:

function Class1(){}
Class1.prototype.func1 = function(){};
Class1.prototype.func2 = function(){};

function Class2(){}
Class2.prototype = {
  func1: function(){},
  func2: function(){}
};
Про недостаток конструктора не каждый догадается. Вообще довольно сложный вопрос для собеседования. Я вот даже не уверен не забыл я чего еще. Я любил задавать такие вопросы. Следующий вопрос задаю по мере того, как человек отвечает на предыдущий.

1. Что выведет этот код?
2. Почему так происходит?
3. Как бы вы его переписали, чтобы избежать неявного поведения?

function MyClass (name) {
   this.options.name = name;
}

MyClass.prototype.options = {
   name: "Default name"
};

var foo = new MyClass("foo");
var bar = new MyClass("bar");

console.log(
   foo.options.name,
   bar.options.name
);
Мда. В очередной раз убеждаюсь в собственной никчемности…
Слава богу, заказчики не проводят собеседований и не знают, с каких херовым специалистом работают.
Да что за вопросы то такие?!
На них реально многие знают ответы?
Я вот на значительную часть представляю ответ. Но гарантирую, что если бы я писал графический движок, то на большинство знал бы ответ, ибо смутно представляю, как без знания ответов на них написать движок рендеринга для современной 3д-игры. Большинство вопросов по математике — это минимальная база, которая необходима для написанияч шейдеров. Чтобы знать ответ на вопрос про кватернионы — достаточно слышать о gimbal lock, сложнее будет, если попросят написать пример кватерниона — там уже без опыта не обойтись.

Как можно написать графический движок, если ты не знаешь, как создать тени (а они зависимо от требований реально должны создаваться разными способами), если не знаешь алгоритмов сглаживания, Forward vs Deferred рендеринг — два основных подхода сейчас, PBR — это то, как создаются материалы и считается отражение света от них.

Серьезно, я вот прочитал вопросы, я понимаю их все (пусть и знаю ответы только поверхностно), но гарантирую, тот, кто занимается созданием графического движка не сможет работать без знания ответов на них.
Я писал много движков, с нуля.
Писал собственную мат либу.
Но яне смогу ответить на вопрос ка кнайти пересечение прямой и плоскости. Ну так то ответ очевиден, уроавнение прямой + уравнение плоскости. Но я навскидку не помню уроавнения плоскости. Занятно, пока писал что не помню — вспомнил. Оно примитивное и я его понимаю, а не помню.
Ну ладно, забудем про прямую и плоскость. Есть миллион важных для прогера движка формул. Я их не помню. Либу для кватернионов я писал тупо по методичке, потому что осилить их суть не смог(правда и не особо пытался). При этом либа вполне работает.
ПРостой пример, который всегда привожу: я не смогу без гугеля написать инициализацию OpenGL 3. Делал это много раз. Но как в деталях делается не помню. Суть помню: Формат пикселя->инициализация контекста->загрузка расширений->повторная инциализация контекста.
Но написать кодом не смогу. Не помню и не понимаю зачем мне это помнить.

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

При этом совсем нет вопросов про граффический конвеер, которые как минимум также важны как понимание кэша.
При этом совсем нет вопросов про граффический конвеер, которые как минимум также важны как понимание кэша.

Последний вопрос как раз про графический конвеер.

Мне кажется, что все, что вы написали — было бы достаточно. Ну то есть к примеру ответить: «уроавнение прямой + уравнение плоскости, но навскидку не вспомню их» вполне достаточно.

Либу для кватернионов я писал

Вы видели вопрос в топике? Зачем кватернионы, если есть углы Эйлера, которые попроще. Смогли бы ответить?

Суть помню

Мне кажется, что на собесе вполне подошел бы такой ответ.

Вот вы можете сказать чем отличается Forward от Deferred рендеринга? Я уверен, что сможете. Из каких текстур состоят материалы, что такое шероховатость, карта нормалей, карта альбедо? Уверен, что тоже сможете.

Вот в топике большинство вопросов такие — на общее понимание, я не видел там нигде призывов писать код. Вы согласны, что без понимания этих вещей графический движок написать сложно?
90% собеседований спрашивают теорию и сферические алгоритмы в вакууме. 90% времени на работы вы будете воевать с API и инструментарием. Тоесть если вы забыли какие-то API GL, то всем пофигу. Если вы не можете нарисовать на доске картинку PBR, то уже хуже. Основная задача проверить, что вы не будете впадать в ступор и паниковать при виде такого или иного круга задач.
У меня для собеседований есть кусок полуговнокода. Прошу просто прочитать его и сказать по русски что он на самом деле делает.

Тест близкий к идеальному;)

Это в США культура собеседований, где принято тратить на собеседование много времени в любой компании. И ты знаешь, что конкуренты действуют также. А у нас если не сделаешь адекватному товарищу оффер в первые три дня его поиска работы, то искать будешь ещё долго.

Поэтому, если бы я собеседовал на графику, то адеквату просто дал бы задачу на то же пересечение прямой плоскости. И 10-20 минут за компом с инетом. И по PBR задал вопрос и при «не аллё», дал бы 5 минут в интернете и попросил бы своими словами описать, что это за зверь. И как и где его можно использовать или не использовать или как сделать вид, что его использовали.

И оценивал не только «схватывание», а насколько человека заинтересовало то, что он только что прочитал)

Приёмам работы можно обучить и обезьяну…
UFO just landed and posted this here
Я не понимаю какое отношение трассировка лучей имеет к разработке графического движка

Графический движок может быть как real-time, так и нет.
Не real-time движки обычно графическими движками не называют, это обычно «системы рендеринга» или «рендер» в просторечии.
Ну и это вообще другая область разработки, другие техники и другие проблемы.
Horizon-Based Ambient Occlusion (HBAO): Considers the depth buffer as a heightfield, and approximates ray-tracing this heightfield
GPU Ray-Casting for Scalable Terrain Rendering
Техник много разных. Имею ввиду популярные и актуальные.
Я писал много движков, с нуля. Писал собственную мат либу. Но я не смогу ответить на вопрос, как найти пересечение прямой и плоскости.

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


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

Ну так-то ответ очевиден, уравнение прямой + уравнение плоскости.

Не обязательно. Обычно намного удобнее всё представлять точками и векторами и решать задачи через свойства скалярного и векторного произведений и свойства треугольников и параллелограммов (привет школьной геометрии, про которую все думали, что никогда не пригодится). Прямую удобно представлять как произвольную точку на ней и единичный вектор направления. Плоскость ― как произвольную точку на ней и единичный вектор нормали. Либо как нормаль и расстояние от плоскости до начала координат (эти же значения используются и в уравнении плоскости).


Если для решения задач писать уравнения, то 1) для 2D и 3D они разные; 2) в коде появляются магические трёхэтажные формулы, по которым хрен поймёшь, что и как они считают.


А вектора и точки остаются векторами и точками и в 2D, и в 3D. Решения многих задач универсальны и записываются короче.


Например, как найти расстояние от точки P до произвольной прямой? Если прямая задана точкой O и единичным вектором направления D, то искомое расстояние ― это тупо модуль векторного произведения (O, P) и D, просто исходя из школьной формулы площади параллелограмма и свойств векторного произведения. Решение в одну строчку:
cross(line.origin - point, line.direction).magnitude

Неужели никогда не приходилось это делать?

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

Кстати, а разве запекание света делается не через трассировку лучей?
Это тупа вопросы с экзамена по курсу компьютерной рафики любого ВУЗа ЕС или США. Так что да, знают.
А как же ТОП-0 по C++: «Почему нельзя бросать исключения в деструкторе?»
Можно. Рекомендация звучит несколько иначе: «Не позволяйте исключениям покидать деструктор»
«Когда следует использовать виртуальные деструкторы? (Интервьюеры в совершенном восторге от этого вопроса!)»

Есть отличный вопрос: «Зачем нужны виртуальные конструкторы» Обычно народ смеется, но иногда начинает креативить такое… Особенно хорошо сочетается, когда у человека написано, что он C/C++ expert. Кстати, если спросить у тех, кто написал, что он «C/C++ чего-то там», в чем разница между C и C++, то тоже периодически креативят довольно много интересного.
Sign up to leave a comment.

Articles