-
Подскажите пожалуйста, в какую сторону примерно смотреть, чтобы осуществить наложение эффекта увеличительного стекла на Canvas, в котором успешно сформирована GL-сцена? Сцена без текстур, меняется динамически.
-
-
Ты сам то ходил по этим ссылкам?
Мне не надо готовой программы, просто примерный порядок действий.
Щас нашел (сам а не по этой <вырезано цензурой> ссылке) у Sulaco Render To Image, буду пробовать генерить из сцены текстуру и накладывать ее на шарик.
-
Ходил. И находил описания алгоритмов. Но ты же вроде просил подсказать, "в какую сторону примерно смотреть"? Тогда я дал ответ более чем, нефиг капризничать и обижаться.
-
Тебе похоже проще писать отповеди и корчить крутого перца, чем написать пару слов по порядок действий, возможно сообщение получилось бы короче. Ну что же, у всех свои приоритеты. Только это не очень конструктивно.
-
> [4] Vemer © (18.01.09 10:09)
Ты что кипятишься? Сам-то как видешь ответ на свой вопрос? Ты хотел сразу решение твоей задачи что ли? или всеж в какую сторону(примерно) смотреть?
-
-
Спасибо за ссылку. Краснова я читал, но там наноситься картинка на шар а не динамичное изображение. glCopyTexImage2D вроде решает проблему.
Возможное решение (примерно то, что я хотел услышать, но нашел сам):
1. Рендерим картинку. 2. С помощью glCopyTexImage2D генерим из нее текстуру. 3. Рисуем шарик. 4. Наносим текстуру на шарик.
Или есть более простой механизм?
Попутный вопрос - есть активные сайты-форумы где можно выкладывать - обмениваться опытом по OpenGL-Delphi6. Просто поиск выдает кучу форумов, но регистриться на всех для проверки их работоспособности просто нереально.
-
> но там наноситься картинка на шар а не динамичное изображение. Маски пробовал? > Попутный вопрос - есть активные сайты-форумы где можно выкладывать - > обмениваться опытом по OpenGL-Delphi6. http://igdc.ru/ - Здравый сайт по разработке игр именно на Delphi. В основном пишут на OpenGL, а самое главное, что примечательно, доступны все исходники. :) http://mirgames.ru/ - Сайт игроделов и не только. Есть ещё много, но т.к. я на OpenGL не пишу, то и не интересуюсь.
-
Спасибо, Б!
-
Надеюсь, разберешься: type
TRGB = packed record
B, G, R: Byte;
end;
pRGB = ^TRGB;
function ILimit(Val, AMin, AMax: Integer): Integer;
begin
Result := Min(Max(Val, AMin), AMax);
end;
procedure Lens(Bitmap: TBitmap; xx, yy, Width, Height: Integer; Refraction: Double);
procedure find_projected_pos(Refraction, a, b, x, y: Double; projx, projy: pDouble);
var c, ri1, ri2, nxangle, nyangle, theta1, theta2: Double;
n: array [0..2] of Double;
begin
ri1 := 1.0;
ri2 := Refraction;
c := DMin(a, b);
n[0] := x;
n[1] := y;
n[2] := Sqrt((1 - x*x/(a*a) - y*y/(b*b))*(c*c));
nxangle := Cos(n[0]/Sqrt(n[0]*n[0] + n[2]*n[2]));
theta1 := PI/2 - nxangle;
theta2 := ArcSin(Sin(theta1)*ri1/ri2);
theta2 := PI/2 - nxangle - theta2;
projx^ := x - Tan(theta2)*n[2];
nyangle := ArcCos(n[1] / Sqrt(n[1]*n[1] + n[2]*n[2]));
theta1 := PI/2 - nyangle;
theta2 := ArcSin(Sin(theta1) * ri1/ri2);
theta2 := PI/2 - nyangle - theta2;
projy^ := y - Tan(theta2) * n[2];
end;
var row, col, scol, srow,
RegionWidth, RegionHeight, x1, y1, x2, y2: Integer;
px1, px2: pRGB;
dx, dy, xsqr, ysqr, a, b, asqr, bsqr, x, y: Double;
Bmp: TBitmap;
begin
x1 := Width div 2;
y1 := Height div 2;
x2 := xx + x1;
y2 := yy + y1;
if Refraction < 1 then Refraction := 1;
RegionWidth := x2 - x1;
a := RegionWidth / 2;
RegionHeight := y2 - y1;
b := RegionHeight / 2;
asqr := Sqr(a);
bsqr := Sqr(b);
Bmp := TBitmap.Create;
Bmp.PixelFormat := Bitmap.PixelFormat;
Bmp.Width := RegionWidth;
Bmp.Height := RegionHeight;
try
for col := 0 to RegionWidth - 1 do begin
dx := col - a + 0.5;
xsqr := Sqr(dx);
for row := 0 to RegionHeight - 1 do begin
dy := -(row - b) - 0.5;
ysqr := Sqr(dy);
px1 := Bmp.ScanLine[row];
Inc(px1, col);
if (ysqr < (bsqr - (bsqr*xsqr)/asqr)) then begin
find_projected_pos(refraction, a, b, dx, dy, @x, @y);
y := -y;
srow := Trunc(y + b);
srow := ILimit(srow, 0, Bitmap.Height - 1);
scol := Trunc(x + a);
scol := ILimit(scol, 0, Bitmap.Width - 1);
px2 := Bitmap.ScanLine[y1 + srow];
Inc(px2, x1 + scol);
px1^ := px2^;
end
else begin
px2 := Bitmap.ScanLine[y1 + row];
Inc(px2, x1 + col);
px1^ := px2^;
end;
end;
end;
Bitmap.Canvas.Draw(x1, y1, Bmp);
finally
Bmp.Free;
end;
end;
-
Ок, спасибо, поковыряюсь,, но я предпочитаю чтобы расчеты за меня OpenGL делал.
|