netlib.narod.ru< Назад | Оглавление | Далее >

Использование эффектов в XNA

Эффекты в XNA рассматриваются как игровые ресурсы, подобно моделям и текстурам. Все эффекты обрабатываются конвейером содержимого XNA, генерирующим управляемые объекты, которые диспетчер содержимого может загрузить во время исполнения.

Для представления эффекта вы используете класс XNA Effect. Этот класс позволяет вам сконфигурировать параметры эффекта, выбрать текущую технику эффекта и использовать эффект для визуализации. Приведенный ниже код показывает как загрузить и сконфигурировать эффект в XNA:

// Объект эффекта XNA
Effect effect;

// Загрузка эффекта
effect = content.Load<Effect>("/effects/lightEffect");

// Установка техники
effect.CurrentTechnique = lightEffect.Techniques["basicLight"];

// Конфигурирование параметров эффекта
effect.Parameters["lightPosition"].SetValue(new Vector3(0.0f, 40.0f, 0.0f));
effect.Parameters["lightColor"].SetValue(Vector3.One);

В показанном коде вы сначала загружаете эффект lightEffect, используя диспетчер содержимого. Затем вы определяете, какая техника эффекта будет использована — в данном случае техника basicLight. И, наконец, вы устанавливаете параметры эффекта: lightPosition и lightColor. Следующий код показывает, как нарисовать объект, используя загруженный эффект:

// Сперва начинаем эффект
effect.Begin();

// Помните, что в эффекте может быть несколько проходов
foreach (EffectPass pass in effect.CurrentTechnique.Passes)
{
    pass.Begin();

    // РАЗМЕСТИТЕ ЗДЕСЬ ВАШ КОД РИСОВАНИЯ

    pass.End();
}
// В конце завершаем эффект
effect.End();

Чтобы нарисовать модель, используя эффект, вам сперва надо начать этот эффект, а затем пройти через все проходы его техники. Для каждого прохода вы должны начать проход, нарисовать модель и завершить проход. В конце вам надо завершить эффект. Проход эффекта представлен классом XNA EffectPass, и доступ к ним осуществляется через свойство CurrentTechnique класса Effect. Если вы хотите изменить параметры эффекта после начала прохода, вам надо вызвать метод CommitChanges класса Effect для принятия изменений.

Показанные выше этапы необходимы только если вы решаете нарисовать модель самостоятельно. Если вы используете один из классов XNA, такой как класс ModelMesh, он будет автоматически рисовать модель, используя назначенный ей эффект.

Вспомогательные классы эффектов

Когда эффект загружается через диспетчер содержимого, вы не знаете, какие параметры или техники есть в нем. Также, чтобы модифицировать параметр эффекта вы должны сперва запросить этот параметр внутри эффекта, и затем модифицировать его.

Чтобы упростить управление самостоятельно создаваемыми эффектами, вам лучше создать уникальный вспомогательный класс для каждого из них. Каждый вспомогательный класс эффекта будет хранить ссылки на все параметры эффекта, предотвращая лишние действия, связанные с постоянным запросом этих параметров. Также все параметры эффекта будут видимы через свойства класса эффекта, что позволит избежать попыток запросить неверный параметр. Для конфигурирования параметра эффекта lightPosition вы использовали следующий код:

effect.Parameters["lightPosition"].SetValue(new Vector3(0.0f, 40.0f, 0.0f));

В показанном коде, когда вы меняете параметр lightPosition, выполняется запрос внутри эффекта для параметра lightPosition. Здесь есть две проблемы: лишняя работа по запросу этого параметра и возможность запросить неверный параметр. Используя вспомогательные классы вы можете избежать этих проблем. Следующий код показывает, как хранить ссылку для параметра эффекта и менять его значение:

EffectParameter param1 = effect.Parameters["lightPosition"];

// Цикл визуализации
{
    param1.SetValue(new Vector3(0.0f, 40.0f, 0.0f));

    // Рисуем модель
    ... ...
}

Более того, вы можете создать подключаемый модуль Visual Studio для автоматической генерации вспомогательных классов эффектов.

Материалы

Материалы хранят параметры, используемые для конфигурирования эффектов. Например, вы можете визуализировать две поверхности, используя эффект, который применяет текстуру к каждой из них. В этом случае материалом каждой поверхности является ее текстура, которую вы используете для конфигурирования эффекта, применяемого для визуализации поверхности. Итак, если две поверхности совместно используют один и тот же материал, вы должны установить желаемый эффект и желаемый материал, а потом последовательно визуализировать обе поверхности, избегая изменять установленный в данный момент эффект или его параметры.

Чтобы упростить конфигурацию вспомогательных классов эффектов, вы также создадите некоторые классы материалов. Два базовых класса материалов, которые вы создадите, — это класс LightMaterial, хранящий используемые для освещения свойства поверхности (рассеиваемый цвет, отражаемый цвет и мощность отражений), и класс TextureMaterial, хранящий карту текстур и блоки, используемые для наложения текстур на поверхность. Вы можете использовать эти два базовых класса материалов для создания более сложных типов материалов, таких как мультитекстурируемые материалы. Посмотрите на полный код класса LightMaterial:

public class LightMaterial
{
    // Свойства материала - рассеиваемый и отражаемый цвета
    Vector3 diffuseColor;
    Vector3 specularColor;

    // Мощность отражения (блеск)
    float specularPower;

    // Свойства
    public Vector3 DiffuseColor
    {
        get { return diffuseColor; }
        set { diffuseColor = value; }
    }
    public Vector3 SpecularColor
    {
        get { return specularColor; }
        set { specularColor = value; }
    }

    public float SpecularPower
    {
        get { return specularPower; }
        set { specularPower = value; }
    }

    public LightMaterial (Vector3 diffuseColor,
                          Vector3 specularColor,
                          float specularPower)
    {
        this.diffuseColor  = diffuseColor;
        this.specularColor = specularColor;
        this.specularPower = specularPower;
    }
}

Вы храните цвет рассеиваемого и отражаемого света как Vector3 XNA в атрибутах diffuseColor и specularColor класса LightMaterial соответственно. Вы храните мощность отраженного света (или блеск) как значение float в атрибуте specularPower класса. Обратите внимание, что компоненты (X, Y, Z) вектора цвета представляют цвет в формате RGB. Вам также надо создать свойства для установки и получения рассеиваемого цвета, отражаемого цвета и мощности отражения. Далее приведен полный код класса TextureMaterial:

public class TextureMaterial
{
    // Текстура
    Texture2D texture;

    // Блок UV текстуры
    Vector2 uvTile;

    // Свойства
    public Texture2D Texture
    {
        get { return texture; }
        set { texture = value; }
    }

    public Vector2 UVTile
    {
        get { return uvTile; }
        set { uvTile = value; }
    }

    public TextureMaterial(Texture2D texture, Vector2 uvTile)
    {
        this.texture = texture;
        this.uvTile = uvTile;
    }
}

Вы храните текстуру как Texture2D XNA в атрибуте texture класса TextureMaterial, и блок UV текстуры как Vector2 XNA в атрибуте uvTile класса. Как и в классе LightMaterial, вам надо создать свойства для установки и получения текстуры и ее блока UV.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz