-
Пробовал использовать флаг PFD_DRAW_TO_WINDOW при установке формата пикселя -не помогает :(
-
Задачу объясни.
-
хмм, интересно... а можно рендерить в TBitmap без создания окна ?
-
> [2] DevilDevil (27.10.07 13:34)
Можно рендерить в FrameBuffer или в PBUffer, без создания окна, вроде. Только Device Context все равно создавать придется.
-
а где-нибудь есть статейка/примерчик ?
-
Примером не помогу. Практически это не реализовывал никогда. Суть в том, что DC получаешь не от окна, а свое создаешь, вот и все. И RC соответственно от полученного DC делаешь. Ну а потом просто рендеришь в буффер как обычно.
-
@!!ex
Как раз такая задача и стоит. Рендерить не в экранный буфер а в битмап. Правда DC я брал так Bmp.Canvas.Handle, наверное неправильно.
-
> [6] Unknown user © (29.10.07 10:14)
Низя. Если нужно получить копию в битмапе - рендерь в буффер, а потом получай экран в массив с помощью glReadPixels. Ну а массив засунуть в битмап - не проблема.
-
> [7] @!!ex © (29.10.07 10:30) > Если нужно получить копию в битмапе - рендерь в буффер, > а потом получай экран в массив с помощью glReadPixels. Ну > а массив засунуть в битмап - не проблема.
Итого 2 преоразования, фвктически перегона по шине видеокрты… В дерикс можно сразу на любую плоскость рендирить…
-
> [8] homm © (29.10.07 21:44)
Вроде говорят в OGL тоже можно, только как то через *****.
-
>Если нужно получить копию в битмапе - рендерь в буффер, а потом получай экран в массив с помощью glReadPixels
спасибо, попробую.
> Вроде говорят в OGL тоже можно, только как то через *****.
Выяснить бы еще как это сделать :( имеется ведь флаг PFD_DRAW_TO_WINDOW для установки формата пикселя. я думаю, главная проблема здесь получить правильный DC. Подозреваю, что надо использовать CreateCompaitableDC и создавать DIB секцию средствами WinAPI. Кто знает, отзовитесь.
-
>Если нужно получить копию в битмапе - рендерь в буффер, а потом получай экран в массив с помощью glReadPixels
есть одна проблема при использовании такого метода. при помощи glReadPixels можно получить копию экранного буфера с разрешением соответствующим экранному, но, к примеру, для печати я хочу иметь картинку с разрешением принтера. в этом случае glReadPixels не поможет.
-
> [11] Unknown user © (30.10.07 12:17)
Хм. Вроде glReadPixels умеет читать с разрешением буффера, в который рендерится картинка. Соответственно если картинка рендерится в буфер с большим разрешением, то и glReadPixels поддерживает большое разрешение.
-
>Хм. Вроде glReadPixels умеет читать с разрешением буффера, в который >рендерится картинка. Соответственно если картинка рендерится в буфер с >большим разрешением, то и glReadPixels поддерживает большое разрешение.
а если мне надо разрешение 6000х6000 пикс.? какая видеокарта поддерживает такое разрешение?
-
-
> Для Direct3D, но можно, наверное, и в OGL сделать по тому же принципу.
Да, это и есть рендер в битмап который я как раз и хочу заставить работать. Кто нибудь объясните мне как пользоваться флагом PFD_DRAW_TO_BITMAP при установке формата пикселя?
-
поделюсь результатами своих экспериментов
Binf.bmiHeader.biSize:=SizeOf(TBitmapInfoHeader);
Binf.bmiHeader.biWidth:=500;
Binf.bmiHeader.biHeight:=500;
Binf.bmiHeader.biPlanes:=1;
Binf.bmiHeader.biBitCount:=24;
Binf.bmiHeader.biCompression:=BI_RGB;
Binf.bmiHeader.biSizeImage:=Binf.bmiHeader.biWidth*Binf.bmiHeader.biHeight*3;
DC:=GetDC(Handle);
Dib:=CreateDIBSection(DC, BInf, DIB_RGB_COLORS, Bits, 0, 0);
ReleaseDC(Handle, DC);
FDC:=CreateCompatibleDC(0);
SelectObject(FDC, Dib);
pfd.nSize:=Sizeof(TPixelFormatDescriptor);
pfd.nVersion:=1;
pfd.dwFlags:=PFD_DRAW_TO_BITMAP or PFD_SUPPORT_OPENGL or PFD_SUPPORT_GDI;
pfd.iPixelType:=PFD_TYPE_RGBA;
pfd.cColorBits:=24;
pfd.cDepthBits:=16;
pfd.iLayerType:=PFD_MAIN_PLANE;
nPixelFormat:=ChoosePixelFormat(FDC,@pfd);
SetPixelFormat(FDC, nPixelFormat, @pfd);
этот код работает, SetPixelFormat возвращает true. но если вместо SelectObject(FDC, Dib) поставить SelectObject(FDC, Bitmap.Handle) - где Bitmap переменная типа TBitmap - уже не срабатывает.
-
> но если вместо SelectObject(FDC, Dib) поставить SelectObject(FDC, > Bitmap.Handle) - где Bitmap переменная типа TBitmap
Покажи весь код. Может ты не указываешь размеры, или стоит картинку DIB формата подсунуть.
-
Всем спасибо, разобрался. Забыл установить глубину цвета для битмапа. Вот рабочий код для рендеринга в битмап, пользуйтесь. FDC используется дальше для получения контекста рендеринга OGL а процедуру рисовки менять не нужно (разве что установку параметров вида под размеры битмапа а не клиентской области окна).
Bitmap.Pixelformat:=pf24bit;
FDC:=CreateCompatibleDC(0);
SelectObject(FDC, Bitmap.Handle);
pfd.nSize:=Sizeof(TPixelFormatDescriptor);
pfd.nVersion:=1;
pfd.dwFlags:=PFD_DRAW_TO_BITMAP or PFD_SUPPORT_OPENGL or PFD_SUPPORT_GDI;
pfd.iPixelType:=PFD_TYPE_RGBA;
pfd.cColorBits:=24;
pfd.cDepthBits:=16;
pfd.iLayerType:=PFD_MAIN_PLANE;
nPixelFormat:=ChoosePixelFormat(FDC,@pfd);
SetPixelFormat(FDC, nPixelFormat, @pfd);
-
вот нарисовали мы в битмап..
а как дальше в файл например это сохранить? у меня при попытке сохранения вылезает икзепшен "нехватает ресурсов системы"
-
А можно полностью рабочий пример?
-
> [20] Demi (19.01.10 17:50)
Возникли трудности в реализации?
-
Есть просто уже готовая прога, как здесь написано заменил PixelFormat. В итоге не рисуется..
-
Тут я помочь не смогу, не имею готового кода.
|