[PBR][DIY] Shader assembly of NDF for PBR

Test code

//----------------------------------------------------------------------------------------------------
// Test NDF shader by hanecci
//
// This software is released under the Unlicense. ( http://unlicense.org/ )
//
// This is free and unencumbered software released into the public domain.
// Anyone is free to copy, modify, publish, use, compile, sell, or
// distribute this software, either in source code form or as a compiled
// binary, for any purpose, commercial or non-commercial, and by any means.
//
//----------------------------------------------------------------------------------------------------

in vec3         normal;
in vec3         half_vec;
in vec3         aniso_x;
in vec3         aniso_y;

uniform vec3    light_dir;
uniform vec3    eye_dir;

uniform float   roughness;
uniform float   anisotropic;
uniform float   param_n;
uniform float   param_m;

#define NDF_MODE             ( 4 )

#define NDF_PHONG            ( 0 )
#define NDF_NORM_PHONG       ( 1 )
#define NDF_BLINN_PHONG      ( 2 )
#define NDF_NORM_BLINN_PHONG ( 3 )
#define NDF_GGX              ( 4 )
#define NDF_GGX_ANISO        ( 5 )
#define NDF_BECKMANN         ( 6 )

#define PI           ( 3.141592 )
#define HALF_PI      ( 0.5 * PI )
#define INV_PI       ( 1.0 / PI )
#define INV_2PI      ( 0.5 / PI )

#define sqr(x) ( x * x )

float GTR2_aniso(float dot_n_h, float HdotX, float HdotY, float ax, float ay)
{
    return INV_PI / ( ax * ay * 
sqr( sqr( HdotX / ax ) + sqr( HdotY / ay ) + dot_n_h + dot_n_h ));
}

float Beckmann(float m, float t)
{
    float m2      = m * m;
    float t2      = t * t;
    float value   = exp( ( t2 - 1) / ( m2 * t2 ) );
    value        *= INV_PI / ( m2 * t2 * t2 );

    return value;
}

void main( void )
{
	vec4 color    = vec4( 0.0, 0.0, 0.0, 0.0 );

    vec3 half_vec = normalize( light_dir + eye_dir );
    float dot_n_h = clamp( dot( normal, half_vec ), 0.0, 1.0 );

    float alpha   = roughness * roughness;
    float alpha2  = alpha * alpha;

#if ( NDF_MODE == NDF_PHONG )

    vec3 reflect_dir  = reflect( light_dir, normal );
    float          d  = pow( max( 0, dot( reflect_dir, eye_dir ) ), param_n );

#elif ( NDF_MODE == NDF_NORM_PHONG )

    vec3 reflect_dir  = reflect( light_dir, normal );
    float          d  = pow( max( 0, dot( reflect_dir, eye_dir ) ), param_n );    
                   d *= INV_2PI * ( 2 + param_n );

#elif ( NDF_MODE == NDF_BLINN_PHONG )

    float d          = pow( dot_n_h, param_n );

#elif ( NDF_MODE == NDF_NORM_BLINN_PHONG )

    float d          = pow( dot_n_h, param_n );
    d               *= INV_2PI * ( 2 + param_n );

#elif ( NDF_MODE == NDF_GGX )

	float denom = dot_n_h * dot_n_h * ( alpha2 - 1.0 ) + 1.0f;
    float d     = INV_PI * alpha2 * rcp( denom * denom );

#elif ( NDF_MODE == NDF_GGX_ANISO )

    float aspect = sqrt( 1 - anisotropic * 0.9 );
    float ax     = max(0.001, sqr( roughness ) / aspect);
    float ay     = max(0.001, sqr( roughness ) * aspect);
    float d      = GTR2_aniso( dot_n_h,
                               dot( half_vec, aniso_x ),
                               dot( half_vec, aniso_y ),
                               ax, ay);

#elif ( NDF_MODE == NDF_BECKMANN )

    float d = Beckmann( param_m, dot_n_h );

#endif

    color.rgb    = vec3( d );

	gl_FragColor = color;
}

Phong

