|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
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
|
|||
|
|||
Странно, у меня всё работает...
Может, после обнуления содержимого структуры 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
|
||||
|
||||
Попробовал ,не получилось Может быть нужно еще сделать это(взял из
http://codingrus.ru/readarticle.php?article_id=722 Цитата:
2 ОСНОВНЫХ ПРАВИЛА ФОРУМА 1)Админ всегда прав 2)Если админ не прав-смотри пункт 1 |
#4
|
|||
|
|||
Цитата:
Код:
procedure TForm1.FormResize(Sender: TObject); begin FormPaint(Sender); end; Вообще, я обычно использую несколько другой способ получения контекста рисования, когда рисование происходит на самой форме Код:
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; P.S. Ещё одно. Этому совету хотите следуйте, хотите — нет, но я бы выполнила трассировку программы, чтобы хотя бы выяснить, на какой строке происходит ошибка. Только имейте в виду, что отладка программ, использующих OpenGL, вообще говоря, не рекомендуется. Последний раз редактировалось Nyctos Kasignete, 19.04.2009 в 19:50. |
#5
|
||||
|
||||
Попробовал по вашему способу , все также-мелькнул черный экран и обратно в дельфи Я попробовал максимально упростить программу , создав всего 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); ReleaseDC(Handle, DC)? Ндя и еще. В какой последовательности мне нужно рисовать,допустим, желтый треугольник на синем фоне.Я имею ввиду цвет,координаты вершин. фон и прочее. Если не получится, придется мне перейти на gdi 2 ОСНОВНЫХ ПРАВИЛА ФОРУМА 1)Админ всегда прав 2)Если админ не прав-смотри пункт 1 |
#6
|
|||
|
|||
Вообще, думаю, наиболее рационально создавать контекст и делать его текущим однократно при создании формы, а освобождать также однократно — при закрытии окна. При этом переменные DC и hrc, естественно, должны быть глобальными, либо быть атрибутами объекта TForm1.
Но я еще раз повторю: код рабочий. По крайней мере, у меня работает вообще безошибочно. Вы не решили насчет трассировки? |
#7
|
||||
|
||||
БЛИН ,НУ Я И ТУПОЙ :0 ВСЕ было ТАК просто.Извините уважаемые, Я мегоЛОХ .Попробовал трассировку,увидел,что дельфи прокатывается через мой юнит сразу в сурс на begin.Оказывается , когда я создавал новый проект я создал КОНСОЛЬНОе приложение.Отсюда и черный экран и невозможность В ПРИНЦИПЕ что-нибудь нарисовать.Взял свой старый проект,сунул тот же юнит-все заработало! Еще раз извиняюсь если запудрил кому-нибудь мозги) . Правда, если бы не совет о трассировке....
Вобщем, спасибо 2 ОСНОВНЫХ ПРАВИЛА ФОРУМА 1)Админ всегда прав 2)Если админ не прав-смотри пункт 1 Последний раз редактировалось Excreman, 19.04.2009 в 21:18. |