Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> OpenGL + C++Builder ? Кто-нибудь работает в этой связке? 
:(
    Опции темы
Ingvar Riga
Дата 21.7.2004, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 31.3.2004

Репутация: нет
Всего: нет



Необходимо пообщаться с человеком, кторый работает в данной связке. Проблема в том, что код реализованный на Delphi работает, а прямой его перевод (правильный) на С++ Builder не работает.
Такое впечатление, что некоторые функции OpenGL срабатывают только один раз. (glClear, glViewport...).
Я только начинаю изучать OpenGL и требуется помощь. Кто-нибудь в состоянии?
Предложения перейти на Делфи не рассматриваются из-за специфики работы.
PM MAIL   Вверх
oleg1973
Дата 21.7.2004, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 1
Всего: 34



ну дык компилятор тут не причем
ченить с вызовом функ напутал


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Ingvar Riga
Дата 22.7.2004, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 31.3.2004

Репутация: нет
Всего: нет



Вот фокусы! Чем различается код на 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 отрисовка производится через тики таймера.
Это что за фокус?


PM MAIL   Вверх
<Spawn>
Дата 22.7.2004, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Вроде все правильно(На пример из Краснова похоже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);
}
//---------------------------------------------------------------------------


Это сообщение отредактировал(а) <Spawn> - 22.7.2004, 21:58


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Ingvar Riga
Дата 23.7.2004, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 31.3.2004

Репутация: нет
Всего: нет



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

Вместо

glEnd();

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

glEnd;

компилятор - гад mad.gif - ошибку не выдает, я ОГЛ не хотит работать.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0453 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.