![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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 Цитата:
![]() |
|
#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 ![]() |
|
#6
|
|||
|
|||
|
Вообще, думаю, наиболее рационально создавать контекст и делать его текущим однократно при создании формы, а освобождать также однократно — при закрытии окна. При этом переменные DC и hrc, естественно, должны быть глобальными, либо быть атрибутами объекта TForm1.
Но я еще раз повторю: код рабочий. По крайней мере, у меня работает вообще безошибочно. Вы не решили насчет трассировки? |
|
#7
|
||||
|
||||
|
БЛИН ,НУ Я И ТУПОЙ :0 ВСЕ было ТАК просто.Извините уважаемые, Я мегоЛОХ
.Попробовал трассировку,увидел,что дельфи прокатывается через мой юнит сразу в сурс на begin.Оказывается , когда я создавал новый проект я создал КОНСОЛЬНОе приложение.Отсюда и черный экран и невозможность В ПРИНЦИПЕ что-нибудь нарисовать.Взял свой старый проект,сунул тот же юнит-все заработало! Еще раз извиняюсь если запудрил кому-нибудь мозги) . Правда, если бы не совет о трассировке....Вобщем, спасибо ![]() Последний раз редактировалось Excreman, 19.04.2009 в 21:18. |