2015-08-10 4 views
0

Я закончил добавлять свет к моему объекту. Но у меня есть большая часть примера интернета, и я хочу понять, что я делаю. Может кто-нибудь объяснить мне подробно, что делает каждый шаг в коде?Применить свет к объекту в openGL

Фрагмент программы,

  • Lightcolor: свет, который нам нужен (я взял здесь красный в качестве примера)
  • Блеск: сколько света мы хотим использовать, можно также изменить картину в темному
  • gl_FragColor = написать общий цвет. Но почему мы делаем texture2D (..) + faceRatio * ...?

Vertex Программа,

-Почему gl_MultiTexCoord0.xy? - А может кто-нибудь объяснить, как рассчитывается световое направление?

varying vec2 Texcoord; 
    uniform sampler2D baseMap; 
    uniform vec4 lightColor; 
    uniform float shininess; 
    varying vec3 LightDirection; 
    varying vec3 Normal; 
    void main(void) 
    { 
float facingRatio = dot(normalize(Normal), normalize(LightDirection)); 
gl_FragColor = texture2D(baseMap, Texcoord) + facingRatio * lightColor * shininess; 
    } 






varying vec2 Texcoord; 
uniform mat4 modelView; 
uniform vec3 lightPos; 
varying vec3 Normal; 
varying vec3 LightDirection; 
void main(void) 
{ 
    gl_Position = gl_ProjectionMatrix * modelView * gl_Vertex; 
    Texcoord = gl_MultiTexCoord0.xy; 
    Normal = normalize(gl_NormalMatrix * gl_Normal); 
    vec4 objectPosition = gl_ModelViewMatrix * gl_Vertex; 
    LightDirection = (gl_ModelViewMatrix * vec4(lightPos, 1)).xyz - objectPosition.xyz; 

} 

ответ

0

Vertex шейдер

Я думаю, старая версия OpenGL используется, и поэтому gl_MultiTexCoord0.xy используется. Посмотрите на это page, чтобы понять мультитекстурирование и встроенную переменную.

Переменная LightDirection легко вычислить, поскольку она относится только к вектору от объекта в направлении к источнику света. Таким образом, вы можете вычесть положение света из текущего положения (здесь: objectPosition). В этом примере это делается в пространстве глаз, что имеет то преимущество, что направление просмотра легко вычислить (это просто vec3 (0.0,0.0,1.0)).

Другие строки - это лишь некоторые обычные графические преобразования из пространства-объекта вершины в глазное пространство. Чтобы преобразовать нормаль в глазное пространство, вместо матрицы просмотра модели нужна нормальная матрица. Это обратная и транспонированная матрица модели.

Фрагмент шейдер

facingRatio определяет, насколько сильно текущий фрагмент должен быть enlightend. Таким образом, скалярное произведение между нормальным и световым направлением используется для его измерения. В следующей строке цвет фрагмента вычисляется путем считывания цвета этого фрагмента из текстуры и добавления цвета от света к нему.