Форум: "Игры";
Текущий архив: 2005.10.16;
Скачать: [xml.tar.bz2];
ВнизКак пользоваться 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.039 c