HLSL点光源着色器使图块单独着色

时间:2011-07-29 00:05:40

标签: graphics 3d xna shader hlsl

我最近开始学习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();
    }
}

1 个答案:

答案 0 :(得分:1)

这次看来这些法线是恶棍。在纠正Blender中的法线之后,现在一切似乎都有效。

我要感谢医生和Andrew Russell。没有你的帮助,我不会想出来的!

所以现在我知道,当你的灯光出现问题时,请先检查法线。