HLSL Point Light shader вызывает отдельное затенение плиток - PullRequest
4 голосов
/ 29 июля 2011

Я недавно начал изучать 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();
    }
}

1 Ответ

1 голос
/ 29 июля 2011

Кажется, на этот раз злодеи были злодеями. После исправления норм в Blender теперь все работает.

Хочу поблагодарить медикаментов и Эндрю Рассела. Без вашей помощи я бы этого не понял!

Итак, теперь я знаю, что когда у вас проблемы с освещением, всегда сначала проверяйте нормали.

...