как осветить объект, модель фонга

Я пытаюсь понять, как масштабировать цвет с помощью освещения, используя модель фонга. Например, если I = KaAx, где ka - коэффициент окружающей среды, а Ax - интенсивность внешнего освещения, где x может быть rb или g, я хочу применить это к поверхности с цветом текстуры (1,0,1), например . Я попытался умножить отдельные значения rgb на I, (r * Ka * Ar.r, r * Kb * Ag, r * Kg * Ab) освещенность, но, увы, это может полностью изменить цвет, чего я не хочу.


person Jake    schedule 21.11.2012    source источник


Ответы (1)


Хорошо, я вижу несколько вещей:

  • не следует перемножать окружающее и рассеянное освещение, вместо этого используйте сложение
  • вы не используете какой-либо вектор нормали или направление / положение света (по крайней мере, я не могу его нигде найти)
  • также вы должны использовать параметр glColor (если вы его вообще не используете)

Попробуйте это для каждого цвета (.r, .g, .b) и направленного света, например Солнца:

pixel_color.r=clamp_to_1                                    // clamp to <0.0,1.1>
 (
 texture_color.r*glColor.r                                  // pixel color without lighting
 *(                                                            // apply lighting
   diffuse.r*((glNormal.xyz*NormalMatrix).light_dir.xyz) // diffuse * dot product of light source direction and normal vectors. If you need also consider distance just multiply by next term...
  +ambient.r                                                  // ambient light is additive !!!  
  )
 );

PS.

  • NormalMatrix - это ModelView с исходной точкой [0.0,0.0,0.0] (без сдвига позиции)
  • Если вы хотите также добавить отражательную способность, не забудьте вычислить отраженную нормаль ... она отличается (если скайбокс не бесконечен по размеру), как используется для рассеянного света. Также очень помогает cubemap со скайбоксом enviroment.
person Spektre    schedule 14.01.2014