Rambler's Top100

 GDsW - Game Developer's World    

.: Использования функции Gamma Control для плавного затенения :.


Использования функции Gamma Control для плавного затенения
Итак, как можно использовать функцию Gamma Control, которая включена в DirectDraw, чтобы cделать постепенное затемнение?  Имеются две превосходные причины причины, сделать затенение через Gamma. Первая, это -- простота, и вторая - это то, что используя Gamma затемнение, Вы не теряете информацию на первичной поверхности.

Теперь , когда мы уточнились со способом производства затенения необходимо учесть несколько вещей перед выполнением этого метода. Первое условия для выполнения затенения: Ваша поверхность должна быть 16 или более битной. Вторая: затенение может быть должно работать только в FullScreen режиме на Вашей первичной поверхности, так как Вы манипулируете видеоустановками гаммы вашей видеокарты. 

Давайте переходить к делу. В библиотеке Direct Draw библиотеку имеется структура по имени DDGAMMARAMP состоящая из трех 256-мерных массивов типа WORD. Эти массивы называются соответственно Красный, Зеленый и Синий. Выглядит это все вот таким образом: 

typedef struct DDGAMMARAMP {

WORD red[256];
WORD green[256];
WORD blue[256];

} DDGAMMARAMP, FAR * LPDDGAMMARAMP;


Эта структура хранит все текущие установки гаммы видеокарты. Для начала работы, давайте объявим несколько переменных.

// Инициализировать gamma control
LPDIRECTDRAWGAMMACONTROL lpDDGammaControl = NULL; 

// Эта структура будет содержать новые значения гаммы, которые мы будем менять
DDGAMMARAMP DDGammaRamp; 

// Эта структура будет содержать старые значения гаммы
DDGAMMARAMP DDGammaOld; 


Теперь , когда Мы объявили массивы, мы должны выяснить, поддерживает ли наша видеокарта интерфейс Gamma Control (если Ваша видеокарта не поддерживает Gamma Control аппаратно, DirectDraw будет эмулировать его программно). Далее следует запрос основной поверхности: 

lpddsprimary->QueryInterface(IID_IDirectDrawGammaControl,(void **)&lpDDGammaControl); 

Затем мы должны сохранить текущие установки гаммы Вашей видеокарточки в нашей структуре DDGAMMAOLD: 

lpDDGammaControl->GetGammaRamp(0, &DDGammaOld); 

Повторяем тоже самое, но теперь уже передаем значения в нашу структуру DDGAMMARAMP: 

lpDDGammaControl->GetGammaRamp(0, &DDGammaRamp); 

Далее идет код реализации плавного затухания. С первого взгляда кажется что правильно было бы постепенно снижать значения каждой ячейки, после чего передавать данные в DirectX. Но дело в том что, в таком случае процесс затухания затянулся бы на неопределенное время (тем не менее Вы можете сами экспериментировать с этими параметрами). Для наиболее быстрого решения лучше использовать обнуление элемента.

for(int blackloop=0;blackloop<256;blackloop++) 
{

    // Мы должны уменьшать значение пока оно больше чем 0
    if(DDGammaRamp.red[blackloop] > 0) 
    {
        // Установить текущее значение DDGammaRamp.Red в 0.
        DDGammaRamp.red[blackloop]=0; 
        // Теперь активируем изменения
        lpDDGammaControl->SetGammaRamp(0, &DDGammaRamp); 
    }


    // скорость выполнения очень велика, необходимо несколько замедлить
    Sleep(1); // Мы должны уменьшать значение пока оно болше чем 0


    if(DDGammaRamp.green[blackloop] > 0) 
    {
        // Установить текущее значение DDGammaRamp.green в 0.
        DDGammaRamp.green[blackloop]=0; 
        lpDDGammaControl->SetGammaRamp(DDSGR_CALIBRATE, &DDGammaRamp);
    }


    // скорость выполнения очень велика, необходимо несколько замедлить
    Sleep(1);

    // Установить текущее значение DDGammaRamp.blue в 0.
    if(DDGammaRamp.blue[blackloop] > 0) 
    {
        //set the current value of DDGammaRamp.Blue to 0.
        DDGammaRamp. blue [blackloop]=0; 
        lpDDGammaControl->SetGammaRamp(DDSGR_CALIBRATE, &DDGammaRamp);
    }

    // скорость выполнения очень велика, необходимо несколько замедлить
    Sleep(1);

}

Теперь , когда постепенное изменение (fade) закончено, мы должны восстановить все старые значения гаммы, поскольку остальная часть вашей игры продолжается, или наш экран останется черным.

lpDDGammaControl->SetGammaRamp(0, &DDGammaOld); 

Возможно бесконечное множество применения Gamma Control, можно высвечивать экран красным, когда ваш игрок получает повреждения, зеленым, когда он плавает в ядовитой воде, синим, если он тонет. Незначительные изменения кода позволят Вам сделать проявление экрана, но это Вы уже можете сделать сами.........

 

главная ] Общеигровые статьи на GDsW ] DirectX ] Статьи по графике ] Статьи по AI ] Юмор ]

 

.: Использования функции Gamma Control для плавного затенения :.

Rambler's Top100 Рейтинг@Mail.ru List.ru - каталог ресурсов интернет Белорусский каталог BelResource

Copyright IRsoft, web-master Keeper. All rights reserved!

Хостинг от uCoz