Отличные картинки. Перепады можно сгладить, взяв нормальный вектор не к треугольнику, а к каждой его вершине. Массив хранится в строках vn x y z, в строках f x/x/vn1 x/x/vn2 x/x/vn3 число vni — это индекс из массива нормалей.
Таким образом, мы получаем три разные интенсивности в вершинах треугольника. Теперь треугольник нужно заливать не одним цветом, а плавным градиентом между тремя. Всё это называется тонировкой Гуро.
Супер, добавьте небольшую константу к освещённости всех треугольников (около 40 из 255 возможных). Это будет так называемый ambient lighting (свет, отражённый от стен, от пола и прочего). Скалярное произведение с нормалями даёт диффузную компоненту освещённости — это свет непосредственно от источника, падающий на матовую поверхность.
Стоп. Освещение и отсечение «задних» поверхностей — это разные вещи, они совпадают только если свет позади камеры.
Если свет сбоку, то освещённость нужно считать скалярным произведением между нормалью и светом, а отсекать рисование треугольников скалярным произведением между направлением вектора взгляда и нормалью.
Супер, отличные рендеры.
Сортировка по минимальной вершине — это практически «алгоритм художника». У меня в репозитории код з-буфера уже есть, статья будет через несколько дней.
Согласен, но это всё не тема обсуждения. Спасибо за уточнение.
Я вообще не хочу писать здесь оптимизированный код, я просто показал, как писать целочисленного брезенхема для расширения кругозора. Всего этого в моём коде не будет, оптимизированный код зачастую гораздо длиннее и нечитабельнее, не моя цель.
a) да просто потому, что мне всё равно, мне скорость абсолютно не важна здесь
б) потому, что в финальной версии отрисовки треугольников эта переменная зависит от индекса цикла
Ага, спасибо, может кому пригодится. К сожалению, это увеличит размер кода, а это для меня неприемлимо. А вот непосредственный просчёт координат для каждой точки прямоугольника может быть кратким и существенно более читаемым, нежели мой код растеризации.
Да, но этот метод не позволяет интерполировать. Скорость мне абсолютно побоку, мне компромисс между самым коротким и самым читаемым кодом. Мой код абсолютно нечитаем, это плохо.
Вот так у меня выглядит отрисовка треугольника с z-буфером. Вы можете написать код лучше моего? С удовольствием его возьму :)
Вычисление барицентрических координат мне импонирует тем, что получается элегантнаая интерполяция, особенно когда мы добавим текстурные координаты и/или векторы нормали.
Таким образом, мы получаем три разные интенсивности в вершинах треугольника. Теперь треугольник нужно заливать не одним цветом, а плавным градиентом между тремя. Всё это называется тонировкой Гуро.
Должно получиться нечто вроде вот этого
Если свет сбоку, то освещённость нужно считать скалярным произведением между нормалью и светом, а отсекать рисование треугольников скалярным произведением между направлением вектора взгляда и нормалью.
Сортировка по минимальной вершине — это практически «алгоритм художника». У меня в репозитории код з-буфера уже есть, статья будет через несколько дней.
Попробуйте отрендерить мою голову (осторожно, требует доработки напильником, ~10-20 строк кода).
Я вообще не хочу писать здесь оптимизированный код, я просто показал, как писать целочисленного брезенхема для расширения кругозора. Всего этого в моём коде не будет, оптимизированный код зачастую гораздо длиннее и нечитабельнее, не моя цель.
б) потому, что в финальной версии отрисовки треугольников эта переменная зависит от индекса цикла
Вот так у меня выглядит отрисовка треугольника с z-буфером. Вы можете написать код лучше моего? С удовольствием его возьму :)
Вычисление барицентрических координат мне импонирует тем, что получается элегантнаая интерполяция, особенно когда мы добавим текстурные координаты и/или векторы нормали.