XNA奇怪的照明,着色器

法线贴图光地图

嘿家伙,我有奇怪的照明问题。 我写了自己的“延迟照明”着色器,这个事情发生了:

  1. 图:正常地图
  2. 图:光照图

只要我只使用一个大的网格,一切似乎都没问题,但这看起来很不对。

这里是我如何计算点光源地图( http://www.packtpub.com/article/advanced-lighting-3d-graphics-xna-game-studio-40 ):

float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0 { // Find the pixel coordinates of the input position in the depth // and normal textures float2 texCoord = postProjToScreen(input.LightPosition) + halfPixel(); // Extract the depth for this pixel from the depth map float4 depth = tex2D(depthSampler, texCoord); // Recreate the position with the UV coordinates and depth value float4 position; position.x = texCoord.x * 2 - 1; position.y = (1 - texCoord.y) * 2 - 1; position.z = depth.r; position.w = 1.0f; // Transform position from screen space to world space position = mul(position, InvViewProjection); position.xyz /= position.w; position.w = 1; // Extract the normal from the normal map and move from // 0 to 1 range to -1 to 1 range float4 normal = (tex2D(normalSampler, texCoord) - .5) * 2; // Perform the lighting calculations for a point light float3 lightDirection = normalize(LightPosition - position); float lighting = clamp(dot(normal, lightDirection), 0, 1); // Attenuate the light to simulate a point light float d = distance(LightPosition, position); float att = 1 - pow(d / LightAttenuation, LightFalloff); // Calculate the specular Component float3 R = normalize(2 * max(0,dot(normal, lightDirection)) * normal - lightDirection); float4 specularComponent = pow(saturate(dot(R, normalize(CameraPosition - position.xyz))), LightShininess); return float4(LightColor * att * lighting + LightColor * att * specularComponent, 1); } 

我真的不知道为什么,但搅拌机是这里的根本问题。 造成完全相同的问题。 我会很感激任何提示解决这个问题。

它看起来像你的几何可能是由未焊接的盒子,你正在使用平滑法线(软边缘)。 如果我的猜测是正确的,那么照明就会closures,因为平滑的法线从每个盒子的角向外指向,因此与将两个盒子相邻放置时产生的平坦表面不匹配。

尝试使用未平滑的法线(硬边缘)。 您可以在Blender帮助文件中查找如何设置。