; --------  Disassembly --------------------
00 ALU: ADDR(32) CNT(19) 
      0  x: DOT4        ____,  R0.x,  C1.x      
         y: DOT4        ____,  R0.y,  C1.y      
         z: DOT4        ____,  R0.z,  C1.z      
         w: DOT4        ____,  (0x80000000, -0.0f).x,  0.0f      
         t: MOV         R1.w,  0.0f      
      1  w: ADD         ____,  PV0.x,  PV0.x      
      2  x: MULADD      R127.x, -PV1.w,  R0.x,  C1.x      
         y: MULADD      R127.y, -PV1.w,  R0.y,  C1.y      
         z: MULADD      R127.z, -PV1.w,  R0.z,  C1.z      
      3  x: DOT4        ____,  C0.x,  PV2.x      
         y: DOT4        ____,  C0.y,  PV2.y      
         z: DOT4        ____,  C0.z,  PV2.z      
         w: DOT4        ____,  (0x80000000, -0.0f).x,  0.0f      
      4  w: MAX         ____,  PV3.x,  0.0f      
      5  t: LOG_sat     ____,  PV4.w      
      6  y: MUL         ____,  PS5,  C2.x      
      7  t: EXP_e       R1.x,  PV6.y      
01 EXP_DONE: PIX0, R1.xxxw
END_OF_PROGRAM

Normalized-Phong

; --------  Disassembly --------------------
00 ALU: ADDR(32) CNT(24) 
      0  x: DOT4        ____,  R0.x,  C1.x      
         y: DOT4        ____,  R0.y,  C1.y      
         z: DOT4        ____,  R0.z,  C1.z      
         w: DOT4        ____,  (0x80000000, -0.0f).x,  0.0f      
         t: MOV         R1.w,  0.0f      
      1  x: ADD         ____,  PV0.x,  PV0.x      
         z: ADD         ____,  C2.x,  (0x40000000, 2.0f).x      
      2  x: MULADD      R127.x, -PV1.x,  R0.x,  C1.x      
         y: MULADD      R127.y, -PV1.x,  R0.y,  C1.y      
         z: MULADD      R127.z, -PV1.x,  R0.z,  C1.z      
         w: MUL         R0.w,  PV1.z,  (0x3E22F986, 0.1591549814f).x      
      3  x: DOT4        ____,  C0.x,  PV2.x      
         y: DOT4        ____,  C0.y,  PV2.y      
         z: DOT4        ____,  C0.z,  PV2.z      
         w: DOT4        ____,  (0x80000000, -0.0f).x,  0.0f      
      4  z: MAX         ____,  PV3.x,  0.0f      
      5  t: LOG_sat     ____,  PV4.z      
      6  x: MUL         ____,  PS5,  C2.x      
      7  t: EXP_e       ____,  PV6.x      
      8  x: MUL         R1.x,  PS7,  R0.w      
01 EXP_DONE: PIX0, R1.xxxw
END_OF_PROGRAM

Blinn-Phong

; --------  Disassembly --------------------
00 ALU: ADDR(32) CNT(21) 
      0  x: ADD         R1.x,  C1.x,  C0.x      
         y: ADD         R1.y,  C1.y,  C0.y      
         w: MOV         R2.w,  0.0f      
      1  z: ADD         R1.z,  C1.z,  C0.z      
      2  x: DOT4_e      ____,  R1.x,  R1.x      
         y: DOT4_e      ____,  R1.y,  R1.y      
         z: DOT4_e      ____,  PV1.z,  PV1.z      
         w: DOT4_e      ____,  (0x80000000, -0.0f).x,  0.0f      
      3  t: RSQ_e       ____,  PV2.x      
      4  x: MUL         ____,  R1.x,  PS3      
         y: MUL         ____,  R1.y,  PS3      
         z: MUL         ____,  R1.z,  PS3      
      5  x: DOT4        ____,  R0.x,  PV4.x      CLAMP 
         y: DOT4        ____,  R0.y,  PV4.y      CLAMP 
         z: DOT4        ____,  R0.z,  PV4.z      CLAMP 
         w: DOT4        ____,  (0x80000000, -0.0f).x,  0.0f      CLAMP 
      6  t: LOG_sat     ____,  PV5.x      
      7  y: MUL         ____,  PS6,  C2.x      
      8  t: EXP_e       R2.x,  PV7.y      
01 EXP_DONE: PIX0, R2.xxxw
END_OF_PROGRAM

Normalized Blinn-Phong

