Basically the shader must provide the PBR standard workflow (three.js standard material) and would not need a full rewriting from scratch.
Also we need all the UI Elements as a react component.
The following required options are
Base Color:
Replace the base color with a color gradient. We must be able to set new colors within the gradient. The left color represents the outer color (90° vector to camera), the very right color represents
the direct front color (0° view angle).
The Color gradient must be linear and mapped on a perpendicular falloff like the image below.
A normal map is required (UV channel 0)
An ambient occlusion map is required (UV channel 1)
Light affection must be blendable > 0 = Light excludes AO texture, 1 = fully renders AO texture above everything.
Vertex Color is required (multiplcation over everything at the end of the shader)
The Dot Product (Color Blend Factor) needs a Power Value to shift the gradient to either the left or the right color.
The metalness is supposed to act as the metallic flakes without actual flakes and can simply be untouched since the three.js standard material already provides this funtionality.
Clear Coat
Add a frensel reflection. The intensity and the roughness must be configurable. Allow a normal map to affect the clear coat only.
Main Flakes
A toogle must be available to enable or disable the flake rendering in terms of mobile usability. Disabling the main flakes also disables the sparkle flakes.
The flakes must behave dynamically, not just static with a noise texture and reflect the actual background/environment.
The flake source should be a generated noise and mapped automatically without available UV coordinates.
The flakes must be rendered/combined with the base color in order to get tinted by the base color when using metalness
The flake intensity automatically gets more visible with the value of metalness > Metalness 0 = no flakes, metalness 1 = full flake visibility. There must be a flake multiplier to intensify the flakes against its default value. Metalness of 0 still makes the flakes invisible.
Adjust the density of the flakes.
The flakes must be scalable in size.
The flakes can be colorized separately.
Sparkle Flakes
The sparkle flakes can be enabled/disabled when the main flakes are enabled.
The sparkle flakes must reflect the actual background/environment.
The sparkle flakes behave the same way like the main flakes but don’t get affected by the metalness, stay always white/reflective.
The density of the sparkle flakes must be configurable.
The size of the sparkle flakes are linked to the main flakes and can’t be adjusted seprately.
The intensity is affected by the metalness factor (0 = invisible, 1 = fully visible) but a multiplier can increase the visibily anyway.
Here is how the shader looks in Blender (flakes should be done better):
Here is the attached Blender scene
BasicCarPaintTest.blend (772.5 KB)
We have a budget of 1.000USD if you can do it until monday.