Как расчет модели освещения работает в шейдерной программе?

Я пытаюсь прочитать это руководство:

https://aerotwist.com/tutorials/an-introduction-to-shaders-part-2/

но я не могу следить. По сути, код создает направленный свет с помощью шейдеров, которые запускаются непосредственно на графическом процессоре. Это код:

// same name and type as VS
varying vec3 vNormal;

void main() {

    // calc the dot product and clamp
    // 0 -> 1 rather than -1 -> 1
    vec3 light = vec3(0.5,0.2,1.0);

    // ensure it's normalized
    light = normalize(light);

    // calculate the dot product of
    // the light to the vertex normal
    float dProd = max(0.0, dot(vNormal, light));

    // feed into our frag colour
    gl_FragColor = vec4(dProd, dProd, dProd, 1.0);

} 

В частности, строка, которую я не понимаю, такова:

float dProd = max(0.0, dot(vNormal, light));

Как скалярное произведение vNormal вершины и света создает направленный свет. Кто-нибудь может объяснить мне схематически. Я не могу этого понять. Мне это кажется немного волшебным. Я знаю, что в этом вершинном шейдере каждая вершина передается как ввод, который называется нормальным, потому что он представлен в терминах «1», и эта общая переменная затем используется в приведенном выше коде фрагментного шейдера. Но кроме этого я не понимал, как это работает.

P.S: Я мог бы спросить автора блога, но, насколько я знаю, у него двухнедельный отпуск. Поэтому я подумал, что кто-нибудь с опытом работы в области физики или three.js сможет мне сказать.


person TCM    schedule 15.08.2011    source источник
comment
Это действительно вопрос JavaScript? На каком языке вы цитируете этот код?   -  person nnnnnn    schedule 15.08.2011
comment
Совершенно очевидно, что это не JavaScript, но мне было интересно, был ли это C, или Java, или ... С тех пор я провел некоторое исследование, и это язык шейдеров OpenGL (который основан на синтаксисе C). Предположительно вы можете включить его на страницу, которая также имеет JavaScript (так же, как IE позволяет вам смешивать JavaScript с VBScript).   -  person nnnnnn    schedule 15.08.2011
comment
@nn: Это определенно не java (и не C). Синтаксис просто так выглядит. Он известен как GLSL. Это язык шейдеров для WebGL, работающий на графическом процессоре. Прочтите это для получения дополнительной информации: en.wikipedia.org/wiki/GLSL   -  person TCM    schedule 15.08.2011
comment
произведение dot двух единичных векторов возвращает косинус угла между ними. Таким образом, будет 1, когда нормаль направлена ​​в том же направлении света, и -1, когда в противоположном направлении. Вот об этом статья.   -  person gman    schedule 07.08.2017