Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.01.10;
Скачать: [xml.tar.bz2];

Вниз

OpenGL не хочет рисовать на битмапе   Найти похожие ветки 

 
Evgnevius ©   (2009-11-16 18:55) [0]

Подскажите, почему OpenGL на холсте формы рисует, а когда передаю в качестве контекста холст битмапа - ничего не происходит. Почему? Как решить эту проблему? Вроде и
PFD.dwFlags в PFD_DRAW_TO_BITMAP устанавливаю и
Bmp.PixelFormat ставлю в pf24bit...
а всё равно сплошным белым цветом...
Помогите.


 
Amoeba ©   (2009-11-16 20:46) [1]


> почему OpenGL на холсте формы рисует, а когда передаю в
> качестве контекста холст битмапа - ничего не происходит

Так и должно быть. Не может OpenGL это делать, у него свой контекст для рисования.


 
Evgnevius ©   (2009-11-16 20:56) [2]

А как тогда можно это осуществить? Можно ведь как-то где-то нарисовать, а потом в битмап сохранить?


 
_   (2009-11-16 22:10) [3]


> А как тогда можно это осуществить? Можно ведь как-то где-
> то нарисовать, а потом в битмап сохранить?


Проще простого.
Выводи на форму, копируй с неё на DC Bitmap"а через BitBlt.


 
Evgnevius ©   (2009-11-16 22:24) [4]

> Выводи на форму, копируй с неё на DC Bitmap"а через BitBlt.
Это исключено. Никакой формы у меня нет. В библиотеку приходит указатель на TBitmap, на котором нужно рисовать. Что делать с изменённым битмапом, это уже дело приложения, которое отдало его на обработку в библиотеку.


 
_   (2009-11-16 22:34) [5]

На DC Bitmap"а рисовать нельзя.
Т.к. контекст постоянно теряется. Об этом, кстати, в книге Краснова в 1-й главе написано и пример есть.
Что за библиотека? Распиши в общем плане. А то как то всё не правильно...


 
Evgnevius ©   (2009-11-16 22:44) [6]

>Что за библиотека? Распиши в общем плане
Да не важно в принципе. Я создал тестовое приложение в котором создаётся битмап, далее я пытаюсь его просто залить синим цветом и вывести на форме (для просмотра). А вообще, конечно, чисто ради удовлетворения вашего любопытства могу сказать, что пишу графический редактор построенный по принципу библиотечных модулей (плагинов). А технология такова, что в плагин из приложения приходит ссылка на битмап, на котором эта библиотека должна что-нибудь нарисовать. Да хоть, просто залить его одним цветом. Как же такое можно провернуть? Люди ведь делают...


 
sniknik ©   (2009-11-16 23:10) [7]

> А технология такова, что в плагин из приложения приходит ссылка на битмап
пусть приходит ссылка на форму... трах тибедох © Хоттабыч.
так, сейчас работает?

> Как же такое можно провернуть? Люди ведь делают...
так и представляю нервного программиста с воспаленными после бессонных ночей глазами, мечущегося из угла в угол по комнате, и бормочащего себе под нос. "... люди ведь делают. как же это провернуть. так, успокоимся, тише тише вот хорошо, условия еще раз - на холсте формы рисует, на битмапе нет, форма да, битмап нет, форма рисует... вот, вот, мысль, почти уловил... черт сорвалось! на битмапе нет!!! (бьется в истерике)... ну как же это провернуть? люди ведь делают..."


 
Evgnevius ©   (2009-11-16 23:36) [8]

Весёлая картинка :) на самом деле, ночью я сплю.
Однако, если можете сказать, как это сделать, то ответьте, пожалуйста, а нет - спасибо за общение...


 
sniknik ©   (2009-11-16 23:41) [9]

> то ответьте, пожалуйста
а я разве не ответил?
> пусть приходит ссылка на форму...


 
Evgnevius ©   (2009-11-16 23:48) [10]

Спасибо, это не ответ. Мне нужно на битмапе, потому что переписывать приложение из 20 тыс. строк никто не собирается. Пожалуйста, если не знаете, лучше не пишите, а то только время тратиться - и моё и ваше. Ещё раз спасибо за предложенную помощь


 
sniknik ©   (2009-11-17 00:13) [11]

