![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как пользоваться SetGammaRamp [D3D8]
ГеорГ © (2005-06-05 03:54:00)Делаю так:
procedure Gamma;
var
NewGamma: TD3DGammaRamp;
begin
D3DDevice8.GetGammaRamp(NewGamma);
D3DDevice8.SetGammaRamp(0, NewGamma);
end;
То есть даже ничего не меняю, но экран чернеет и все! Точно не виснет, и точно видеокарта поддерживает гамму...
Скажите пожалуйста!
lyeh (2005-06-07 14:54:00) [1]2 Sapersky
> Ну, мелкософт, @#$%^&! :)
А то ! :)
Sapersky (2005-06-07 11:24:00) [2]Т.е., получается, цвета нужно задавать в диапазоне 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]
ГеорГ (2005-06-06 19:37:00) [3]так работает
lyeh (2005-06-06 13:23:00) [4]Кстати, только сейчас заметил :)
Надо так:
убрать метод Process
Gamma.green[I] := J;
Gamma.blue[I] := J;
Gamma.red[I] := J;
lyeh (2005-06-06 13:19:00) [5]То со старого, а здесь еще и с проверкой
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:01:00) [6]Метод из нашего движка:
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
ГеорГ (2005-06-05 18:59:00) [7]Ну подкиньте пример!
ГеорГ (2005-06-05 05:51:00) [8]Кстати, пробовал на двух видеокартах: на Радионе 8500 и Гефорсе 4 Ti 4200
ГеорГ (2005-06-05 05:47:00) [9]Пробовал передавать флаги 0 и 1 - одинаково. А функции ничего не возвращают, это процедуры! Что же может быть?
XProger (2005-06-05 04:51:00) [10]D3DDevice8.SetGammaRamp(DDSGR_CALIBRATE, NewGamma);
И вообще, что обе функции в качестве результата возвращают?