![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
![]() У меня вопрос по работе с 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
|
||||
|
||||
![]() Попробовал по вашему способу , все также-мелькнул черный экран и обратно в дельфи
![]() Код:
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 ВСЕ было ТАК просто.Извините уважаемые, Я мегоЛОХ
![]() ![]() Вобщем, спасибо ![]() 2 ОСНОВНЫХ ПРАВИЛА ФОРУМА 1)Админ всегда прав 2)Если админ не прав-смотри пункт 1 Последний раз редактировалось Excreman, 19.04.2009 в 21:18. |