; --------  Disassembly --------------------
00 ALU: ADDR(32) CNT(25) 
      0  x: ADD         R1.x,  C1.x,  C0.x      
         y: ADD         R1.y,  C1.y,  C0.y      
         w: MOV         R2.w,  0.0f      
      1  z: ADD         R1.z,  C1.z,  C0.z      
      2  x: DOT4_e      ____,  R1.x,  R1.x      
         y: DOT4_e      ____,  R1.y,  R1.y      
         z: DOT4_e      ____,  PV1.z,  PV1.z      
         w: DOT4_e      ____,  (0x80000000, -0.0f).x,  0.0f      
         t: ADD         ____,  C2.x,  (0x40000000, 2.0f).y      
      3  y: MUL         R2.y,  PS2,  (0x3E22F986, 0.1591549814f).x      
         t: RSQ_e       ____,  PV2.x      
      4  x: MUL         ____,  R1.x,  PS3      
         y: MUL         ____,  R1.y,  PS3      
         z: MUL         ____,  R1.z,  PS3      
      5  x: DOT4        ____,  R0.x,  PV4.x      CLAMP 
         y: DOT4        ____,  R0.y,  PV4.y      CLAMP 
         z: DOT4        ____,  R0.z,  PV4.z      CLAMP 
         w: DOT4        ____,  (0x80000000, -0.0f).x,  0.0f      CLAMP 
      6  t: LOG_sat     ____,  PV5.x      
      7  x: MUL         ____,  PS6,  C2.x      
      8  t: EXP_e       ____,  PV7.x      
      9  x: MUL         R2.x,  PS8,  R2.y      
01 EXP_DONE: PIX0, R2.xxxw
END_OF_PROGRAM

GGX

; --------  Disassembly --------------------
00 ALU: ADDR(32) CNT(28) 
      0  x: ADD         R1.x,  C1.x,  C0.x      
         y: ADD         R1.y,  C1.y,  C0.y      
         w: MOV         R2.w,  0.0f      
      1  z: ADD         R1.z,  C1.z,  C0.z      
      2  x: DOT4_e      ____,  R1.x,  R1.x      
         y: DOT4_e      ____,  R1.y,  R1.y      
         z: DOT4_e      ____,  PV1.z,  PV1.z      
         w: DOT4_e      ____,  (0x80000000, -0.0f).x,  0.0f      
         t: MUL         ____,  C2.x,  C2.x      
      3  w: MUL         ____,  PS2,  PS2      
         t: RSQ_e       ____,  PV2.x      
      4  x: MUL         ____,  R1.x,  PS3      
         y: MUL         ____,  R1.y,  PS3      
         z: MUL         ____,  R1.z,  PS3      
         w: ADD         R0.w,  PV3.w, -1.0f      
         t: MUL         R1.y,  PV3.w,  (0x3EA2F986, 0.3183099627f).x      
      5  x: DOT4        ____,  R0.x,  PV4.x      CLAMP 
         y: DOT4        ____,  R0.y,  PV4.y      CLAMP 
         z: DOT4        ____,  R0.z,  PV4.z      CLAMP 
         w: DOT4        ____,  (0x80000000, -0.0f).x,  0.0f      CLAMP 
      6  y: MUL         ____,  PV5.x,  PV5.x      
      7  x: MULADD      R127.x,  R0.w,  PV6.y,  1.0f      
      8  w: MUL         ____,  PV7.x,  PV7.x      
      9  t: RCP_e       ____,  PV8.w      
     10  x: MUL         R2.x,  PS9,  R1.y      
01 EXP_DONE: PIX0, R2.xxxw
END_OF_PROGRAM

GGX-Aniso

