Я недавно начал изучать 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
Я понимаю, что это связано с тем, что у каждой плитки есть своя собственная модель, а шейдер не учитывает другие модели, поскольку выполняется на сетках модели.
Теперь по вопросу. Как можно закрасить все плитки вместе? Я понимаю, что для этого мне, возможно, придется написать шейдер с нуля, но если бы кто-нибудь мог дать мне несколько советов о том, как добиться желаемого эффекта, я был бы очень признателен.
Уже поздно, поэтому есть вероятность, что я что-то забыл. Если вам нужна дополнительная информация, пожалуйста, сообщите мне, и я добавлю ее.
Спасибо, Меригрим
EDIT:
Вот мой код для рисования модели:
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();
}
}