![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
OpenGL не хочет рисовать на битмапе [D7, XP]
Evgnevius © (2009-11-16 18:55:00)Подскажите, почему OpenGL на холсте формы рисует, а когда передаю в качестве контекста холст битмапа - ничего не происходит. Почему? Как решить эту проблему? Вроде и
PFD.dwFlags в PFD_DRAW_TO_BITMAP устанавливаю и
Bmp.PixelFormat ставлю в pf24bit...
а всё равно сплошным белым цветом...
Помогите.
(2009-11-18 12:38:00) [1]Удалено модератором
Примечание: Offtopic
(2009-11-18 12:35:00) [2]Удалено модератором
Примечание: Offtopic
Германн (2009-11-18 01:48:00) [3]Удалено модератором
Примечание: Offtopic
Evgnevius (2009-11-18 00:49:00) [4]Премного благодарен!
Рррработает!
Григорьев Антон (2009-11-17 22:21:00) [5]Вот обещанный код. На форме лежит одна кнопка и обработчик на ней. Универсальная процедура SetDCPixelFormat работает как с экраном, так и с битмапами, причём даже с теми, у которых есть палитра.
procedure SetDCPixelFormat(DC:THandle;var Palette:HPalette;ToBitmap:Boolean);
var hHeap:THandle;
nColors,I:Integer;
lpPalette:PLogPalette;
byRedMask,byGreenMask,byBlueMask:Byte;
nPixelFormat:Integer;
pfd:TPixelFormatDescriptor;
begin
FillChar(pfd,SizeOf(pfd),0);
with pfd do
begin
nSize:=sizeof(pfd);
nVersion:=1;
if ToBitmap then
dwFlags:=PFD_DRAW_TO_BITMAP or PFD_GENERIC_ACCELERATED or PFD_SUPPORT_OPENGL
else
dwFlags:=PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
iPixelType:=PFD_TYPE_RGBA;
cColorBits:=24;
cDepthBits:=32;
iLayerType:=PFD_MAIN_PLANE
end;
nPixelFormat:=ChoosePixelFormat(DC,@pfd);
SetPixelFormat(DC,nPixelFormat,@pfd);
DescribePixelFormat(DC,nPixelFormat,SizeOf(TPixelFormatDescriptor),pfd);
if (pfd.dwFlags and PFD_NEED_PALETTE) <> 0 then
begin
nColors:= 1 shl pfd.cColorBits;
hHeap:=GetProcessHeap;
lpPalette:=HeapAlloc(hHeap,0,SizeOf(TLogPalette)+(nColors*SizeOf(TPaletteEntry)));
lpPalette^.palVersion:=$300;
lpPalette^.palNumEntries:=nColors;
byRedMask:=1 shl pfd.cRedBits-1;
byGreenMask:=1 shl pfd.cGreenBits-1;
byBlueMask:=1 shl pfd.cBlueBits-1;
for I:=0 to nColors-1 do
begin
lpPalette^.palPalEntry[I].peRed:=(((I shr pfd.cRedShift) and byRedMask)*255) div byRedMask;
lpPalette^.palPalEntry[I].peGreen:=(((I shr pfd.cGreenShift) and byGreenMask)*255) div byGreenMask;
lpPalette^.palPalEntry[I].peBlue:=(((I shr pfd.cBlueShift) and byBlueMask)*255) div byBlueMask;
lpPalette^.palPalEntry[I].peFlags:= 0
end;
Palette:=CreatePalette(lpPalette^);
HeapFree(hHeap,0,lpPalette);
if Palette<>0 then
begin
SelectPalette(DC,Palette,False);
RealizePalette(DC)
end
end
end;
procedure TForm1.Button1Click(Sender: TObject);
var Pict:TBitmap;
hrc:HGLRC;
Palette:HPalette;
Obj:GLUQuadricObj;
begin
Pict:=TBitmap.Create;
Palette:=0;
try
Pict.Width:=200;
Pict.Height:=200;
Pict.PixelFormat:=pf24bit;
SetDCPixelFormat(Pict.Canvas.Handle,Palette,True);
hrc:=wglCreateContext(Pict.Canvas.Handle);
wglMakeCurrent(Pict.Canvas.Handle,hrc);
glViewport(0,0,Pict.Width,Pict.Height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(30,1,0.5,100);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
gluLookAt(0,-4.5,3.5,0,0,0,0,0,1);
glClearColor(1,1,1,1);
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLightModelI(GL_Light_Model_Two_Side,1);
glEnable(GL_COLOR_MATERIAL);
glColor4F(0.7,0.3,0.5,0.9);
Obj:=gluNewQuadric;
gluCylinder(Obj,1.4,0.8,1.2,20,20);
gluDeleteQuadric(Obj);
glFinish;
glFlush;
wglMakeCurrent(0,0);
wglDeleteContext(hrc);
Canvas.Draw(10,10,Pict)
finally
DeleteObject(Palette);
Pict.Free
end
end;
Надеюсь, из этого примера вы извлечёте всё, что нужно.
_ (2009-11-17 15:05:00) [6]Сага о X, Y, Z. ;)
Evgnevius (2009-11-17 15:03:00) [7]Леонид Трояновский, я очень рад, что вы - опытный специалист и мудрый программист, но простых вещей вы не понимаете.
Мне не надо менять то, что уже отлажено. Я задал простой вопрос и хочу на него получить простой ответ. А там, где вы принялись искать ошибки - их нет. Приложение включает в себя около 70 плагинов и все они успешно справляются с задачей по отрисовки битмапа. Не один из них просто не использует OpenGL. А хотелось бы...
Простите за резкий тон.
Leonid Troyanovsky (2009-11-17 14:53:00) [8]
> Evgnevius © (17.11.09 14:40) [24]
> Какая разница, как передаётся битмап в библиотеку?
Ну, если разница неочевидна, то зачем менять то,
что что отлажено уже сотнями билдов?
> однако, большинство из них не на Делфи. А те, которые на
> Делфи либо не компилируются либо просто не работают.
Ну, тут все просто: надо нанять программиста.
--
Regards, LVT.
_ (2009-11-17 14:42:00) [9]
> через одинарную ссылку или через двойную
Я об этом же.
Класс - это и есть ссылка. А если сделать ссылку на него.
То будет двойной посыл.
Evgnevius (2009-11-17 14:40:00) [10]Какая разница, как передаётся битмап в библиотеку? Я понимаю, что вы хотите помочь и ищите недостатки в самой программе. Однако, всё работает нормально, и мне не хотелось бы дискутировать по поводу того, что отлажено уже сотнями билдов. Я просто хочу нанести изображение, созданное при помощи OpenGL, на битмап без всяких окон. И знаю, что это можно, потому что есть разные примеры в сети, однако, большинство из них не на Делфи. А те, которые на Делфи либо не компилируются либо просто не работают.
Повторю: я создал тестовое приложение, где вначале я пытаюсь рисовать на битмапе, а потом смотрю результат. Результата пока нет.
DVM (2009-11-17 14:31:00) [11]
> Evgnevius © (17.11.09 14:12) [20]
> TBitmap из Windows - это вообще не класс, а запись.
я потому и уточнил, мало ли какое недопонимание.
Если речь идет о именно классе TBitmap то его все же лучше не передавать в DLL. RTTI разные как уже сказали. Но как ни странно даже неправильно оно работать будет. Но до поры до времени, ибо порочная практика изначально.
Григорьев Антон (2009-11-17 14:28:00) [12]Вы думаете, для DLL есть разница получить ли TBitmap приложения через одинарную ссылку или через двойную, если с точки зрения DLL это всё равно не TBitmap?
Leonid Troyanovsky (2009-11-17 14:27:00) [13]
> Evgnevius © (17.11.09 14:12) [20]
> на область, где эти данные хранятся. Но разговор-то здесь
> не о том.
Как раз, об этом и говорили, о серьезной ошибке.
--
Regards, LVT.
Evgnevius (2009-11-17 14:12:00) [14]Вообще, объект - это указатель на область оперативной памяти, и когда мы передаём его в качестве параметра в процедуру, то передаются не все его многотонные данные, а только ссылка на область, где эти данные хранятся. Но разговор-то здесь не о том.
>TBitmap который из Graphics или TBitmap который из Windows?
TBitmap из Windows - это вообще не класс, а запись.
>FastDIB и др. почему не используете?
А что такое FastDIB и каковы его возможности? Он может заменить OpenGL?
Leonid Troyanovsky (2009-11-17 13:52:00) [15]
> _ (17.11.09 13:42) [17]
> Вообще то, TBitmap и есть указатель.
Во-ще-то, TBitmap это класс (aka class), AFAIK.
--
Regards, LVT.
_ (2009-11-17 13:43:00) [16]
> для увеличения скорости построения изображения использовать
> OpenGL
FastDIB и др. почему не используете?
Или они медленные?
_ (2009-11-17 13:42:00) [17]Вообще то, TBitmap и есть указатель.
Leonid Troyanovsky (2009-11-17 13:40:00) [18]
> Evgnevius © (17.11.09 13:31) [14]
> маленький секрет: мы передаём в библиотеку не сам битмап,
> а указатель типа Pointer, который хранит в себе ссылку
> на TBitmap, созданный приложением.
Откровенность - за откровенность: что сова о пень, что пнем о сову,
все равно, не жить сове.
--
Regards, LVT.
DVM (2009-11-17 13:35:00) [19]
> Evgnevius ©
TBitmap который из Graphics или TBitmap который из Windows?
Evgnevius (2009-11-17 13:31:00) [20]
> > В библиотеку приходит указатель на TBitmapА вот это уже
> серьёзная ошибка проектирования....
Григорьев Антон, проект, которым я занимаюсь, разрабатывается уже 3 года. За всё время его проектирования никаких проблем с передачей ссылки на битмап в библиотеку не было. Программа рабочая в том виде, в котором она есть сейчас, просто захотелось в в ряде случаев для увеличения скорости построения изображения использовать OpenGL, а то совсем долго считает... Открою маленький секрет: мы передаём в библиотеку не сам битмап, а указатель типа Pointer, который хранит в себе ссылку на TBitmap, созданный приложением.