我正在尝试弄清楚如何使用phong模型使用照明照明缩放颜色。 例如,给定I = KaAx,其中ka是环境系数,Ax是环境照明强度,其中x可以是r b或g,例如,我想将其应用于纹理颜色为(1,0,1)的表面。 我尝试将单个 rgb 值乘以 I,(r*Ka*Ar.r,r*Kb*Ag,r*Kg*Ab)照明,但唉,它可以完全改变颜色,这不是我想要的。
好的,
我看到几件事:
- 环境光和漫射光不应相乘,而应使用加法
- 您不使用任何正常的矢量或光方向/位置(至少我在任何地方都找不到)
- 您还应该使用 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 !!!
)
);
附言。
- NormalMatrix 是原点设置为 [0.0,0.0,0.0] 的模型视图(无位置偏移)
- 如果您还想添加反射率,请不要忘记计算反射法线...它与用于漫射光不同(除非天空盒的大小是无限大的)。还有带有环境天空盒的立方体地图帮助很大。