Tôi nghĩ chúng ta nên có cả hai và cũng có một yếu tố dựa trên vật liệu
Một số vật liệu có độ khuếch tán cao nên nó sẽ chỉ phản chiếu ánh sáng có màu của chính nó. Nhưng một số vật liệu cũng có thể phản ánh một số ánh sáng như nó là. Đối với shader phong tôi nghĩ rằng chúng ta sử dụng môi trường xung quanh phụ gia bởi vì đối tượng phong có xu hướng phản xạ tất cả ánh sáng và vì vậy ánh sáng xung quanh có thể được chiếu sáng bằng màu của ánh sáng đó, nhưng các đèn khác được sử dụng để tạo màu khuếch tán
Trái lại với lambert, nếu những gì tôi biết là đúng, là vật liệu có độ khuếch tán cao, và vì vậy ánh sáng xung quanh được thêm vào ánh sáng và nhân với màu của vật liệu
Tôi đoán shader hiện đại nên có một tham số để đặt yếu tố này và viết phương trình như thế này
float factor; // 0.0 - 1.0 maybe reflectiveness?
float3 light = (factor * ambient.rgb); // ambient light
light += _MainLightColor.rgb * dot(normal,_MainLightDirection); // lambert
// maybe also specular
float3 color = ((1 - factor) * ambient.rgb) + (matColor * light);
Thật ra tôi lấy khái niệm này từ vật liệu PBR, đã có một khái niệm về bảo tồn năng lượng. Tất cả ánh sáng có thể thắp sáng vật thể bằng cách khuếch tán hoặc phản xạ nhưng để tiết kiệm năng lượng, màu sắc khuếch tán hơn có nghĩa là sự phản xạ thấp hơn. Và vì vậy, ánh sáng xung quanh chỉ cần thêm năng lượng ánh sáng, sau đó được đối xử giống như ánh sáng khác