Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Вроде все правильно(На пример из Краснова похожеsmile.gif). У меня есть с десяток тестовых проектов на Си сделаных полгода назад по аналогии с этим и все работает. Может ты чего то с переменными напутал? Где у тебя hrc лежит? Ты случаем не теряешь ссылку на этот HGLRC?

Вот тебе один из примеров:

Код
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <math.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
       : TForm(Owner)
{
       SetDCPixelFormat(Canvas->Handle);
       hrc = wglCreateContext(Canvas->Handle);
       rotate = 0.0;
       Randomize();
               for (int i = 0; i < VERTEX_COUNT; i++)
               {
                       pt[i].x = 0.8 * cos(2 * M_PI * i / (VERTEX_COUNT - 1));
                       pt[i].y = 0.8 * sin(2 * M_PI * i / (VERTEX_COUNT - 1));
                       pt[i].r = random(101) / 100.0;
                       pt[i].g = random(101) / 100.0;
                       pt[i].b = random(101) / 100.0;
               }        
}
//---------------------------------------------------------------------------

void __fastcall TForm1::SetDCPixelFormat(HDC dc)
{
       TPixelFormatDescriptor pfd;
       pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
       int nPixel;
       nPixel = ChoosePixelFormat(dc, &pfd);
       SetPixelFormat(dc, nPixel, &pfd);
}
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
       wglDeleteContext(Canvas->Handle);
}
//---------------------------------------------------------------------------

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);
       glLoadIdentity();

       glRotatef(rotate, 0.0, 0.0, 1.0);

               for (int i = 0; i < VERTEX_COUNT; i++)
               {
                       for (int j = 0; j < VERTEX_COUNT; j++)
                       {
                               glBegin(GL_LINES);
                                       glColor3f(pt[i].r, pt[i].g, pt[i].b);
                                       glVertex2f(pt[i].x, pt[i].y);
                                       glVertex2f(pt[j].x, pt[j].y);
                               glEnd();
                       }
               }
     //  glEnd();

       SwapBuffers(Canvas->Handle);

       wglMakeCurrent(0, 0);
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
       rotate += 5.0;
       FormPaint(this);
}
//---------------------------------------------------------------------------

Автор: Ingvar Riga 23.7.2004, 20:53
Краснов и есть. Хорошая книженция - не жалею что потратился.
А кстати ошибочка - элементарна. Сам нашел.... и порвал все волосы на шляпе...

Вместо

glEnd();

у меня написано

glEnd;

компилятор - гад mad.gif - ошибку не выдает, я ОГЛ не хотит работать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)