To achieve colored specular Ashadow is not needed :). But credits goes to Andrey - author of Ashadow lib. It's a modified Andrey's sample with his lighting method.
Graphics3D 800,600,32,1 SetBuffer BackBuffer() fxcam=CreateCamera() CameraClsColor fxcam,127,127,0 cam=CreateCamera() CameraClsMode cam,1,1 MoveEntity cam,0,10,-25 CameraClsColor cam,255,255,255 ;sky Sky=CreateSphere(16) EntityBlend Sky,1 ScaleEntity Sky,100,70,100 FlipMesh Sky EntityFX Sky,1+8 EntityOrder Sky,1 SkyTex=LoadTexture("data\SkyDome.jpg",1) EntityTexture Sky,SkyTex ;lightbox Lbox = LoadLightBox("data\LightCube\normalize","png"); Ref = LoadTexture( "data\lightBl.jpg",1) TextureBlend ref,1 ;DIFFUSE TEXTURE DiffuseTEX = LoadTexture("data\floor_d.dds", 9) TextureBlend DiffuseTEX ,2 ;SPECULAR TEXTURE SpecularTex = LoadTexture( "data\floor_s.dds",1) TextureBlend SpecularTex,2 ;NORMALMAP TEXTURE BumpTEX = LoadTexture("data\floor_n.dds",9) TextureBlend BumpTEX ,4 ;AMBIENT TEXTURE AmbientTEX=CreateTexture(1,1,1) TextureBlend AmbientTEX,3 argb= (((5 Shl 8) Or 5) Shl 8) Or 5 WritePixel 0,0,argb ,TextureBuffer(AmbientTEX) ;LIGHTMAP - can be used insted of ambient texture ;lightmap = LoadTexture( "data\lightBl.jpg",1) ;TextureBlend lightmap,2 ;LIGHT TEXTURE LightTEX = CreateTexture( 32,32, 128+256) SetCubeMode LightTEX,2 TextureBlend LightTEX,1 ;REFLECTION TEXTURE RefTEX = CreateTexture( 32,32, 128+256) SetCubeMode RefTEX,1 TextureBlend RefTEX,2 ;light light=CreateLight(1) LightColor light,0,255,0 TurnEntity light,40,90,0 ;render lights and reflections RenderLight ( LightTEX, light, fxcam, cam, Lbox, 3 ) RenderLight ( RefTEX, light, fxcam, cam, Lbox, .1, 1, 15, .9, Ref ) ;prepare mesh pol = LoadMesh("data\cube.3DS") BlicPol=CopyEntity(pol,pol) EntityTexture BlicPol, RefTEX, 0, 0 EntityTexture BlicPol, BumpTEX, 0, 1 EntityTexture Blicpol, SpecularTEX, 0, 2 EntityBlend BlicPol, 3 EntityFX BlicPol, 1 EntityTexture pol, LightTEX, 0, 0 EntityTexture pol, BumpTEX, 0, 1 EntityTexture pol, AmbientTEX, 0, 2 ;EntityTexture pol, Lightmap, 0, 2 EntityTexture pol, DiffuseTEX, 0, 3 MoveEntity pol,0,-13,0 ScaleEntity pol,30,1,30 ;show scene Const FPS=60 period=1000/FPS time=MilliSecs()-period While Not MouseHit(3) Or (KeyHit(1)) Repeat elapsed=MilliSecs()-time Until elapsed ticks=elapsed/period tween#=Float(elapsed Mod period)/Float(period) For k=1 To ticks time=time+period mouselook cam KeyControl cam UpdateWorld Next PositionEntity Sky,EntityX( cam,1 ) ,EntityY( cam,1 ), EntityZ( cam,1 ) RenderWorld Flip False Wend End Function RenderLight ( Reftex, light, fxcam, cam, mesh, Intencity#=1, Mode=0,size#=10, IntencitySpr#=1, Ref=0) Local BlicSpr TFormNormal 0,0,1,light,0 CameraViewport fxcam, 0,0,TextureWidth(Reftex), TextureHeight(Reftex) CameraProjMode fxcam,1 CameraProjMode cam,0 PositionEntity fxcam,65535,65535,65535 ScaleEntity mesh,10,10,10 EntityFX mesh,1 EntityColor mesh,255*IntencitySpr#,255*IntencitySpr#,255*Intencity# PositionEntity mesh,65535,65535,65535 AlignToVector mesh, TFormedX(), TFormedY(), TFormedZ(),0 ShowEntity mesh If Mode=1 BlicSpr=CreateSprite() If Ref EntityTexture BlicSpr,Ref ScaleSprite BlicSpr,size#,size# SpriteViewMode BlicSpr,2 EntityBlend BlicSpr,3 EntityColor BlicSpr,255,255,255*IntencitySpr# EntityFX BlicSpr,17 PositionEntity BlicSpr,65535,65535,65535 MoveEntity BlicSpr, -10*TFormedX(), -10*TFormedY(), -10*TFormedZ() PointEntity BlicSpr, fxcam EntityOrder BlicSpr,-1 EndIf tex_sz=TextureWidth(Reftex) SetCubeFace Reftex,0 RotateEntity fxcam,0,90,0 RenderWorld CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(Reftex) SetCubeFace Reftex,1 RotateEntity fxcam,0,0,0 RenderWorld CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(Reftex) SetCubeFace Reftex,2 RotateEntity fxcam,0,-90,0 RenderWorld CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(Reftex) SetCubeFace Reftex,3 RotateEntity fxcam,0,180,0 RenderWorld CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(Reftex) SetCubeFace Reftex,4 RotateEntity fxcam,-90,0,0 RenderWorld CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(Reftex) SetCubeFace Reftex,5 RotateEntity fxcam,90,0,0 RenderWorld CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(Reftex) If Mode=1 FreeEntity BlicSpr EndIf HideEntity mesh CameraProjMode cam,1 CameraProjMode fxcam,0 End Function Function LoadLightBox( file$, ext$ ) m=CreateMesh() ;front face b=LoadBrush( file$+"_pz."+ext$,49 ) s=CreateSurface( m,b ) AddVertex s,-1,+1,-1,1,1:AddVertex s,+1,+1,-1,0,1 AddVertex s,+1,-1,-1,0,0:AddVertex s,-1,-1,-1,1,0 AddTriangle s,0,1,2:AddTriangle s,0,2,3: FreeBrush b ;right face b=LoadBrush( file$+"_nx."+ext$,49 ) s=CreateSurface( m,b ) AddVertex s,+1,+1,-1,1,1:AddVertex s,+1,+1,+1,0,1 AddVertex s,+1,-1,+1,0,0:AddVertex s,+1,-1,-1,1,0 AddTriangle s,0,1,2:AddTriangle s,0,2,3 FreeBrush b ;back face b=LoadBrush( file$+"_nz."+ext$,49 ) s=CreateSurface( m,b ) AddVertex s,+1,+1,+1,1,1:AddVertex s,-1,+1,+1,0,1 AddVertex s,-1,-1,+1,0,0:AddVertex s,+1,-1,+1,1,0 AddTriangle s,0,1,2:AddTriangle s,0,2,3 FreeBrush b ;left face b=LoadBrush( file$+"_px."+ext$,49 ) s=CreateSurface( m,b ) AddVertex s,-1,+1,+1,1,1:AddVertex s,-1,+1,-1,0,1 AddVertex s,-1,-1,-1,0,0:AddVertex s,-1,-1,+1,1,0 AddTriangle s,0,1,2:AddTriangle s,0,2,3 FreeBrush b ;top face b=LoadBrush( file$+"_ny."+ext$,49 ) s=CreateSurface( m,b ) AddVertex s,-1,+1,+1,1,1:AddVertex s,+1,+1,+1,0,1 AddVertex s,+1,+1,-1,0,0:AddVertex s,-1,+1,-1,1,0 AddTriangle s,0,1,2:AddTriangle s,0,2,3 FreeBrush b ;bottom face b=LoadBrush( file$+"_py."+ext$,49 ) s=CreateSurface( m,b ) AddVertex s,-1,-1,-1,1,1:AddVertex s,+1,-1,-1,0,1 AddVertex s,+1,-1,+1,0,0:AddVertex s,-1,-1,+1,1,0 AddTriangle s,0,1,2:AddTriangle s,0,2,3 FreeBrush b FlipMesh m EntityFX m,1 Return m End Function Function mouselook(ent) mxspd#=MouseXSpeed()*0.25 myspd#=MouseYSpeed()*0.25 MoveMouse GraphicsWidth()/2,GraphicsHeight()/2 campitch#=EntityPitch(ent)+myspd# If campitch#<-85 Then campitch#=-85 If campitch#>85 Then campitch#=85 RotateEntity ent,campitch#,EntityYaw(ent)-mxspd#,EntityRoll(ent) End Function Function KeyControl(ent) If KeyDown(200) MoveEntity ent,0,0,.25 If KeyDown(208) MoveEntity ent,0,0,-.25 If KeyDown(205) MoveEntity ent,.25,0,0 If KeyDown(203) MoveEntity ent,-.25,0,0 If KeyDown(17) MoveEntity ent,0,0,.25 If KeyDown(31) MoveEntity ent,0,0,-.25 If KeyDown(32) MoveEntity ent,.25,0,0 If KeyDown(30) MoveEntity ent,-.25,0,0 If MouseDown(1) MoveEntity ent,0,0,.25 If MouseDown(2) MoveEntity ent,0,0,-.25 End Function