XNA - 3D-игра - Примените свет ко всем моделям

Я хочу сделать игру XNA с 3D-графикой, и меня интересует одна вещь. Скажем, у меня есть 10 Model в моей сцене, и я хочу нарисовать их всех одним и тем же источником света, например направленным светом. Теперь я понимаю, что у Model есть Effect, а у Effect есть информация об освещении, среди прочего. Мой вопрос: как применить один и тот же источник света ко всем моделям в моей сцене вместо того, чтобы каждая модель имела свой собственный источник света? Кто-нибудь скажите мне, если я далеко от базы.


person Kendall Frey    schedule 04.01.2012    source источник
comment
Вы можете получить лучший ответ на gamedev.stackexchange.com   -  person Jason Down    schedule 04.01.2012


Ответы (1)


Если вы используете XNA 4.0 для создания своей игры, вам необходимо использовать Эффекты. К счастью, команда XNA включила мощный, но простой эффект под названием BasicEffect. Если вы не укажете иное, BasicEffect является эффектом по умолчанию, который используется при рендеринге ваших моделей. BasicEffect поддерживает до 3 направленных источников света. Приведенный ниже пример кода должен дать вам представление о том, как манипулировать экземпляром BasicEffect для рендеринга с использованием направленного света.

public void DrawModel( Model myModel, float modelRotation, Vector3 modelPosition,
                       Vector3 cameraPosition
     ) {
    // Copy any parent transforms.
    Matrix[] transforms = new Matrix[myModel.Bones.Count];
    myModel.CopyAbsoluteBoneTransformsTo(transforms);

    // Draw the model. A model can have multiple meshes, so loop.
    foreach (ModelMesh mesh in myModel.Meshes)
    {
        // This is where the mesh orientation is set, as well 
        // as our camera and projection.
        foreach (BasicEffect effect in mesh.Effects)
        {
            effect.EnableDefaultLighting();
            effect.World = transforms[mesh.ParentBone.Index] * 
                            Matrix.CreateRotationY(modelRotation) *
                            Matrix.CreateTranslation(modelPosition);
            effect.View = Matrix.CreateLookAt(cameraPosition,
                            Vector3.Zero, Vector3.Up);
            effect.Projection = Matrix.CreatePerspectiveFieldOfView(
                                    MathHelper.ToRadians(45.0f), 1.333f, 
                                    1.0f, 10000.0f);
            effect.LightingEnabled = true; // turn on the lighting subsystem.
            effect.DirectionalLight0.DiffuseColor = new Vector3(0.5f, 0, 0); // a red light
            effect.DirectionalLight0.Direction = new Vector3(1, 0, 0);  // coming along the x-axis
            effect.DirectionalLight0.SpecularColor = new Vector3(0, 1, 0); // with green highlights
        }
        // Draw the mesh, using the effects set above.
        mesh.Draw();
    }
}
person borrillis    schedule 04.01.2012
comment
Итак, в основном изменить эффект модели, чтобы переопределить освещение в модели? Я в порядке с этим. - person Kendall Frey; 04.01.2012