Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

OpenGL не хочет рисовать на битмапе [D7, XP]


Страницы:   1 2

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, созданный приложением.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо