| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > OpenGL + C++Builder ? |
| Автор: Ingvar Riga 21.7.2004, 19:40 |
| Необходимо пообщаться с человеком, кторый работает в данной связке. Проблема в том, что код реализованный на Delphi работает, а прямой его перевод (правильный) на С++ Builder не работает. Такое впечатление, что некоторые функции OpenGL срабатывают только один раз. (glClear, glViewport...). Я только начинаю изучать OpenGL и требуется помощь. Кто-нибудь в состоянии? Предложения перейти на Делфи не рассматриваются из-за специфики работы. |
| Автор: oleg1973 21.7.2004, 20:43 |
| ну дык компилятор тут не причем ченить с вызовом функ напутал |
| Автор: Ingvar Riga 22.7.2004, 19:24 |
| Вот фокусы! Чем различается код на Delphi и код на C++ Builder? Кроме языка реализации, конечно. Однако Паскалевский работает а Cишный НЕТ! Уличите меня в ошибках! //----------------------------------------------------------------- unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, OpenGL; type TfrmGL = class(TForm) procedure FormCreate(Sender: TObject); procedure FormPaint(Sender: TObject); procedure FormDestroy(Sender: TObject); private hrc: HGLRC; end; var frmGL: TfrmGL; implementation {$R *.DFM} procedure TfrmGL.FormPaint(Sender: TObject); begin wglMakeCurrent(Canvas.Handle, hrc); glViewPort (0, 0, ClientWidth, ClientHeight); // область вывода glClearColor (0.5, 0.5, 0.75, 1.0); // цвет фона glClear (GL_COLOR_BUFFER_BIT); // очистка буфера цвета glPointSize (20); // размер точек glColor3f (1.0, 0.0, 0.5); // текущий цвет примитивов glBegin (GL_POINTS); // открываем командную скобку glVertex2f (-1, -1); glVertex2f (-1, 1); glVertex2f (0, 0); glVertex2f (1, -1); glVertex2f (1, 1); glEnd; // закрываем командную скобку SwapBuffers(Canvas.Handle); // содержимое буфера - на экран wglMakeCurrent(0, 0); end; procedure SetDCPixelFormat (hdc : HDC); var pfd : TPixelFormatDescriptor; nPixelFormat : Integer; begin FillChar (pfd, SizeOf (pfd), 0); pfd.dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER; nPixelFormat := ChoosePixelFormat (hdc, @pfd); SetPixelFormat (hdc, nPixelFormat, @pfd); end; procedure TfrmGL.FormCreate(Sender: TObject); begin SetDCPixelFormat(Canvas.Handle); hrc := wglCreateContext(Canvas.Handle); end; procedure TfrmGL.FormDestroy(Sender: TObject); begin wglDeleteContext(hrc); end; end. //----------------------------------------------------------------- С++ Builder: //----------------------------------------------------------------- void __fastcall SetDCPixelFormat ( HDC hdc ) { PIXELFORMATDESCRIPTOR pfd; int nPixelFormat; memset(&pfd, 0x0, sizeof (pfd)); pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; nPixelFormat = ChoosePixelFormat (hdc, &pfd); SetPixelFormat (hdc, nPixelFormat, &pfd); } void __fastcall TForm1::FormCreate(TObject *Sender) { SetDCPixelFormat(Canvas->Handle); hrc = wglCreateContext(Canvas->Handle); } void __fastcall TForm1::FormDestroy(TObject *Sender) { wglDeleteContext(hrc); } void __fastcall TForm1::FormPaint(TObject *Sender) { wglMakeCurrent(Canvas->Handle, hrc); glViewport (0, 0, ClientWidth, ClientHeight); // область вывода glClearColor (0.5, 0.5, 0.75, 1.0); // цвет фона glClear (GL_COLOR_BUFFER_BIT); // очистка буфера цвета glPointSize (20); // размер точек glColor3f (1.0, 0.0, 0.5); // текущий цвет примитивов glBegin (GL_POINTS); // открываем командную скобку glVertex2f (-1, -1); glVertex2f (-1, 1); glVertex2f (0, 0); glVertex2f (1, -1); glVertex2f (1, 1); glEnd; // закрываем командную скобку SwapBuffers(Canvas->Handle); // содержимое буфера - на экран wglMakeCurrent(0, 0); } //--------------------------------------------------------------------------- В общем ситуация такова: Код должен рисовать окошко заполненное голубоватым цветом и с 5 точками. (Это просто пример). При изменении размера окна соответственно перерисовывается вся картинка. На Delphi усЁ в порядке. На Билдере нет. Рисуется основное окно заполненное цветом. Точек нет. При изменении размеров начинаются тормозюльки отрисовки окна и системы в целом. Чувствуется ошибка - но В ЧЕМ ИМЕННО?! Кстати во всех примерах для С++Builder отрисовка производится через тики таймера. Это что за фокус? |
| Автор: <Spawn> 22.7.2004, 21:56 | ||
| Вроде все правильно(На пример из Краснова похоже Вот тебе один из примеров:
|
| Автор: Ingvar Riga 23.7.2004, 20:53 |
| Краснов и есть. Хорошая книженция - не жалею что потратился. А кстати ошибочка - элементарна. Сам нашел.... и порвал все волосы на шляпе... Вместо glEnd(); у меня написано glEnd; компилятор - гад |