Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 19.04.2009, 14:25
Аватар для Excreman
Excreman Excreman вне форума
Прохожий
 
Регистрация: 06.11.2008
Сообщения: 21
Репутация: 10
По умолчанию OPENGL: вопрос по инициализации

У меня вопрос по работе с opengl.Я создал новый проект , новую форму ,инициализировал opengl по инструкции в
http://codingrus.ru/readarticle.php?article_id=722
,нарисовал как там говорилось желтый треугольник на зеленом фоне.Скомпилировал-ошибок нет.Запустил-на мгновение промелькнул черный экран аля командная строка и тут же закрылся .Я проверил еще раз правильность мною написанного относительно того текста , скопировал оттуда слово в слово-не помогает, рисунок ну никак не хочет появлятся .Может кто-нибудь знает в чем дело, сможет помочь?Выкладываю текст формы(полностью)


Код:
unit Unit13;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs ,Opengl;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
pfd:TPixelFormatDescriptor;
nPixelFormat: Integer;
begin
FillChar(pfd, sizeof(pfd), 0);
nPixelFormat:=ChoosePixelFormat(Canvas.Handle, @pfd);
SetPixelFormat(Canvas.Handle, nPixelFormat, @pfd);
end;

procedure TForm1.FormPaint(Sender: TObject);
var
hrc:HGLRC;
begin
hrc:=wglCreateContext(Canvas.Handle);
wglMakeCurrent(Canvas.Handle,hrc);
{ Рисуем желтый треугольник на синем фоне }
glClearColor(0,0.5,0.75,1.0);
glClear(GL_COLOR_BUFFER_BIT) ;
glBegin(GL_TRIANGLES) ;
glColor3f(1,1,0.25);
glVertex2f(0,-0.8);
glVertex2f(-0.8,0.8);
glVertex2f(0.8,0.8);
glEnd();
glFinish();
{ Конец рисования }
wglMakeCurrent (0,0);
wglDeleteContext(hrc);
end;

end.
Ответить с цитированием
  #2  
Старый 19.04.2009, 16:03
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Странно, у меня всё работает...
Может, после обнуления содержимого структуры pfd стоит всё же установить требуемые значения полей? Хотя бы самые основные... Например, что-нибудь типа этого:
Код:
procedure TForm1.FormCreate(Sender: TObject);
var
  pfd:TPixelFormatDescriptor;
  nPixelFormat: Integer;
begin
  FillChar(pfd, sizeof(pfd), 0);
  with pfd do
  begin
    nSize := SizeOf(pfd);
    nVersion := 1;
    dwFlags := PFD_SUPPORT_OPENGL or PFD_DRAW_TO_WINDOW; // возможно, флаги другие
    iPixelType := PFD_TYPE_RGBA;
    cColorBits := 24;
    cAlphaBits := 64;
    cAccumBits := 64;
    cStencilBits := 64;
    iLayerType := PFD_MAIN_PLANE;
  end;
  nPixelFormat:=ChoosePixelFormat(Canvas.Handle, @pfd);
  SetPixelFormat(Canvas.Handle, nPixelFormat, @pfd);
end;
Ответить с цитированием
  #3  
Старый 19.04.2009, 19:06
Аватар для Excreman
Excreman Excreman вне форума
Прохожий
 
Регистрация: 06.11.2008
Сообщения: 21
Репутация: 10
По умолчанию

Попробовал ,не получилось Может быть нужно еще сделать это(взял из
http://codingrus.ru/readarticle.php?article_id=722
Цитата:
4. Инициализация OpenGL выполнена и теперь можно заняться собственно
рисованием. Для этого напишите процедуру обработки события onPaint главной
формы программы. Кроме того, эту же процедуру нужно сделать обработчиком со-
бытия onResize
.
Я правда не понял смысл последней фразы, может она важна?
__________________
2 ОСНОВНЫХ ПРАВИЛА ФОРУМА
1)Админ всегда прав
2)Если админ не прав-смотри пункт 1
Ответить с цитированием
  #4  
Старый 19.04.2009, 19:30
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Цитата:
Сообщение от Excreman
не понял смысл последней фразы, может она важна?
Не думаю, что проблема в этом. Просто если сделать для формы обработчик события OnResize, как там требуется
Код:
procedure TForm1.FormResize(Sender: TObject);
begin
  FormPaint(Sender);
end;
Так вот, если написать такой обработчик, то картинка будет перерисовываться при изменении размеров окна. Другого смысла этого требования я не вижу... Хотя нужно иметь в виду, что при создании формы тоже происходит событие OnResize. Но напишите его на всякий случай — не помешает. =)

