Комментарии 53
Что такое точечный продукт?
Садитесь, кол!
Какую последнюю научную статью по графике вы читали, можете ли её объяснить (это довольно распространённый вопрос)о_О
Моя главная претензия именно к термину «научный». Может имелись ввиду «технические статьи»?
What is the last graphics paper you read, and can you explain it to me?(this was a pretty common question)
А так программирование графики — это вполне себе R&D, там активно публикуют научные статьи, выступают на, например, вышеупомянутом SIGGRAPH. У «Как делают игры» пара выпусков подкаста посвящены программированию графики, они относительно старые, но их хватит для базового понимания работы графического программиста
kdicast.com/e/69-petr-sikachev-iz-eidos-o-programmirovanii-grafiki
kdicast.com/e/116-siggraph-2015-i-grafika-v-igrah
Весь фокус во втором вопросе: «Расскажите, что вы вам помогла понять эта статья?»
«Научная статья» звучит страшно, но на самом деле во многих из них ничего особо страшного нет, и там бывает можно найти реально полезные для практики техники, алгоритмы и тд. Например, я читал около десятка статей по алгоритмам построения выпуклой оболочки. Те куски, где автор пускается в сухие математические доказательства — пропускал. Но саму идею метода, в чем его плюсы и минусы — почерпнуть несложно. И понимание получается намного более цельным и системным, чем если прочитать пару обзорных статеек на том же Хабре.
в аккредитованных журналах
Вы, наверное, хотели сказать "в реферируемых"?
Ваш вариант, пожалуй, более правильный по-русски, но мне ближе калька с английского, а, судя по Википедии, можно и так и так.
ps. Знаю, что такое обычно в ЛС пишут, но тут куда не ткни — ошибка.
Что такое прямой и обратный порядок байтов?
Это вы так про 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 );
Слава богу, заказчики не проводят собеседований и не знают, с каких херовым специалистом работают.
На них реально многие знают ответы?
Как можно написать графический движок, если ты не знаешь, как создать тени (а они зависимо от требований реально должны создаваться разными способами), если не знаешь алгоритмов сглаживания, Forward vs Deferred рендеринг — два основных подхода сейчас, PBR — это то, как создаются материалы и считается отражение света от них.
Серьезно, я вот прочитал вопросы, я понимаю их все (пусть и знаю ответы только поверхностно), но гарантирую, тот, кто занимается созданием графического движка не сможет работать без знания ответов на них.
Писал собственную мат либу.
Но яне смогу ответить на вопрос ка кнайти пересечение прямой и плоскости. Ну так то ответ очевиден, уроавнение прямой + уравнение плоскости. Но я навскидку не помню уроавнения плоскости. Занятно, пока писал что не помню — вспомнил. Оно примитивное и я его понимаю, а не помню.
Ну ладно, забудем про прямую и плоскость. Есть миллион важных для прогера движка формул. Я их не помню. Либу для кватернионов я писал тупо по методичке, потому что осилить их суть не смог(правда и не особо пытался). При этом либа вполне работает.
ПРостой пример, который всегда привожу: я не смогу без гугеля написать инициализацию OpenGL 3. Делал это много раз. Но как в деталях делается не помню. Суть помню: Формат пикселя->инициализация контекста->загрузка расширений->повторная инциализация контекста.
Но написать кодом не смогу. Не помню и не понимаю зачем мне это помнить.
Я не понимаю какое отношение трассировка лучей имеет к разработке графического движка.Сходу вот так типичных примеров не могу вспомнить, где он был бы нужен. Как минимум настолько, чтобы в нём досканально разбираться.
При этом совсем нет вопросов про граффический конвеер, которые как минимум также важны как понимание кэша.
При этом совсем нет вопросов про граффический конвеер, которые как минимум также важны как понимание кэша.
Последний вопрос как раз про графический конвеер.
Мне кажется, что все, что вы написали — было бы достаточно. Ну то есть к примеру ответить: «уроавнение прямой + уравнение плоскости, но навскидку не вспомню их» вполне достаточно.
Либу для кватернионов я писал
Вы видели вопрос в топике? Зачем кватернионы, если есть углы Эйлера, которые попроще. Смогли бы ответить?
Суть помню
Мне кажется, что на собесе вполне подошел бы такой ответ.
Вот вы можете сказать чем отличается Forward от Deferred рендеринга? Я уверен, что сможете. Из каких текстур состоят материалы, что такое шероховатость, карта нормалей, карта альбедо? Уверен, что тоже сможете.
Вот в топике большинство вопросов такие — на общее понимание, я не видел там нигде призывов писать код. Вы согласны, что без понимания этих вещей графический движок написать сложно?
Тест близкий к идеальному;)
Это в США культура собеседований, где принято тратить на собеседование много времени в любой компании. И ты знаешь, что конкуренты действуют также. А у нас если не сделаешь адекватному товарищу оффер в первые три дня его поиска работы, то искать будешь ещё долго.
Поэтому, если бы я собеседовал на графику, то адеквату просто дал бы задачу на то же пересечение прямой плоскости. И 10-20 минут за компом с инетом. И по PBR задал вопрос и при «не аллё», дал бы 5 минут в интернете и попросил бы своими словами описать, что это за зверь. И как и где его можно использовать или не использовать или как сделать вид, что его использовали.
И оценивал не только «схватывание», а насколько человека заинтересовало то, что он только что прочитал)
Приёмам работы можно обучить и обезьяну…
Я не понимаю какое отношение трассировка лучей имеет к разработке графического движка
Графический движок может быть как real-time, так и нет.
Я писал много движков, с нуля. Писал собственную мат либу. Но я не смогу ответить на вопрос, как найти пересечение прямой и плоскости.
Неужели никогда не приходилось это делать? Я себе написал либу по поиску пересечений между отрезками, лучами, прямыми и плоскостями, а также расстояний между всеми ними, после того как задолбался по десять раз перерешивать однотипные задачи.
- Найти точку на земле или другой поверхности, на которую игрок указывает прицелом или курсором мыши. Это в чистом виде поиск пересечения луча/прямой с плоскостью.
- Есть луч и треугольник. Определить, проходит ли луч сквозь треугольник, и если да, то в какой точке. Ищем точку пересечения луча с плоскостью треугольника. Если таковая есть, проверяем, она внутри него или снаружи.
- Есть полигон и плоскость. Определить, пересекаются ли они, и если да, то разрезать полигон плоскостью на две части. По ходу решения потребуется поиск точки пересечения отрезка/прямой и плоскости.
Ну так-то ответ очевиден, уравнение прямой + уравнение плоскости.
Не обязательно. Обычно намного удобнее всё представлять точками и векторами и решать задачи через свойства скалярного и векторного произведений и свойства треугольников и параллелограммов (привет школьной геометрии, про которую все думали, что никогда не пригодится). Прямую удобно представлять как произвольную точку на ней и единичный вектор направления. Плоскость ― как произвольную точку на ней и единичный вектор нормали. Либо как нормаль и расстояние от плоскости до начала координат (эти же значения используются и в уравнении плоскости).
Если для решения задач писать уравнения, то 1) для 2D и 3D они разные; 2) в коде появляются магические трёхэтажные формулы, по которым хрен поймёшь, что и как они считают.
А вектора и точки остаются векторами и точками и в 2D, и в 3D. Решения многих задач универсальны и записываются короче.
Например, как найти расстояние от точки P до произвольной прямой? Если прямая задана точкой O и единичным вектором направления D, то искомое расстояние ― это тупо модуль векторного произведения (O, P) и D, просто исходя из школьной формулы площади параллелограмма и свойств векторного произведения. Решение в одну строчку:
cross(line.origin - point, line.direction).magnitude
Я не понимаю какое отношение трассировка лучей имеет к разработке графического движка
Кстати, а разве запекание света делается не через трассировку лучей?
Есть отличный вопрос: «Зачем нужны виртуальные конструкторы» Обычно народ смеется, но иногда начинает креативить такое… Особенно хорошо сочетается, когда у человека написано, что он C/C++ expert. Кстати, если спросить у тех, кто написал, что он «C/C++ чего-то там», в чем разница между C и C++, то тоже периодически креативят довольно много интересного.
Самые распространённые вопросы на собеседовании программиста графики