Войти
Gamedev LectureСтатьи

Лекция #32. R.E.N.D.E.R. (5 стр)

Автор:

[22:10] <paladinrus> со сферой немного недопонял
[22:10] <paladinrus> для omni
[22:10] <paladinrus> то-естьона юзается только для того чтобы определеить считать-ли освещение в пикселях или нет?
[22:10] <paladinrus> всмысле в тех которые внутри сферы оказались
[22:10] <Zeux> ты рисуешь сферу
[22:10] <Zeux> у тебя тем самым рисуются пиксели
[22:10] <Zeux> которые внутри сферы
[22:11] <Zeux> для этих пикселей выполняется тот самый пиксельный шейдер
[22:11] <Zeux> который считает вклад в освещение от источника
[22:11] <Zeux> можно рисовать квад для всех источников
[22:11] <paladinrus> ну я это и имел ввиду :)
[22:11] <Zeux> но так ты будешь обрабатывать больше пикселей
[22:11] <Zeux> чем мог бы.
[22:11] <Zeux> поэтому да - только для этого.

[22:11] <paladinrus> логично предположить
[22:12] <paladinrus> что радиус сферы будет равен расстоянию на котором аттеньюация будет давать освещённость 0?
[22:12] <Zeux> да
[22:12] <Zeux> там формула
[22:12] <Zeux> [22:02] <Zeux> затухание квадратичное, формула - 1 - distance_to_light_source_squared / radius_of_light_source_squared
[22:12] <paladinrus> ок, спасибо

[22:12] <WhiteWind> Zeux, ты знаком с модом Float32?
[22:12] <Zeux> WhiteWind, знаю, что есть, но не смотрел
[22:13] <Zeux> но
[22:13] <Zeux> что там есть - знаю, наверное :)
[22:13] <Zeux> дело в том, что все вычисления в сталкере производятся в half
[22:13] <Zeux> думаю, что этот мод переводит все вычисления в float
[22:13] <Zeux> формат текстур он почти наверняка не меняет.
[22:13] <WhiteWind> Он сильно увеличивает производительность на динамическом освещении
[22:13] <Zeux> ну, может быть там есть дополнительные оптимизации
[22:14] <WhiteWind> И, как заявляет автор, улучшает качество картинки
[22:14] <Zeux> улучшает - именно поэтому

[22:14] <paladinrus> Zeux, если не затруднит пару слов об аномалиях, как мне кажется метод похож на heat faze или как там его, есть-ли различия?
[22:14] <Zeux> paladinrus, различий в общем-то нет, я еще скажу об этом

[22:14] <vshabanov> выходит, из-за 3Д текстуры честной глянцевости там не получается? pow( dot(N,H), <параметр, зависящий от меша> ) уже не проканает
[22:14] <Zeux> да, так нельзя
[22:14] <Zeux> в принципе, тот параметр можно было бы запихнуть в G-buffer
[22:15] <Zeux> но у ребят места и так не хватало :)
[22:15] <Zeux> но
[22:15] <Zeux> можно делать бОльшую 3д текстуру
[22:15] <Zeux> скажем, ограничить степени - от 1 до 64
[22:15] <Zeux> и сделать 64 материала.
[22:15] <vshabanov> меня сразу удивило, что glossiness есть, а shininess нету
[22:15] <Zeux> конечно, 3д текстура будет большая
[22:15] <Zeux> но, увы.
[22:15] <Zeux> собственно, те материалы, которые есть - наверное и отличаются в основном степенью спекуляра :)

[22:16] <vshabanov> а сильный ли прирост производительности дает DS
[22:17] <vshabanov> у него, как вижу, проблемы с прозрачностью, спекуляром. да и филрейт жрет по-ходу
[22:17] <Zeux> ответ на этот вопрос получить по сталкеру невозможно
[22:17] <Zeux> потому что в нем DS и не DS рендеры отличаются по функциональности
[22:18] <Zeux> вопрос применимости DS в принципе - зависит от
[22:18] <Zeux> т.е. если хочется очень много источников
[22:18] <Zeux> то DS будет более хорошим выбором
[22:18] <Zeux> я еще скажу об одном забавном бонусе DS
[22:18] <Zeux> который сделан в сталкере.
[22:18] <Zeux> проблемы с прозрачностью на самом деле типичны для очень многих алгоритмов в CG :)
[22:19] <Zeux> у него нет проблем с прозрачностью, есть только с полупрозрачностью
[22:19] <Zeux> а полупрозрачные примитивы можно и не освещать ;)
[22:19] <Zeux> т.е. DS - это не silver bullet
[22:19] <Zeux> у него есть плюсы и минусы
[22:19] <Zeux> и тех и тех - много
[22:19] <Zeux> и что перевесит - зависит от приложения :)

[22:20] <__Joe> в сталкере мало источников вроде
[22:20] <Zeux> ну, как посмотреть
[22:21] <Zeux> на комнатку в самом начале штук 10 что ли
[22:21] <Zeux> Олесь сейчас скажу какие числа в статье своей пишет
[22:22] <Zeux> пишет, 50 на кадр в индоре
[22:22] <Zeux> 5 на пиксель
[22:22] <Zeux> в аутдоре на пиксель кроме солнца - меньше 1 в среднем
[22:22] <Zeux> плюс 2.5 overdraw rate
[22:22] <Zeux> точнее, 1.5
[22:23] <Zeux> если много overdraw - deferred shading может спасти.
[22:23] <Zeux> и еще раз
[22:23] <Zeux> про кол-во источников
[22:23] <Zeux> те, кто выдержат до конца лекции
[22:23] <Zeux> услышат о забавном бонусе DS :)