> Спасибо, это не ответ.
это ответ, то что он тебе не нравится, реальности не изменит... если для OpenGL нужна "оконная подложка" то хоть на миллионы строк кода ссылайся это ничего не изменит.

p.s. если нету, и неоткуда взять, то нужно создать.


 
Sapersky   (2009-11-17 00:29) [12]

Не нужно мешать битмапы (софтверный рендер) и OpenGL (главным образом интерфейс к аппаратным функциям видеокарты). Либо передаём битмап и рисуем вручную, либо заранее решаем, что всё будет рисоваться через OGL и передаём его контекст или как он правильно называется.
Даже есть получится заставить OGL рисовать в битмап - он будет делать это через софтверную эмуляцию, медленно и с ограниченной функциональностью.


 
Григорьев Антон ©   (2009-11-17 07:00) [13]

Странно читать всю эту ветку. Много раз рисовал с помощью OpenGL на bitmap"е и не испытывал никаких проблем. Навскидку не помню, как это делал, до своего кода доберусь только вечером. Но, кажется, там вся хитрость в том, что по умолчанию создаётся DDB-растр, а OpenGL рисует только на DIB. Попробуйте сразу после создания растра, ещё до установки Width и Height, сделать Bitmap.PixelFormat:=pf24bit. Если не поможет, вечером кину сюда свой код.

> В библиотеку приходит указатель на TBitmap

А вот это уже серьёзная ошибка проектирования. Между приложением и DLL нельзя передавать классы, так как у них разные RTTI, и поэтому TBitmap приложения - это совсем другой класс, нежели TBitmap DLL, и совместимы они лишь частично. Отсюда возможны самые разные неприятные эффекты.


 
Evgnevius ©   (2009-11-17 13:31) [14]


> > В библиотеку приходит указатель на TBitmapА вот это уже
> серьёзная ошибка проектирования....

Григорьев Антон, проект, которым я занимаюсь, разрабатывается уже 3 года. За всё время его проектирования никаких проблем с передачей ссылки на битмап в библиотеку не было. Программа рабочая в том виде, в котором она есть сейчас, просто захотелось в в ряде случаев для увеличения скорости построения изображения использовать OpenGL, а то совсем долго считает... Открою маленький секрет: мы передаём в библиотеку не сам битмап, а указатель типа Pointer, который хранит в себе ссылку на TBitmap, созданный приложением.


 
DVM ©   (2009-11-17 13:35) [15]


> Evgnevius ©

TBitmap который из Graphics или TBitmap который из Windows?


 
Leonid Troyanovsky ©   (2009-11-17 13:40) [16]


> Evgnevius ©   (17.11.09 13:31) [14]

> маленький секрет: мы передаём в библиотеку не сам битмап,
>  а указатель типа Pointer, который хранит в себе ссылку
> на TBitmap, созданный приложением.

Откровенность - за откровенность: что сова о пень, что пнем о сову,
все равно, не жить сове.

--
Regards, LVT.


 
_   (2009-11-17 13:42) [17]

Вообще то, TBitmap и есть указатель.


 
_   (2009-11-17 13:43) [18]


> для увеличения скорости построения изображения использовать
> OpenGL


FastDIB и др. почему не используете?
Или они медленные?


 
Leonid Troyanovsky ©   (2009-11-17 13:52) [19]


> _   (17.11.09 13:42) [17]

> Вообще то, TBitmap и есть указатель.

Во-ще-то, TBitmap это класс (aka class), AFAIK.

--
Regards, LVT.


 
Evgnevius ©   (2009-11-17 14:12) [20]

Вообще, объект - это указатель на область оперативной памяти, и когда мы передаём его в качестве параметра в процедуру, то передаются не все его многотонные данные, а только ссылка на область, где эти данные хранятся. Но разговор-то здесь не о том.
>TBitmap который из Graphics или TBitmap который из Windows?
TBitmap из Windows - это вообще не класс, а запись.
>FastDIB и др. почему не используете?
А что такое FastDIB и каковы его возможности? Он может заменить OpenGL?


 
Leonid Troyanovsky ©   (2009-11-17 14:27) [21]


> Evgnevius ©   (17.11.09 14:12) [20]

