hier noch nen witziger shader den ich mal geschrieben hatte  ist zwar nicht schön aber ich denke man versteht das prinzip dahinter  
 
 Code:   !!ARBfp1.0 OPTION ARB_precision_hint_nicest; OPTION NV_fragment_program2;     # texture 0 is the cube map # texture 1 is the per-surface bump map # texture 2 is the light falloff texture # texture 3 is the light projection texture # texture 4 is the per-surface diffuse map # texture 5 is the per-surface specular map # texture 6 is the specular lookup table   # env[0] is the diffuse modifier # env[1] is the specular modifier   TEMP    light,color, R1, R2, R3, R4,R5, localNormal, newtexcoord,view,RT,shd,shadow;   PARAM   shdmodi = 0.1; PARAM cmodi = {0.9,0.67,0.4,1}; PARAM   subOne = { -1, -1, -1, -1 }; PARAM   scaleTwo = { 2, 2, 2, 2 }; PARAM const = { 0.06, 0.1, 0.5, 2.0 }; DP3 light, fragment.texcoord[0], fragment.texcoord[0]; RSQ light, light.w; MUL light.xyz, light.w, fragment.texcoord[0]; DP3     view, fragment.texcoord[7], fragment.texcoord[7]; RSQ     view, view.x; MUL     view, view.x, fragment.texcoord[7]; SUB     R2.x, 1, -view.z;           # depth bias in R2.x MUL     R2.x, R2.x, R2.x; SUB     R2.x, 1, R2.x; RCP     R1.x, view.z;               # R1=1.0/view.z MUL     view.xy, view, const.x;     # view.xy*=depth MUL     view.xy, view, R2.x;        # view.xy*=depth_bias MUL     view, view, -R1.x;          # view*=-R1 MUL     view, view, const.y;        # view/=10 MOV     RT, fragment.texcoord[1];   # RT=texcoord MOV     RT.z, 1;                    # RT.z=1 TEX     R1, RT, texture[1], 2D;     # R1=tex(RT) SGTC    R3.w, RT.z, R1.z;           # if (RT.z>R1.w) ADD     RT(GT.w), RT, view;         #   RT+=view;^ TEX     R1, RT, texture[1], 2D;     # R1=tex(RT) SGTC    R3.w, RT.z, R1.z;           # if (RT.z>R1.w) ADD     RT(GT.w), RT, view;         #   RT+=view; TEX     R1, RT, texture[1], 2D;     # R1=tex(RT) SGTC    R3.w, RT.z, R1.z;           # if (RT.z>R1.w) ADD     RT(GT.w), RT, view;         #   RT+=view; TEX     R1, RT, texture[1], 2D;     # R1=tex(RT) SGTC    R3.w, RT.z, R1.z;           # if (RT.z>R1.w) ADD     RT(GT.w), RT, view;         #   RT+=view; TEX     R1, RT, texture[1], 2D;     # R1=tex(RT) SGTC    R3.w, RT.z, R1.z;           # if (RT.z>R1.w) ADD     RT(GT.w), RT, view;         #   RT+=view; TEX     R1, RT, texture[1], 2D;     # R1=tex(RT) SGTC    R3.w, RT.z, R1.z;           # if (RT.z>R1.w) ADD     RT(GT.w), RT, view;         #   RT+=view; TEX     R1, RT, texture[1], 2D;     # R1=tex(RT) SGTC    R3.w, RT.z, R1.z;           # if (RT.z>R1.w) ADD     RT(GT.w), RT, view;         #   RT+=view; TEX     R1, RT, texture[1], 2D;     # R1=tex(RT) SGTC    R3.w, RT.z, R1.z;           # if (RT.z>R1.w) ADD     RT(GT.w), RT, view;         #   RT+=view; TEX     R1, RT, texture[1], 2D;     # R1=tex(RT) SGTC    R3.w, RT.z, R1.z;           # if (RT.z>R1.w) ADD     RT(GT.w), RT, view;         #   RT+=view; TEX     R1, RT, texture[1], 2D;     # R1=tex(RT) SGTC    R3.w, RT.z, R1.z;           # if (RT.z>R1.w) ADD     RT(GT.w), RT, view;         #   RT+=view; TEX     R1, RT, texture[1], 2D;         # R1=tex(RT) MUL     view, view, const.z;            # view*=0.5 SGTC    R3.w, RT.z, R1.z;               # if (RT.z>R1.w) MAD     RT(GT.w), view, const.w, RT;    #   RT+=view*2; SUB     RT, RT, view;                   # RT-=view; TEX     R1, RT, texture[1], 2D;         # R1=tex(RT) MUL     view, view, const.z;            # view*=0.5 SGTC    R3.w, RT.z, R1.z;               # if (RT.z>R1.w) MAD     RT(GT.w), view, const.w, RT;    #   RT+=view*2; SUB     RT, RT, view;                   # RT-=view; TEX     R1, RT, texture[1], 2D;         # R1=tex(RT) MUL     view, view, const.z;            # view*=0.5 SGTC    R3.w, RT.z, R1.z;               # if (RT.z>R1.w) MAD     RT(GT.w), view, const.w, RT;    #   RT+=view*2; SUB     RT, RT, view;                   # RT-=view; TEX     R1, RT, texture[1], 2D;         # R1=tex(RT) MUL     view, view, const.z;            # view*=0.5 SGTC    R3.w, RT.z, R1.z;               # if (RT.z>R1.w) MAD     RT(GT.w), view, const.w, RT;    #   RT+=view*2; SUB     RT, RT, view;                   # RT-=view; TEX     R1, RT, texture[1], 2D;         # R1=tex(RT) MUL     view, view, const.z;            # view*=0.5 SGTC    R3.w, RT.z, R1.z;               # if (RT.z>R1.w) MAD     RT(GT.w), view, const.w, RT;    #   RT+=view*2; SUB     RT, RT, view;                   # RT-=view; TEX     R1, RT, texture[1], 2D;         # R1=tex(RT) MUL     view, view, const.z;            # view*=0.5 SGTC    R3.w, RT.z, R1.z;               # if (RT.z>R1.w) MAD     RT(GT.w), view, const.w, RT;    #   RT+=view*2; SUB     RT, RT, view;                   # RT-=view; MOV newtexcoord,RT; MOV shd,1.0; MOV RT,fragment.texcoord[1];  TEX     R1, RT, texture[1], 2D; MOV RT.z,R1.z;        MOV R4,R1.z; MOV shadow,shdmodi; MAD RT,light,0.004,RT; TEX     R1, RT, texture[1], 2D;     #R1 = tex(RT) SGTC    R3.w, R1.z, RT.z;       #if(R1.z > RT.z) MOV shd(GT.w),shadow;               #shd = 0.0 MAD RT,light,0.004,RT; TEX     R1, RT, texture[1], 2D;     #R1 = tex(RT) SGTC    R3.w, R1.z, RT.z;       #if(R1.z > RT.z) MOV shd(GT.w),shadow;               #shd = 0.0 MAD RT,light,0.004,RT; TEX     R1, RT, texture[1], 2D;     #R1 = tex(RT) SGTC    R3.w, R1.z, RT.z;       #if(R1.z > RT.z) MOV shd(GT.w),shadow;               #shd = 0.0 MAD RT,light,0.004,RT; TEX     R1, RT, texture[1], 2D;     #R1 = tex(RT) SGTC    R3.w, R1.z, RT.z;       #if(R1.z > RT.z) MOV shd(GT.w),shadow;               #shd = 0.0 MAD RT,light,0.004,RT; TEX     R1, RT, texture[1], 2D;     #R1 = tex(RT) SGTC    R3.w, R1.z, RT.z;       #if(R1.z > RT.z) MOV shd(GT.w),shadow;               #shd = 0.0 MAD RT,light,0.004,RT; TEX     R1, RT, texture[1], 2D;     #R1 = tex(RT) SGTC    R3.w, R1.z, RT.z;       #if(R1.z > RT.z) MOV shd(GT.w),shadow;               #shd = 0.0 MAD RT,light,0.004,RT; TEX     R1, RT, texture[1], 2D;     #R1 = tex(RT) SGTC    R3.w, R1.z, RT.z;       #if(R1.z > RT.z) MOV shd(GT.w),shadow;               #shd = 0.0 MAD RT,light,0.004,RT; TEX     R1, RT, texture[1], 2D;     #R1 = tex(RT) SGTC    R3.w, R1.z, RT.z;       #if(R1.z > RT.z) MOV shd(GT.w),shadow;               #shd = 0.0 MAD RT,light,0.004,RT; TEX     R1, RT, texture[1], 2D;     #R1 = tex(RT) SGTC    R3.w, R1.z, RT.z;       #if(R1.z > RT.z) MOV shd(GT.w),shadow;               #shd = 0.0 MAD RT,light,0.004,RT; TEX     R1, RT, texture[1], 2D;     #R1 = tex(RT) SGTC    R3.w, R1.z, RT.z;       #if(R1.z > RT.z) MOV shd(GT.w),shadow;               #shd = 0.0   MUL     R4.xyz,cmodi,program.env[0]; # modulate by the light projection TXP R1, fragment.texcoord[3], texture[3], 2D; MUL R4, R4, R1;   # modulate by the light falloff TXP R1, fragment.texcoord[2], texture[2], 2D; MUL R4, R4, R1;   MUL R4,R4,shd;     TEX color,newtexcoord, texture[4], 2D; MUL color,color,R4;   MUL result.color.xyz, color, fragment.color;     END   
  
		
		 |