[22:24] <Zeux> Итак
[22:24] <Zeux> теперь нам надо на основе G-buffer и текстуры с освещением (я ее буду называть L-buffer, а то долго писать)
[22:24] <Zeux> получить собственно картинку.
[22:25] <Zeux> для этог после заполнения L-buffer
[22:25] <Zeux> происходит рендер полноэкранного квада в 2 текстуры
[22:25] <Zeux> формата A8R8G8B8
[22:25] <Zeux> в одну запишется LDR цвет, к которому применили tone mapping
[22:25] <Zeux> точнее
[22:25] <Zeux> результат применения tone mapping к HDR цвету
[22:25] <Zeux> :)
[22:26] <Zeux> в другой - HDR цвет для блума и рассчета общей освещенности сцены
[22:26] <Zeux> расчет происходит так.
[22:26] <Zeux> во-первых, делается т.н. hemispherical lighting
[22:26] <Zeux> есть 2 текстуры с небом
[22:26] <Zeux> точнее
[22:26] <Zeux> с окружением
[22:26] <Zeux> но в них в основном небо :)
[22:26] <Zeux> текстуры - кубмапы, 32х32.
[22:27] <Zeux> одна соответствует дневному окружению
[22:27] <Zeux> другая - ночному
[22:27] <Zeux> из каждой делается 2 выборки
[22:27] <Zeux> первая - по нормали - показывает diffuse вклад окружения
[22:27] <Zeux> вторая - по отраженному относительно нормали view вектору - показывает specular вклад окружения
[22:28] <Zeux> затем считается вклад окружения (hdiffuse и hspecular) линейной интерполяцией между значениями для 2 текстур
[22:28] <Zeux> коэффициент интерполяции - видимо, время суток :)
[22:28] <Zeux> т.е. насколько текущее окружение соответствует дневному, насколько - ночному.
[22:28] <Zeux> далее считается финальный цвет
[22:28] <Zeux> вот так:
[22:28] <Zeux> color = rgb * (lighting diffuse + hdiffuse) + (gloss * light specular) + hspecular;
[22:28] <Zeux> rgb - это значение из G-buffer
[22:29] <Zeux> lighting diffuse - .rgb из L-buffer
[22:29] <Zeux> light specular - .a из L-buffer
[22:29] <Zeux> hdiffuse, hspecular - только что посчитаны
[22:29] <Zeux> gloss - из G-buffer
[22:29] <Zeux> затем считается туман, просто distance-based
[22:29] <Zeux> т.е. считается расстояние до камеры
[22:30] <Zeux> и линейная интерполяция между color и fog_color (константа), коэффициент - fog factor

[22:30] <Zeux> я кстати забыл сказать совсем.
[22:30] <Zeux> а никто и не спросил!
[22:30] <Zeux> сказать, почему позиция в G-buffer - view space
[22:30] <Zeux> а не скажем world space
[22:30] <Zeux> это очевидно? :)
[22:31] <Zeux> т.е. понятно
[22:31] <Zeux> что ничего не мешало в принципе хранить и в world space.
[22:32] <Zeux> причина - очень простая на самом деле
[22:32] <Zeux> используется float16 (half) формат для позиции
[22:32] <Zeux> у него - сильно ограничен диапазон
[22:32] <Zeux> максимальное значение - 65504.0 вроде
[22:32] <Zeux> где-то так
[22:32] <Zeux> ну и точность непонятно, какая
[22:32] <Zeux> т.е. точнее
[22:32] <Zeux> чем дальше от 0
[22:32] <Zeux> тем меньше точность
[22:32] <Zeux> view space удобен тем
[22:33] <Zeux> что чем ближе к камере позиция - тем меньше она
[22:33] <Zeux> и тем больше для нее точность соответственно
[22:33] <Zeux> ну и тем
[22:33] <Zeux> что вне зависимости от положения камеры
[22:33] <Zeux> размеров мира
[22:33] <Zeux> и прочих деталей
[22:33] <Zeux> значения позиции там будут в нормальном диапазоне
[22:33] <Zeux> т.е. за 65 тысяч они могу вылезти только если у вас очень большой view distance
[22:33] <Zeux> что вряд ли.

[22:34] <Zeux> ну так вот, продолжим
[22:34] <Zeux> после получения цвета
[22:34] <Zeux> для него делается tone mapping
[22:34] <Zeux> tone mapping - это процесс получения LDR цвета из HDR
[22:34] <Zeux> есть много разных формул
[22:34] <Zeux> операторов
[22:34] <Zeux> в статье написано, что сначала пробовали экспоненциальную зависимость от освещенности
[22:34] <Zeux> как в DX SDK demo
[22:34] <Zeux> а потом забили и стали делать линейную
[22:35] <Zeux> из-за особенностей арта.
[22:35] <Zeux> формула такая:
[22:35] <Zeux> result = color * (coeff1 / (luminance * coeff2 + coeff3))
[22:35] <Zeux> luminance - среднее значение яркости сцены с предыдущего кадра
[22:35] <Zeux> точнее
[22:35] <Zeux> не с предыдущего, а интерполированное
[22:35] <Zeux> неважно
[22:36] <Zeux> коэффициенты подбираются, в сталкере - 0.7, 0.7 и 0.3
[22:36] <Zeux> вроде бы первый 0.7 - middle gray value, 0.7 и 0.3 - ремаппинг из [0,1] в [0.3, 1]

Страницы: 1 2 3 4 5 6 7 Следующая »

#GSC, #render, #reverse engineering, #S.T.A.L.K.E.R.

10 мая 2007 (Обновление: 17 сен. 2009)