For example, microfacet surface optics are not meant to change at render time, the fresnel and microfacet data should be passed as template arguments and stored by value rather than smart pointers; other optics may have similar problem.
On hold: runtime polymorphism is more readable and flexible in terms of implementation, we can always templatize later if there is actual need (e.g. performance)
For example, microfacet surface optics are not meant to change at render time, the fresnel and microfacet data should be passed as template arguments and stored by value rather than smart pointers; other optics may have similar problem.