Блог страдающего Лиса
Lorem ipsum hello dolor sit world amet
20 дек 2024 Пт
Технологии графики 3D: Отбрасывание теней
Вчера я задумался насчет 3Д графики и понял, что если не сделать тени, то в таком случае графика будет слишком неинтересной и пресной. Но как сделать тени? Этот вопрос мучает меня до сих пор в очень огромных масштабах.
В графических программах основным строительным блоком является треугольник, и он должен отбрасывать тень на другие треугольники, если они там есть. Есть множество различных способов высчитывать тень, но я хочу рассмотреть пока что одну из самых для меня доступных для понимания.
Допустим, что есть только 3 объекта на сцене: источник света L, треугольник A (который отбрасывает тень) и второй треугольник B (на который отбрасывается тень). Сама по себе тень образует некий треугольный конус, в который может полностью, частично или вообще не попасть треугольник, на который эта тень отбрасывается.
Задача в том, чтобы проверить, попадает ли тень на второй треугольник. Для этого надо провести из точки L через каждую точку треугольника A прямую и проверить, где именно на плоскости треугольника B попадет эта прямая. Если треугольник лежит параллельно этой прямой, то это значит что эта прямая, собственно, нигде треугольник не пересечет.
По итогу получится что-то вроде проекции на плоскость, где лежит треугольник B. Это значит, что от трехмерных координат мы переходим к двухмерным, что дает возможность определить область попадания тени на треугольник B.
Вот тут конечно, начинается самое интересное. Как видно, проекция тени A1'A2'A3' пересекла треугольник B в двух местах, раздробив изначально простые треугольнки на большое количество составляющих.
Так что я думаю, что этот подход удобен только в качестве учебного пособия, не более того. С другой стороны, этот метод является "запеканием" теней и в каком-то смысле, удобен для того чтобы сгенерировать геометрию изначально до того, как ее отрисовывать, и во время рисования очередного кадра больше не придется обсчитывать тени заново.
Единственное что может обсчитываться, так это интенсивности света, но это уже сделать гораздо проще.
Проблема может возникнуть именно с динамическими тенями, поскольку в этом случае придется считать все заново каждый раз для сцены.
В графических программах основным строительным блоком является треугольник, и он должен отбрасывать тень на другие треугольники, если они там есть. Есть множество различных способов высчитывать тень, но я хочу рассмотреть пока что одну из самых для меня доступных для понимания.
Допустим, что есть только 3 объекта на сцене: источник света L, треугольник A (который отбрасывает тень) и второй треугольник B (на который отбрасывается тень). Сама по себе тень образует некий треугольный конус, в который может полностью, частично или вообще не попасть треугольник, на который эта тень отбрасывается.
Задача в том, чтобы проверить, попадает ли тень на второй треугольник. Для этого надо провести из точки L через каждую точку треугольника A прямую и проверить, где именно на плоскости треугольника B попадет эта прямая. Если треугольник лежит параллельно этой прямой, то это значит что эта прямая, собственно, нигде треугольник не пересечет.
По итогу получится что-то вроде проекции на плоскость, где лежит треугольник B. Это значит, что от трехмерных координат мы переходим к двухмерным, что дает возможность определить область попадания тени на треугольник B.
Вот тут конечно, начинается самое интересное. Как видно, проекция тени A1'A2'A3' пересекла треугольник B в двух местах, раздробив изначально простые треугольнки на большое количество составляющих.
- Раздробилась сама проекция тени, образовав дочерние теневые треугольники 1,2 и 3
- А также раздробился исходный треугольник, разделившись на две группы — 4 и 5 (там где легла тень) и 6,7,8 там где тени нет
Так что я думаю, что этот подход удобен только в качестве учебного пособия, не более того. С другой стороны, этот метод является "запеканием" теней и в каком-то смысле, удобен для того чтобы сгенерировать геометрию изначально до того, как ее отрисовывать, и во время рисования очередного кадра больше не придется обсчитывать тени заново.
Единственное что может обсчитываться, так это интенсивности света, но это уже сделать гораздо проще.
Проблема может возникнуть именно с динамическими тенями, поскольку в этом случае придется считать все заново каждый раз для сцены.
14 мар 2023 Вт
Мне как-то нечего писать сюда
Обнаружил то, что спустя два месяца я полностью выдохся и мне нечего писать в свой блог. Продолжаю постепенно делать то, что делал, это процессор AVR, вот к примеру, сегодня я сделал вывод стартового экрана для Award Modular, и это оказалось не так сложно. У меня нет до сих пор модуля SDRAM, так что тест памяти будет невозможен, но с другой стороны, его легко можно будет сделать просто так, без всякого теста памяти, а просто счетчиком.
Проснулся я сегодня с мыслью о трехмерной графике, и опять понимания, что ничего не выйдет, начал снова задавать один и тот же вопрос, который задаю уже на протяжении столетий — 3ой4? Ну зачем мне эта трехмерная графика, когда я не могу ничего сделать в трехмерном пространстве. Куб вращать? Надоело уже постоянно его вращать, без конца только и занят кубовращением бессмысленным. Можно же уже и перестать это делать и нормальное что-то давно сделать, но нет же, я вращаю кубы налево и направо, сверху вниз.
Когда-то давно была идея сделать на верилоге этот куборотор, но есть одна колоссальная проблема, которая заключается в том, что это далеко не так просто, вообще. Сделать на верилоге трехмерный ускоритель... это же ужасно трудно, и все равно, зачем оно мне так надо? Ну вообще же не надо совершенно! Не нужно, не нужно, не нужно... а хочется. Никак не могу убедить себя в том, что мне это не нужно, потому что все время хочется сделать и все тут. Ну как же быть то...
Вся эта затея с трехмерной графикой мне кажется идиотской.
Вот реально, допустим, ну сделаю я к примеру, кубы. И что дальше то, что дальше делать буду? На этом все, кубы и это все, на что я способен? Больше нет ничего, кроме кубов? Мне даже обычную трехмерную модель загрузить сложно, не то что все остальное сделать. У меня еще есть одна странная мысль, которая заключается в том, чтобы сделать симулятор космического полета к другим планетам и даже звездам. Для этого потребуется создать трехмерный космический корабль и я не знаю, как это сделать, ведь его нужно делать, а как, неизвестно. Сделать на ПЛИС такую штуку, типа, вылетаешь с планеты и летишь куда-то за определенное время. Мысли сумбурны и не оформлены, да и постоянное ощущение, что мне это не будет нужно. И это и правда, мне не будет нужно, это так.
Может, сделать рейтрейсинг на ПЛИС?.. А зачем.. нет, я все-таки упираюсь в одну и ту же фразу — зачем? Нет никакого смысла, незачем, а если это так, то тогда может, просто отпустить эту тему? Не все так просто! Я не могу ее отпустить. Уже сколько раз пытался, но не могу.
Единственное, что я понял за все время, что занимаюсь плисами и верилогом, это только одно, мне все это не нужно. Ни верилог, ни плис, ни програмирование, ни вообще что-либо, кроме бесконечного прослушивания музыки. А раз так, то мне надо сделать аудиоплеер!
— А зачем?
Ахахахаха! Вот именно, а зачем, зачем, зачем, зачем? Этот дебильный вопрос не отпускает. Даже такую важную штуку для меня, как музыка, я не хочу делать, не вижу смысла. А зачем? Есть же комп. Для чего мне надо напрягаться и делать что-то, когда я просто одену наушники и буду прослушивать себе спокойно любую музыку.
Ответ на вопрос "Зачем" есть только один "Шутки ради". Больше мне делать все это незачем.
Проснулся я сегодня с мыслью о трехмерной графике, и опять понимания, что ничего не выйдет, начал снова задавать один и тот же вопрос, который задаю уже на протяжении столетий — 3ой4? Ну зачем мне эта трехмерная графика, когда я не могу ничего сделать в трехмерном пространстве. Куб вращать? Надоело уже постоянно его вращать, без конца только и занят кубовращением бессмысленным. Можно же уже и перестать это делать и нормальное что-то давно сделать, но нет же, я вращаю кубы налево и направо, сверху вниз.
Когда-то давно была идея сделать на верилоге этот куборотор, но есть одна колоссальная проблема, которая заключается в том, что это далеко не так просто, вообще. Сделать на верилоге трехмерный ускоритель... это же ужасно трудно, и все равно, зачем оно мне так надо? Ну вообще же не надо совершенно! Не нужно, не нужно, не нужно... а хочется. Никак не могу убедить себя в том, что мне это не нужно, потому что все время хочется сделать и все тут. Ну как же быть то...
Вся эта затея с трехмерной графикой мне кажется идиотской.
Вот реально, допустим, ну сделаю я к примеру, кубы. И что дальше то, что дальше делать буду? На этом все, кубы и это все, на что я способен? Больше нет ничего, кроме кубов? Мне даже обычную трехмерную модель загрузить сложно, не то что все остальное сделать. У меня еще есть одна странная мысль, которая заключается в том, чтобы сделать симулятор космического полета к другим планетам и даже звездам. Для этого потребуется создать трехмерный космический корабль и я не знаю, как это сделать, ведь его нужно делать, а как, неизвестно. Сделать на ПЛИС такую штуку, типа, вылетаешь с планеты и летишь куда-то за определенное время. Мысли сумбурны и не оформлены, да и постоянное ощущение, что мне это не будет нужно. И это и правда, мне не будет нужно, это так.
Может, сделать рейтрейсинг на ПЛИС?.. А зачем.. нет, я все-таки упираюсь в одну и ту же фразу — зачем? Нет никакого смысла, незачем, а если это так, то тогда может, просто отпустить эту тему? Не все так просто! Я не могу ее отпустить. Уже сколько раз пытался, но не могу.
Единственное, что я понял за все время, что занимаюсь плисами и верилогом, это только одно, мне все это не нужно. Ни верилог, ни плис, ни програмирование, ни вообще что-либо, кроме бесконечного прослушивания музыки. А раз так, то мне надо сделать аудиоплеер!
— А зачем?
Ахахахаха! Вот именно, а зачем, зачем, зачем, зачем? Этот дебильный вопрос не отпускает. Даже такую важную штуку для меня, как музыка, я не хочу делать, не вижу смысла. А зачем? Есть же комп. Для чего мне надо напрягаться и делать что-то, когда я просто одену наушники и буду прослушивать себе спокойно любую музыку.
Ответ на вопрос "Зачем" есть только один "Шутки ради". Больше мне делать все это незачем.
27 фев 2023 Пн
Треугольное чтиво
Короче, решил я делать треугольники не такими, как ранее. Я думал, что буду хранить их в кеш-памяти, но так не пойдет, потому треугольники будут храниться в памяти SDRAM и рисоваться по следующему алгоритму:
- Получаем треугольники из последовательности
- Применяем матрицу преобразования камеры
- Проверяем треугольник на видимость — если вообще невидим, не добавляется в очередь. Если видим — добавляется он один. Если треугольник разрезается на части — режем его и добавляем 2 треугольника.
- Рендерим очередь треугольников, если заполнилась
- Если еще есть что сканировать, возвращаемся к 1
23 фев 2023 Чт
Про то, как я хочу сделать треугольники
У меня давным-давно есть одна мысль, которая называется "трехмерный рендерер на верилоге", о котором я часто думаю и не знаю, насколько результативно. Мне хочется сделать пусть даже небольшой, но код для плис, где автоматически из буфера могли бы рисоваться трехмерные треугольники. Это крайне непростая задача, хоть и рисование обычного треугольника не так сложно, но полноценный вывод трехмерного изображения на экран потребует довольно крупных усилий.
Как все это работает? Существует несколько буферов в памяти:
По мере построчного рисования, будет рисоваться буфер из треугольников, интегрально прибавляя значения, формируя точку на текстуре и точку глубины, записывая эти данные в однострочный буфер глубины. Каждый раз после того, как будет нарисована одна линия, этот буфер очищается для новой линии.
Другими словами, на каждой линии будет отрисовываться несколько текущих рисуемых треугольников за раз. После того, как это будет сделано, из полученного буфера размером в одну строку будут скопированы и вычислены текстуры, итоговый цвет записан в видеобуфер и сам строчный буфер очищен для новой строки.
Вот такая вот сложная система.
Как все это работает? Существует несколько буферов в памяти:
- Буфер вершин (vertex), где хранятся все исходные вершины для рендерера
- Буфер индексов (indicied), там хранится номер вершины
- Текстурный буфер для треугольников
- Просматривается буфер вершин, к каждой вершине применяется матрица камеры, то есть, умножается на эту матрицу (она задана float или half-precision значениями). На самом деле для матрицы камеры вполне достаточно даже и half-precision, я думаю.
- Просматривается буфер индексов, проверяя то, где находится та или иная вершина. Если все вершины находятся впереди проецирующей плоскости, то такой треугольник добавляется в буфер очереди на рисование. Если все вершины вне пределов проецирующей плоскости, то треугольник вообще в очередь не добавляется. В случае частичного попадания за плоскость, треугольник разбивается на 2 части и добавляется в очередь как два треугольника. В очередь добавляются уже готовые вершины, не привязанные к vertex/indicies
- Происходит вычисление параметров треугольников для текстурирования и записывается в отдельный буфер. Тут очень много умножений.
- Для каждой точки вычисляется проекция. Здесь уместно использование конвейерного деления для ускорения.
- Все полученные точки треугольников сортируются пирамидальной сортировкой по возрастанию спроецированного Y. Причем сортируется только самая высокая вершина (которая имеет наименьший Y). Также, сортируются именно индексы новых точек. Это нужно для того, чтобы не перемещать большие объемы данных внутри буфера рендеринга, а только лишь индексы. Каждая вершина имеет индекс принадлежности к определенному треугольнику
- И последний этап, это рендер.
По мере построчного рисования, будет рисоваться буфер из треугольников, интегрально прибавляя значения, формируя точку на текстуре и точку глубины, записывая эти данные в однострочный буфер глубины. Каждый раз после того, как будет нарисована одна линия, этот буфер очищается для новой линии.
Другими словами, на каждой линии будет отрисовываться несколько текущих рисуемых треугольников за раз. После того, как это будет сделано, из полученного буфера размером в одну строку будут скопированы и вычислены текстуры, итоговый цвет записан в видеобуфер и сам строчный буфер очищен для новой строки.
Вот такая вот сложная система.
<< Ранние записи |
Поздние записи >>