; --------  Disassembly --------------------
00 ALU: ADDR(32) CNT(55) 
      0  y: MOV         R5.y,  0.0f      
         z: MULADD      R127.z, -C0.x,  (0x3F666666, 0.8999999762f).x,  1.0f      
         w: MUL         R0.w,  C3.x,  C3.x      
      1  x: ADD         R3.x,  C2.x,  C1.x      
         y: ADD         R4.y,  C2.y,  C1.y      
         t: SQRT_e      ____,  PV0.z      
      2  y: MUL         R3.y,  R0.w,  PS1      
         z: ADD         R3.z,  C2.z,  C1.z      
         t: RCP_e       ____,  PS1      
      3  x: DOT4_e      ____,  R3.x,  R3.x      
         y: DOT4_e      ____,  R4.y,  R4.y      
         z: DOT4_e      ____,  PV2.z,  PV2.z      
         w: DOT4_e      ____,  (0x80000000, -0.0f).x,  0.0f      
         t: MUL_e       ____,  R0.w,  PS2      
      4  x: MAX         R4.x,  R3.y,  (0x3A83126F, 0.001000000047f).x      
         z: MAX         R4.z,  PS3,  (0x3A83126F, 0.001000000047f).x      
         t: RSQ_e       ____,  PV3.x      
      5  x: MUL         R3.x,  R3.x,  PS4      
         y: MUL         R4.y,  R4.y,  PS4      
         z: MUL         R3.z,  R3.z,  PS4      
         w: MUL         R1.w,  PV4.z,  (0x40490FD8, 3.141592026f).x      
         t: RCP_e       R3.y,  PV4.x      
      6  x: DOT4        ____,  R0.x,  PV5.x      
         y: DOT4        ____,  R0.y,  PV5.y      
         z: DOT4        ____,  R0.z,  PV5.z      
         w: DOT4        R0.w,  (0x80000000, -0.0f).x,  0.0f      
         t: RCP_e       R0.y,  R4.z      
      7  x: DOT4        ____,  R1.x,  R3.x      
         y: DOT4        ____,  R1.y,  R4.y      
         z: DOT4        R1.z,  R1.z,  R3.z      
         w: DOT4        ____,  (0x80000000, -0.0f).x,  0.0f      
         t: MUL_e       ____,  PV6.x,  PS6      
      8  x: MUL_e       ____,  PV7.x,  R3.y      
         z: MUL         R3.z,  R4.x,  R1.w      
         w: MUL         ____,  R0.w,  PS7      
         t: MUL         ____,  R2.z,  R3.z      
      9  x: MULADD      R127.x,  R2.y,  R4.y,  PS8      
         z: MUL_e       R1.z,  R0.y,  PV8.w      VEC_201 
         w: MUL         ____,  R1.z,  PV8.x      
     10  x: MULADD      R2.x,  R2.x,  R3.x,  PV9.x      CLAMP 
         z: MUL_e       R2.z,  R3.y,  PV9.w      
     11  y: ADD         ____,  PV10.z,  R1.z      
     12  x: ADD         ____,  R2.x,  PV11.y      
     13  w: MULADD      R127.w,  R2.x,  R1.z,  PV12.x      
     14  z: ADD         ____,  R2.z,  PV13.w      
     15  y: ADD         ____,  R2.x,  PV14.z      
     16  x: ADD         ____,  R2.x,  PV15.y      
     17  y: MUL         ____,  PV16.x,  R3.z      
     18  t: RCP_e       R5.x,  PV17.y      
01 EXP_DONE: PIX0, R5.xxxy
END_OF_PROGRAM

Beckmann

; --------  Disassembly --------------------
00 ALU: ADDR(32) CNT(31) 
      0  x: ADD         R1.x,  C1.x,  C0.x      
         y: ADD         R1.y,  C1.y,  C0.y      
         w: MOV         R2.w,  0.0f      
      1  z: ADD         R1.z,  C1.z,  C0.z      
      2  x: DOT4_e      ____,  R1.x,  R1.x      
         y: DOT4_e      ____,  R1.y,  R1.y      
         z: DOT4_e      ____,  PV1.z,  PV1.z      
         w: DOT4_e      ____,  (0x80000000, -0.0f).x,  0.0f      
         t: MUL         R0.w,  C2.x,  C2.x      
      3  t: RSQ_e       ____,  PV2.x      
      4  x: MUL         ____,  R1.x,  PS3      
         y: MUL         ____,  R1.y,  PS3      
         z: MUL         ____,  R1.z,  PS3      
      5  x: DOT4        ____,  R0.x,  PV4.x      CLAMP 
         y: DOT4        ____,  R0.y,  PV4.y      CLAMP 
         z: DOT4        ____,  R0.z,  PV4.z      CLAMP 
         w: DOT4        ____,  (0x80000000, -0.0f).x,  0.0f      CLAMP 
      6  z: MUL         R0.z,  PV5.x,  PV5.x      
      7  x: ADD         R0.x,  PV6.z, -1.0f      
         y: MUL         ____,  R0.w,  PV6.z      
      8  w: MUL         ____,  R0.z,  PV7.y      
         t: RCP_e       ____,  PV7.y      
      9  z: MUL_e       ____,  R0.x,  PS8      
         t: RCP_e       ____,  PV8.w      
     10  x: MUL_e       R0.x,  PS9,  (0x3EA2F986, 0.3183099627f).x      
         y: MUL         ____,  PV9.z,  (0x3FB8AA3B, 1.442695022f).y      
     11  t: EXP_e       ____,  PV10.y      
     12  x: MUL         R2.x,  PS11,  R0.x      
01 EXP_DONE: PIX0, R2.xxxw
END_OF_PROGRAM