2016-10-15 5 views
1

Im работает над внедрением косвенного рассеяния в моем рендерере, и я смотрю раздел 8.4.1 of this paper from Valve.Приблизительный косвенный диффуз

В моем визуализаторе Im имея воксельной сетки 256x256x256 с сиянием и тень впрыскивается и Im пытается преобразовать/использовать этот фрагмент из бумаги для расчета внешнего освещения против моих вокселей:

float3 AmbientLight(const float3 worldNormal) 
{ 
    float3 nSquared = worldNormal * worldNormal; 
    int3 isNegative = (worldNormal < 0.0); 
    float3 linearColor; 
    linearColor = nSquared.x * cAmbientCube[isNegative.x] + 
       nSquared.y * cAmbientCube[isNegative.y+2] + 
       nSquared.z * cAmbientCube[isNegative.z+4]; 
    return linearColor; 
} 

Проблема заключается в том, что не может понять, что такое cAmbientCube в расчете ...

Что это за переменная и откуда она взялась?

+0

Похож на массив из 6 цветов, нет? – Zouch

+0

Вы используете настольные OpenGL или OpenGL ES? –

ответ

1

Раздел 8.4.1 документа, в котором вы скопировали код, в значительной степени объясняет это. cAmbientCube - это массив из шести значений света, по одному для каждого главного направления: отрицательный x, положительный x, отрицательный y, положительный y, отрицательный z, положительный z. В то время как типичный эмбиентный термин считается постоянным светом, который освещает со всех сторон, описанная в статье техника Окружающего Куба является обобщением этого, который предполагает различный свет, исходящий от каждого из этих направлений. Код, который вы опубликовали, отвечает за выборку из этой специальной шестисторонней текстуры кубической карты.

+0

Итак, в основном его всего 6 значений, которые «подделывают» куб-файл и код выше, просто отбирают у них право? Как вычисляются значения тезисов 6? используя сферические гармоники? – McBob

+0

@McBob: Да. В документе не упоминается, как их вычислять. Чтобы вычислить его, я не думаю, что сферические гармоники здесь уместны. Вместо этого вы должны сверлить каждое лицо экологической карты с чем-то вроде * x² + y² + z² * kernel или просто усреднить каждую из его граней. В качестве альтернативы эти значения могут быть вручную выбраны художником. – ybungalobill