我最近开始学习HLSL后决定我想要比BasicEffect提供更好的照明。经过许多教程后,我发现了这一点,并决定从中学习: http://brooknovak.wordpress.com/2008/11/13/hlsl-per-pixel-point-light-using-phong-blinn-lighting-model/
上面的着色器似乎在我的游戏中效果不佳,因为我的游戏使用基于图块的方法,这意味着多个模型呈网格状。
我的每个瓷砖都会与其他瓷砖分开。请参阅此图像以获取视觉参考: http://i.imgur.com/1Sfi2.png 我知道这是因为每个图块都有自己的模型,并且着色器没有考虑其他模型,因为它正在模型的网格上执行。
现在,对于这个问题。如何将所有瓷砖遮在一起?我知道我可能需要从头开始编写一个着色器来实现这一点,但如果有人能给我一些如何达到我想要的效果的技巧,我真的很感激。
已经很晚了,所以我有可能忘记了什么。如果您需要更多信息,请告诉我,我会添加它。
谢谢,Merigrim
修改
以下是我绘制模型的代码:
public void DrawModel(Model model, Matrix modelTransform, Matrix[] absoluteBoneTransforms, Vector3 color, float alpha = 1.0f, Texture2D texture = null)
{
foreach (EffectPass pass in effect.CurrentTechnique.Passes)
{
foreach (ModelMesh mesh in model.Meshes)
{
foreach (ModelMeshPart part in mesh.MeshParts)
{
part.Effect = effect;
Matrix world = absoluteBoneTransforms[mesh.ParentBone.Index] * modelTransform;
effect.Parameters["World"].SetValue(absoluteBoneTransforms[mesh.ParentBone.Index] * modelTransform);
effect.Parameters["View"].SetValue(camera.view);
effect.Parameters["Projection"].SetValue(camera.projection);
effect.Parameters["CameraPos"].SetValue(camera.cameraPosition);
Vector3 lookAt = camera.cameraPosition + camera.cameraDirection;
effect.Parameters["LightPosition"].SetValue(new Vector3(lookAt.X, 1.0f, lookAt.Z - 5.0f));
effect.Parameters["LightDiffuseColor"].SetValue(new Vector3(0.45f, 0.45f, 0.45f));
effect.Parameters["LightSpecularColor"].SetValue(new Vector3(0.45f, 0.45f, 0.45f));
effect.Parameters["LightDistanceSquared"].SetValue(40.0f);
effect.Parameters["DiffuseColor"].SetValue(color);
effect.Parameters["AmbientLightColor"].SetValue(Color.Black.ToVector3());
effect.Parameters["EmissiveColor"].SetValue(Color.White.ToVector3());
effect.Parameters["SpecularColor"].SetValue(Color.White.ToVector3());
effect.Parameters["SpecularPower"].SetValue(10.0f);
if (texture != null)
{
effect.Parameters["DiffuseTexture"].SetValue(texture);
}
mesh.Draw();
}
}
pass.Apply();
}
}
答案 0 :(得分:1)
这次看来这些法线是恶棍。在纠正Blender中的法线之后,现在一切似乎都有效。
我要感谢医生和Andrew Russell。没有你的帮助,我不会想出来的!
所以现在我知道,当你的灯光出现问题时,请先检查法线。