D_GGX_Anisotropic.js 904 B

12345678910111213141516171819202122232425262728
  1. import { tslFn, float, vec3 } from '../../shadernode/ShaderNode.js';
  2. const RECIPROCAL_PI = float( 1 / Math.PI );
  3. // https://google.github.io/filament/Filament.md.html#materialsystem/anisotropicmodel/anisotropicspecularbrdf
  4. const D_GGX_Anisotropic = tslFn( ( { alphaT, alphaB, dotNH, dotTH, dotBH } ) => {
  5. const a2 = alphaT.mul( alphaB );
  6. const v = vec3( alphaB.mul( dotTH ), alphaT.mul( dotBH ), a2.mul( dotNH ) );
  7. const v2 = v.dot( v );
  8. const w2 = a2.div( v2 );
  9. return RECIPROCAL_PI.mul( a2.mul( w2.pow2() ) );
  10. } ).setLayout( {
  11. name: 'D_GGX_Anisotropic',
  12. type: 'float',
  13. inputs: [
  14. { name: 'alphaT', type: 'float', qualifier: 'in' },
  15. { name: 'alphaB', type: 'float', qualifier: 'in' },
  16. { name: 'dotNH', type: 'float', qualifier: 'in' },
  17. { name: 'dotTH', type: 'float', qualifier: 'in' },
  18. { name: 'dotBH', type: 'float', qualifier: 'in' }
  19. ]
  20. } );
  21. export default D_GGX_Anisotropic;