ЧТО Я ПЫТАЮСЬ СДЕЛАТЬ
Я пытаюсь нарисовать несколько графиков в Timage. Эти рисунки, которые я рисую, состоят из упорядоченных слоев с Foodfills и линиями. Я использую несколько буферов для обеспечения упорядочения и двойной буферизации.
ЧТО Я ДЕЛАТЬ
procedure DrawScene();
var
ObjLength,LineLength,Filllength,Obj,lin,angle,i:integer;
Npoints : array[0..1] of Tpoint;
Objmap:TBitmap;
wholemap:TBitmap;
begin
wholemap := TBitmap.Create;
wholemap.Width:=area;
wholemap.height:=area;
ObjLength:=length(Objects);
for Obj:=0 to (ObjLength-1) do
if objects[Obj].Visible then
begin
// create object bitmap
if Objects[obj].Tag='FBOX' then
begin
Objmap := TBitmap.Create;
Objmap.Width:=area;
Objmap.height:=area;
Objmap.Transparent:=true;
Objmap.Canvas.Rectangle((objects[obj].Boundleft-4)+objects[obj].Position.x,area-((objects[obj].boundtop+4)+objects[obj].Position.y),(objects[obj].boundright+4)+objects[obj].Position.x,area-((objects[obj].boundbottom-4)+objects[obj].Position.y));
end;
//draw object
LineLength:=length(objects[Obj].Lines)-1;
angle:=objects[Obj].Rotation;
for lin:=0 to (LineLength) do
begin
for i:=0 to 1 do
begin
Npoints[i] := PointAddition(RotatePoint(objects[obj].Lines[lin].Point[i],angle),objects[obj].Position,false);
end;
Objmap:=DrawLine(Npoints[0].x,Npoints[0].y,Npoints[1].x,Npoints[1].y,objects[obj].Lines[lin].Color,Objmap);
end;
Filllength:=length(objects[Obj].Fills)-1;
for i:=0 to Filllength do
begin
Npoints[0]:=PointAddition(RotatePoint(objects[Obj].Fills[i].Point,objects[Obj].Rotation),objects[Obj].Position,false);
Objmap:=fillpoint( Npoints[0].x, Npoints[0].y,objects[Obj].Fills[i].color,Objmap);
end;
//write object to step frame
wholemap.Canvas.Draw(0,0,Objmap);
Objmap.Free;
end;
// write step frame to Visible Canvas
mainwindow.bufferim.Canvas.Draw(0,0,wholemap);
mainwindow.RobotArea.Picture.Graphic:=mainwindow.bufferim.Picture.Graphic;
wholemap.Free;
end;
ЧТО Я ОЖИДАЮ
Я ожидаю увидеть, что каждый объект изображения наложен один на другой, причем каждый слой изображения будет полным изображением для этого слоя. В моем примере это робот с флагом за ним. сначала рисуется флаг, а затем робот.
ЧТО Я ПОЛУЧАЮ (на ПК)
на компьютере я получаю то, что ожидаю, и все кажется правильным.
ЧТО Я ПОЛУЧАЮ (на ноутбуке)
Почти на каждом ноутбуке и некоторых компьютерах я вижу только робота. Я добавил несколько статей, чтобы увидеть, рисует ли он флаг, и он это делает. игра может даже правильно взаимодействовать с флагом. Дальнейшее расследование показало мне, что это показывало только последнее изображение, нарисованное моей "сценой прорисовки", и когда изображения были нарисованы непосредственно на весь холст, все появлялось (это не может быть сделано из-за перекрывающихся слоев заливки)
ЧТО Я ДУМАЮ, ПРОИСХОДИТ
Итак, я пришел к выводу, что свойство Timage.transparent для Timage не работает или вычисляется по-другому на некоторых машинах ..
Я сделал тест, чтобы доказать это, и сделал холст красным. затем на этом холсте я нарисовал 0,0 i Timage со свойством transparent = true с одной точкой посередине на красном холсте. Результатом был белый холст с точкой посередине.
Я предполагаю, и результаты показывают, что машины с очень простыми графическими драйверами, похоже, рассматривают нулевой или прозрачный как белый, тогда как более мощные машины, кажется, рассматривают нулевой или прозрачный как прозрачный.
это похоже на провал из-за того, что свойство Timage.Transparent было истинным.
РЕДАКТИРОВАТЬ: ОБНОВЛЕНИЕ !!! Похоже, что на видеокартах ATI, если цвет «нулевой», то он интерпретируется в формате PF24bit и, следовательно, без альфа-канала и без прозрачности.
на картах Nvidia он принимает его как PF32bit и рассматривает null как прозрачный.
очевидный способ обойти это - установить для типа растрового изображения значение PF32bit, но это по-прежнему не работает. Затем я предположил, что, возможно, этого недостаточно, и я должен убедиться, что фон установлен на прозрачный, а не оставлен равным нулю ... но нет инструментов (которые я вижу) внутри Timage для установки цвета с альфа-каналом. для всех функций рисования холста требуется Tcolor, который является 24-битным RGB, и только TcolorRef с 32-битным RGBA подойдет .... есть ли способ рисования с альфа-0?
ЧТО, Я ДУМАЮ, НУЖНО ЗНАТЬ
Как заставить свойство Transparent работать на всех машинах, или способ заставить ноутбуки не вставлять прозрачные как белые, Или способ добиться того же результата.
У кого-нибудь есть решения или идеи?