Вообще, я обычно использую несколько другой способ получения контекста рисования, когда рисование происходит на самой форме
Код:
procedure TForm1.FormPaint(Sender: TObject);
var
  DC: HDC;
  hrc:HGLRC;
begin
  DC := GetDC(Handle);
  hrc:=wglCreateContext(DC);
  wglMakeCurrent(DC,hrc);

  { дальше всё так же }

  wglMakeCurrent (0,0);
  wglDeleteContext(hrc);
  ReleaseDC(Handle, DC);
end;
Попробуйте, вдруг поможет... А вообще у вас работают другие приложения, которые используют библиотеку OpenGL? Может, проблема в ней...

P.S. Ещё одно. Этому совету хотите следуйте, хотите — нет, но я бы выполнила трассировку программы, чтобы хотя бы выяснить, на какой строке происходит ошибка. Только имейте в виду, что отладка программ, использующих OpenGL, вообще говоря, не рекомендуется.

Последний раз редактировалось Nyctos Kasignete, 19.04.2009 в 19:50.
Ответить с цитированием
  #5  
Старый 19.04.2009, 20:04
Аватар для Excreman
Excreman Excreman вне форума
Прохожий
 
Регистрация: 06.11.2008
Сообщения: 21
Репутация: 10
По умолчанию

Попробовал по вашему способу , все также-мелькнул черный экран и обратно в дельфи Я попробовал максимально упростить программу , создав всего 2 процедуры-oncreate и onresize
Код:
procedure TForm14.FormCreate(Sender: TObject);
begin
DC := GetDC(Handle);
hrc:=wglCreateContext(DC);
wglMakeCurrent(DC,hrc);
glClearColor(0,0.5,0.75,1.0);
glClear(GL_COLOR_BUFFER_BIT) ;
glBegin(GL_TRIANGLES) ;
glColor3f(1,1,0.25);
glVertex2f(0,-0.8);
glVertex2f(-0.8,0.8);
glVertex2f(0.8,0.8);
glEnd();
wglMakeCurrent (0,0);
wglDeleteContext(hrc);
ReleaseDC(Handle, DC);
end;

procedure TForm14.FormResize(Sender: TObject);
begin
Formcreate(Sender);
end;
Может быть, я не туда поместил очистители(?) контекста
Код:
wglMakeCurrent (0,0);
wglDeleteContext(hrc);
ReleaseDC(Handle, DC);
Куда их надо совать?До начала рисования ,сразу после или на событии ondestroy?И кстати ,зачем нужно
ReleaseDC(Handle, DC)?
Ндя и еще. В какой последовательности мне нужно рисовать,допустим, желтый треугольник на синем фоне.Я имею ввиду цвет,координаты вершин. фон и прочее.
Если не получится, придется мне перейти на gdi
__________________
2 ОСНОВНЫХ ПРАВИЛА ФОРУМА
1)Админ всегда прав
2)Если админ не прав-смотри пункт 1
Ответить с цитированием
  #6  
Старый 19.04.2009, 20:24
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Вообще, думаю, наиболее рационально создавать контекст и делать его текущим однократно при создании формы, а освобождать также однократно — при закрытии окна. При этом переменные DC и hrc, естественно, должны быть глобальными, либо быть атрибутами объекта TForm1.
Но я еще раз повторю: код рабочий. По крайней мере, у меня работает вообще безошибочно. Вы не решили насчет трассировки?
Ответить с цитированием
  #7  
Старый 19.04.2009, 20:51
Аватар для Excreman
Excreman Excreman вне форума
Прохожий
 
Регистрация: 06.11.2008
Сообщения: 21
Репутация: 10
По умолчанию

БЛИН ,НУ Я И ТУПОЙ :0 ВСЕ было ТАК просто.Извините уважаемые, Я мегоЛОХ .Попробовал трассировку,увидел,что дельфи прокатывается через мой юнит сразу в сурс на begin.Оказывается , когда я создавал новый проект я создал КОНСОЛЬНОе приложение.Отсюда и черный экран и невозможность В ПРИНЦИПЕ что-нибудь нарисовать.Взял свой старый проект,сунул тот же юнит-все заработало! Еще раз извиняюсь если запудрил кому-нибудь мозги) . Правда, если бы не совет о трассировке....
Вобщем, спасибо
__________________
2 ОСНОВНЫХ ПРАВИЛА ФОРУМА
1)Админ всегда прав
2)Если админ не прав-смотри пункт 1

Последний раз редактировалось Excreman, 19.04.2009 в 21:18.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 05:20.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter