44 lines
1.4 KiB
NASM
44 lines
1.4 KiB
NASM
// Pixel Shader for doing bump mapping with parallax plus diffuse and specular lighting by nfz
|
|
|
|
// uv TEXCOORD0
|
|
// lightDir TEXCOORD1
|
|
// eyeDir TEXCOORD2
|
|
// half TEXCOORD3
|
|
|
|
// lightDiffuse c0
|
|
// lightSpecular c1
|
|
// Parallax scale and bias c2
|
|
// normal/height map texunit 0 - height map in alpha channel
|
|
// diffuse texture texunit 1
|
|
|
|
ps.1.4
|
|
|
|
|
|
texld r0, t0 // get height
|
|
texcrd r2.xyz, t0 // get uv coordinates
|
|
texcrd r3.xyz, t2 // get eyedir vector
|
|
|
|
|
|
mad r0.xyz, r0.a, c2.x, c2.y // displacement = height * scale + bias
|
|
mad r2.xyz, r3, r0, r2 // newtexcoord = eyedir * displacement + uv
|
|
|
|
phase
|
|
|
|
texld r0, r2.xyz // get normal N using newtexcoord
|
|
texld r1, r2.xyz // get diffuse texture using newtexcoord
|
|
texcrd r4.xyz, t1 // get lightdir vector
|
|
texcrd r5.xyz, t3 // get half angle vector
|
|
|
|
dp3_sat r5.rgb, r0_bx2, r5 // N dot H - spec calc
|
|
dp3_sat r4.rgb, r0_bx2, r4 // N dot L - diffuse calc
|
|
+ mul r5.a, r5.r, r5.r
|
|
mul r0.rgb, r4, r1 // colour = diffusetex * N dot L
|
|
+ mul r5.a, r5.a, r5.a
|
|
|
|
mul r5.rgb, r5.a, r5.a
|
|
mul r5.rgb, r5, r5
|
|
mul r5.rgb, r5, r5
|
|
mul r5.rgb, r5, c1 // specular = (N dot H)^32 * specularlight
|
|
|
|
mad r0.rgb, r0, c0, r5 // colour = diffusetex * (N dot L)* diffuselight + specular
|
|
+ mov r0.a, c2.b |