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