适当的方向灯在多个型号上

我一直在试图实现一个定向光进入我正在做的XNA游戏,但由于某种原因,我似乎无法让定向光成为一个真正的定向光。 相反,我坚持定向点光源。 在这种情况下,“方向点光”意味着“每个模型都有一个适当的定向光源,但是光线来自一个固定点,而不是偏离模型的位置”。 我想要的是定向光来自每个模型的偏移量,以便每个模型,不管位置,将从相同的角度点亮。

例如:如果我有2个立方体(单独的模型),c1在(0,0,0)和c2在(4,0,4),我的光线方向为(0,2,2),我站在(6,0,-3)我想看到顶部,左侧(如果我能看到它),我的立方体的面被点亮,但是我得到了c1的背面,左面和顶面,但右面,c2灯的前面和上面,这不是我想要的。

当前的着色器代码

// Global world variables float4x4 World; float4x4 View; float4x4 Projection; // Ambient Lighting variables float3 AmbientColor; float AmbientIntensity; // Diffuse Lighting variables float3 DiffuseColor; float DiffuseIntensity; float3 DiffuseLightDirection; // Texturing variables Texture ModelTexture; // Texture sampler sampler TextureSampler = sampler_state { texture = <ModelTexture> ; magfilter = LINEAR; minfilter = LINEAR; mipfilter= LINEAR; AddressU = WRAP; AddressV = WRAP; }; struct StaticLightVSInput { float4 Position : POSITION0; float3 Normal : NORMAL0; float2 TexCoords : TEXCOORD0; }; struct StaticLightVSOutput { float4 Position : POSITION0; float2 TexCoords : TEXCOORD0; float3 Normal : TEXCOORD1; float3 CameraView : TEXCOORD4; }; StaticLightVSOutput StaticLightVertexShader( StaticLightVSInput input ) { StaticLightVSOutput output; // Set output position float4 worldPosition = mul( input.Position, World ); float4 viewPosition = mul( worldPosition, View ); output.Position = mul( viewPosition, Projection ); output.TexCoords = input.TexCoords; return output; } float4 StaticLightPixelShader( StaticLightVSOutput input ) : COLOR0 { float4 texColor = tex2D( TextureSampler, input.TexCoords ); // calculate diffuse light float diffuse = saturate(dot( -DiffuseLightDirection, input.Normal )) * DiffuseIntensity * DiffuseColor; // calculate specular light - disabled for now float specular = 0; //SpecularIntensity * SpecularColor * max(pow(dotProduct, Shinniness), 0) * diffuse; float3 ambient = AmbientIntensity * AmbientColor; float3 color = texColor.rgb * saturate( diffuse + ambient + specular ); return float4 (color.rgb, texColor.a); } technique StaticLighting { pass Pass0 { VertexShader = compile vs_2_0 StaticLightVertexShader(); PixelShader = compile ps_2_0 StaticLightPixelShader(); } } 

用于设置着色器的C#代码

 // set parameters for our shader objectLightingEffect.Parameters["World"].SetValue(position); objectLightingEffect.Parameters["View"].SetValue(view); objectLightingEffect.Parameters["Projection"].SetValue(projection); // Ambient light objectLightingEffect.Parameters["AmbientColor"].SetValue(weather.AmbientColor.GetVector3()); objectLightingEffect.Parameters["AmbientIntensity"].SetValue(weather.AmbientIntensity); // Diffuse light objectLightingEffect.Parameters["DiffuseColor"].SetValue(weather.SunColor.GetVector3()); objectLightingEffect.Parameters["DiffuseIntensity"].SetValue(weather.SunIntensity); Vector3 dir = new Vector3(16, 13, 0) + position.Translation; objectLightingEffect.Parameters["DiffuseLightDirection"].SetValue(dir); // Texture objectLightingEffect.Parameters["ModelTexture"].SetValue(texture.Texture); 

我甚至尝试用每个物体的位置matrix来抵消光线的方向(读数:位置),它什么都不做

有人可以告诉我我做错了什么/失踪? 我已经花费了3天的时间来尝试谷歌为我find的每一个定向光着色器变体,我不能相信这么简单的事情几乎是不可能的。 我在这里,在stackoverflow或任何游戏开发博客/教程中都找不到与我的问题相关的任何内容。

任何帮助将不胜感激。

只需将DiffuseLightDirection设置为一个常量单位vector。 不要尝试将它添加到对象的位置,因为你现在正在做。 这个vector表示光线来自的方向,而不是任何东西的位置。 所以如果它是恒定的,所有的对象将从相同的方向点亮。