メモ
スペキュラマップだけ、光源の位置とカメラ位置の影響を受ける。
/* % Description of my shader. % Second line of description for my shader. keywords: material classic date: YYMMDD */ // My Add float4x4 WIT : WorldInverseTranspose <string UIWidget = "none";>; float4x4 WVP : WorldViewProjection <string UIWidget = "none";>; float4x4 W : World <string UIWidget = "none";>; float4x4 VI : ViewInverse <string UIWidget = "none";>; float4x4 IW : WorldInverse <string UIWidget = "none";>; // Camera float4 CameraPos : Position < string UIName = "Camera Pos"; string Object = "PerspectiveCamera"; string Space = "World"; >; // Light float4 PointLightPos : Position < string UIName = "Point Light Pos"; //string UIWidget = "none"; string Object = "PointLight"; string Space = "World"; >; float4 PointLightColor : Diffuse < string UIName = "Point Light Color"; string UIWidget = "Color"; string Object = "PointLight"; > = { 1.0f, 0.5f, 0.4f, 1.0f }; float4 FloorColor : Color < string UIName = "Floor Color"; string UIWidget = "Color"; > = { 0.1f, 0.8f, 0.1f, 1.f }; texture FloorTexture : Diffuse < string ResourceName = "red.bmp"; string ResourceType = "2D"; string UIName = "Surface Texture"; >; sampler2D FloorSampler = sampler_state { Texture = <FloorTexture>; MinFilter = LinearMipMapLinear; MagFilter = Linear; }; texture SpecularTexture : Diffuse < string ResourceName = "specular.bmp"; string ResourceType = "2D"; string UIName = "Surface Texture"; >; sampler2D SpecularSampler = sampler_state { Texture = <SpecularTexture>; MinFilter = LinearMipMapLinear; MagFilter = Linear; }; //----------------------------------------------- // Struct //----------------------------------------------- // input data from vertex buffer struct appdata { float4 Position : POSITION; float3 Normal : NORMAL; float2 UV : TEXCOORD0; }; // pass from vertex program to pixel program struct VertexOutput { float4 Position : POSITION; float3 Normal : TEXCOORD0; float2 UV : TEXCOORD1; float3 Eye : TEXCOORD2; float3 L; float Dist; }; // vertex shader entry point VertexOutput mainVS( appdata IN ) { VertexOutput OUT = (VertexOutput)0; float3 localCameraPos = mul((float3x3)IW, PointLightPos.xyz); float3 localLightPos = mul((float3x3)IW, CameraPos.xyz); OUT.Position = mul( WVP, IN.Position ); OUT.Normal = normalize( IN.Normal ); OUT.UV = IN.UV; OUT.Eye = localCameraPos-IN.Position.xyz; OUT.L = normalize( localLightPos-IN.Position.xyz ); OUT.Dist = distance( localLightPos.xyz, IN.Position.xyz ); return OUT; } // pixel shader entry point float4 mainPS( VertexOutput IN ) : COLOR { // My Add float3 N = normalize(IN.Normal); float3 E = normalize(IN.Eye); float3 R = -E+2.0f*dot(N,E)*N; float dist = IN.Dist; float dist2 = dist*dist; float attenu = 1;//(1+1*dist+1*dist2); float4 color = tex2D( FloorSampler, IN.UV ); float4 specular = tex2D( SpecularSampler, IN.UV ); float coeff = max(0, dot(IN.L, R)); return color + attenu*coeff*specular;// * FloorColor; } technique technique0 { pass p0 { CullFaceEnable = false; VertexProgram = compile vp40 mainVS(); FragmentProgram = compile fp40 mainPS(); } }