> на область, где эти данные хранятся. Но разговор-то здесь
> не о том.

Как раз, об этом и говорили, о серьезной ошибке.

--
Regards, LVT.


 
Григорьев Антон ©   (2009-11-17 14:28) [22]

Вы думаете, для DLL есть разница получить ли TBitmap приложения через одинарную ссылку или через двойную, если с точки зрения DLL это всё равно не TBitmap?


 
DVM ©   (2009-11-17 14:31) [23]


> Evgnevius ©   (17.11.09 14:12) [20]


> TBitmap из Windows - это вообще не класс, а запись.

я потому и уточнил, мало ли какое недопонимание.

Если речь идет о именно классе TBitmap то его все же лучше не передавать в DLL. RTTI разные как уже сказали. Но как ни странно даже неправильно оно работать будет. Но до поры до времени, ибо порочная практика изначально.


 
Evgnevius ©   (2009-11-17 14:40) [24]

Какая разница, как передаётся битмап в библиотеку? Я понимаю, что вы хотите помочь и ищите недостатки в самой программе. Однако, всё работает нормально, и мне не хотелось бы дискутировать по поводу того, что отлажено уже сотнями билдов. Я просто хочу нанести изображение, созданное при помощи OpenGL, на битмап без всяких окон. И знаю, что это можно, потому что есть разные примеры в сети, однако, большинство из них не на Делфи. А те, которые на Делфи либо не компилируются либо просто не работают.
Повторю: я создал тестовое приложение, где вначале я пытаюсь рисовать на битмапе, а потом смотрю результат. Результата пока нет.


 
_   (2009-11-17 14:42) [25]


> через одинарную ссылку или через двойную


Я об этом же.
Класс - это и есть ссылка. А если сделать ссылку на него.
То будет двойной посыл.


 
Leonid Troyanovsky ©   (2009-11-17 14:53) [26]


> Evgnevius ©   (17.11.09 14:40) [24]

> Какая разница, как передаётся битмап в библиотеку?

Ну, если разница неочевидна, то зачем менять то,
что что отлажено уже сотнями билдов?

> однако, большинство из них не на Делфи. А те, которые на
> Делфи либо не компилируются либо просто не работают.

Ну, тут все просто: надо нанять программиста.

--
Regards, LVT.


 
Evgnevius ©   (2009-11-17 15:03) [27]

Леонид Трояновский, я очень рад, что вы - опытный специалист и мудрый программист, но простых вещей вы не понимаете.
 Мне не надо менять то, что уже отлажено. Я задал простой вопрос и хочу на него получить простой ответ. А там, где вы принялись искать ошибки - их нет. Приложение включает в себя около 70 плагинов и все они успешно справляются с задачей по отрисовки битмапа. Не один из них просто не использует OpenGL. А хотелось бы...
 Простите за резкий тон.


 
_   (2009-11-17 15:05) [28]

Сага о X, Y, Z. ;)


 
Григорьев Антон ©   (2009-11-17 22:21) [29]

Вот обещанный код. На форме лежит одна кнопка и обработчик на ней. Универсальная процедура 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;


Надеюсь, из этого примера вы извлечёте всё, что нужно.


 
Evgnevius ©   (2009-11-18 00:49) [30]

Премного благодарен!
Рррработает!


 
Германн ©   (2009-11-18 01:48) [31]

Удалено модератором
Примечание: Offtopic


 
имя   (2009-11-18 12:35) [32]

Удалено модератором
Примечание: Offtopic


 
имя   (2009-11-18 12:38) [33]

Удалено модератором
Примечание: Offtopic



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2010.01.10;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.005 c
15-1257715812
Юрий
2009-11-09 00:30
2010.01.10
С днем рождения ! 9 ноября 2009 понедельник


15-1257683780
McSimm
2009-11-08 15:36
2010.01.10
Апгрейд до Windows 7 возможен ?


2-1258375107
defen
2009-11-16 15:38
2010.01.10
разрешения для изменения ключей реестра


2-1258470387
Pascal96
2009-11-17 18:06
2010.01.10
Задача на сортировку.


1-1232982610
Afonya
2009-01-26 18:10
2010.01.10
Чтение данных TStringGrid из другого приложения





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский