Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.16;
Скачать: CL | DM;

Вниз

Как пользоваться SetGammaRamp   Найти похожие ветки [D3D8]

 
ГеорГ   (2005-06-05 03:54) [0]

Делаю так:

procedure Gamma;
var
NewGamma: TD3DGammaRamp;
begin
D3DDevice8.GetGammaRamp(NewGamma);
D3DDevice8.SetGammaRamp(0, NewGamma);
end;

То есть даже ничего не меняю, но экран чернеет и все! Точно не виснет, и точно видеокарта поддерживает гамму...
Скажите пожалуйста!


 
XProger ©   (2005-06-05 04:51) [1]

D3DDevice8.SetGammaRamp(DDSGR_CALIBRATE, NewGamma);
И вообще, что обе функции в качестве результата возвращают?


 
ГеорГ   (2005-06-05 05:47) [2]

Пробовал передавать флаги 0 и 1 - одинаково. А функции ничего не возвращают, это процедуры! Что же может быть?


 
ГеорГ   (2005-06-05 05:51) [3]

Кстати, пробовал на двух видеокартах: на Радионе 8500 и Гефорсе 4 Ti 4200


 
ГеорГ   (2005-06-05 18:59) [4]

Ну подкиньте пример!


 
lyeh ©   (2005-06-06 13:01) [5]

Метод из нашего движка:

procedure RS_SetGammaRamp(Value: Single);

 procedure Process(var Entry: Word; Value: Integer);
 begin
   if (Value < 0) then
     Value := 0
   else
     if (Value > 65535) then
       Value := 65535;

   Entry := Value;
 end;

var
 I: Byte;
 NewValue: Integer;
 Gamma: TD3DGammaRamp;
begin
 NewValue := Round(255 * Value);

 for I := 0 to 255 do
 begin
   Process(Gamma.green[I], I * NewValue);
   Process(Gamma.blue[I], I * NewValue);
   Process(Gamma.red[I], I * NewValue);
 end;

 with RS do
   D3DDevice8.SetGammaRamp(Byte((D3DCaps8.Caps2 and D3DCAPS2_CANCALIBRATEGAMMA) = D3DCAPS2_CANCALIBRATEGAMMA), Gamma);
end;

D3DDevice8 - IDirect3DDevice8
D3DCaps8 - TD3DCaps8


 
lyeh ©   (2005-06-06 13:19) [6]

То со старого, а здесь еще и с проверкой

function RS_SetGammaRamp(Value: Single): Boolean;

 procedure Process(var Entry: Word; Value: Integer);
 begin
   if (Value < 0) then
     Value := 0
   else
     if (Value > 65535) then
       Value := 65535;

   Entry := Value;
 end;

var
 I: Byte;
 J: Integer;
 NewValue: Integer;
 Gamma: TD3DGammaRamp;
begin
 with RS do
 begin
   Result := ((D3DCaps8.Caps2 and D3DCAPS2_FULLSCREENGAMMA) = D3DCAPS2_FULLSCREENGAMMA);
   if (not Result) then
     Exit;

   NewValue := Round(255 * Value);

   for I := 0 to 255 do
   begin
     J := I * NewValue;
     if (J < 0) then
       J := 0
     else
       if (J > 65535) then
         J := 65535;

     Process(Gamma.green[I], J);
     Process(Gamma.blue[I], J);
     Process(Gamma.red[I], J);
   end;

   D3DDevice8.SetGammaRamp(Byte((D3DCaps8.Caps2 and D3DCAPS2_CANCALIBRATEGAMMA) = D3DCAPS2_CANCALIBRATEGAMMA), Gamma);
 end;  
end;


 
lyeh ©   (2005-06-06 13:23) [7]

Кстати, только сейчас заметил :)
Надо так:

убрать метод Process

Gamma.green[I] := J;
Gamma.blue[I] := J;
Gamma.red[I] := J;


 
ГеорГ   (2005-06-06 19:37) [8]

так работает


 
Sapersky   (2005-06-07 11:24) [9]

Т.е., получается, цвета нужно задавать в диапазоне 0..65535. А GetGammaRamp возвращает 0..255.
Ну, мелкософт, @#$%^&! :)

Кстати, более "правильная" формула гаммы из FastLIB (хотя на D3D ещё не пробовал):

Gamma.red[0] := 0; Gamma.green[0] := 0; Gamma.blue[0] := 0;
y:=1 / Value; // Value = 1 - норма
for I := 1 to 255 do begin
 J := Round(65535 * Exp( y * Ln(i/255) ) );
ну и далее как в [6,7]


 
lyeh ©   (2005-06-07 14:54) [10]

2 Sapersky

> Ну, мелкософт, @#$%^&! :)

А то! :)



Страницы: 1 вся ветка

Текущий архив: 2005.10.16;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.05 c
5-1103275206
VIS
2004-12-17 12:20
2005.10.16
Свойство фонт в меню


2-1127322112
quadronik
2005-09-21 21:01
2005.10.16
логотип при загрузке программы


6-1118762188
Dima__
2005-06-14 19:16
2005.10.16
работа с сокетами без создания формы


5-1102660811
Denis_Ac
2004-12-10 09:40
2005.10.16
Изменение размеров потомка TCustomGroupBox


14-1127141196
Zeqfreed
2005-09-19 18:46
2005.10.16
Блок питания