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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> OpenGL, инициализация 
:(
    Опции темы
matthew
Дата 14.5.2005, 07:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Прочитал я много статей про инициализацию и в каждой написано все по-разному....и ничего не работает...конечно дело может быть в неправильно установленом опенжэле,но некоторые исходники работают...но мне нужно для начала понять сам принцип инициализации....подскажите...


PM MAIL   Вверх
Payne
Дата 14.5.2005, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Детектив
*


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

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



Вот код с подробными комментариями:
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics,
  Controls, Forms, Dialogs, OpenGL; //обязательно подключи OpenGL

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    hrc: hGLRC; {ссылка на контекст воспроизведения}
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{begin формат пикселя}
procedure SetDCPixelFormat (hdc: hDC);
var
  pfd: TPixelFormatDescriptor; //структура, описывающая формат пикселей
  nPixelFormat: Integer; //номер формата пикселей
begin
  FillChar (pfd, SizeOf(pfd), 0); //заполняем структуру pfd нулями
  //также ты можешь добавить свои элементы как в обычную запись,
  //например, pfd.dwFlags := PFD_DOUBLEBUFFER
  nPixelFormat := ChoosePixelFormat (hdc, @pfd); //определяем оптимальный номер формата
  SetPixelFormat (hdc, nPixelFormat, @pfd); //устанавливаем формат
end;
{end формат пикселя}

{begin создание формы}
procedure TForm1.FormCreate(Sender: TObject);
begin
  SetDCPixelFormat (Canvas.Handle); //вызываем процедуру установки формата пикселей...
  hrc := wglCreateContext (Canvas.Handle); //...и создаем контекст воспроизведения OpenGL - это будет канва
end;
{end создание формы}

{begin рисование на форме - просто закрашиваем форму}
procedure TForm1.FormPaint(Sender: TObject);
begin
  wglMakeCurrent (Canvas.Handle, hrc); //сделать текущим контекст воспроизведения hrc
  glClearColor (0.5, 0, 0.5, 1.0);  //цвет фона (RGBA)
  glClear (GL_COLOR_BUFFER_BIT);  //очистка буфера цвета
  wglMakeCurrent (0, 0); //сбрасываем текущий контекст воспроизведения
end;
{end рисование на форме - просто закрашиваем форму}

{begin завершение работы приложения}
procedure TForm1.FormDestroy(Sender: TObject);
begin
  wglDeleteContext (hrc); //при завершении работы приложения удаляем контекст воспроизведения hrc
end;
{end завершение работы приложения}

end.

Все, что делает программа, так это только закрашивает форму. Здесь приведен минимум, который ты должен написать для начала использования функций OpenGL. В процедуре FormPaint основные строки - это wglMakeCurrent (Canvas.Handle, hrc) и wglMakeCurrent (0, 0) - между ними ты можешь вставлять команды OpenGL.
У меня этот минимум хорошо работает. Если у тебя не пойдет, значит проблемы с OpenGL (или я ошибся в тексте проги smile , что маловероятно, поскольку я его скопировал из рабочей программы).

З.Ы. Надеюсь, это то, что тебе нужно было...
PM MAIL WWW ICQ Skype   Вверх
matthew
Дата 15.5.2005, 06:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Огромнейшее спасибо.

Смысл мне абсолютно понятен,но все равно не работает smile ....

сейчас буду разбираться..
-----------------------------------------------------------------------------------------

Пытался выяснить почему не работает....стал вставлять в начале и в конце процедур - showmessage...и выяснилось,что программа глохнет на procedure SetDCPixelFormat (hdc: hDC);....после нее никаких сообщений программа выводить уже не может....

я где-то читал,что с pfd надо быть аккуратнее....от того какие флаги там поставить будет зависеть работоспособность проги...или неправ я?

и еще....я качал исходники с NeHe...так исходник про инициализацию в полноэкранном режиме работает...

Это сообщение отредактировал(а) matthew - 15.5.2005, 07:07
PM MAIL   Вверх
Payne
Дата 15.5.2005, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Детектив
*


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

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



Да, значит функция SetDCPixelFormat у тебя глюкавит. Но это может быть лишь по одной причине: чего-то не хватает.
В книге М.Краснова "OpenGL в проектах Delphi" написано следующее:

Цитата
Обратим внимание на поле структуры "битовые флаги", dwFlags. To, как мы зададим значение флагов, может существенно сказаться на работе нашего приложения, и наобум задавать эти значения не стоит. Тем более, что некоторые флаги совместно "не уживаются", а некоторые присутствуют только в паре с определенными флагами.


Так что здесь ты прав. Например, константу PFD_GENERIC_ACCELERATED имеет смысл устанавливать только в случае, если компьютер оснащен графическим акселератором. Так что попробуй, если ты, конечно, еще этого не делал, напиши такую строку в процедуре SetDCPixelFormat:
Код

...
FillChar (pfd, SizeOf(pfd), 0);
pfd.dwFlags := PFD_SUPPORT_OPENGL; //этим говоришь оси, что твой комп поддерживает OpenGL
nPixelFormat := ChoosePixelFormat (hdc, @pfd);
... 

Не совсем уверен в том, что это поможет, но стоит попробовать... Также ты можешь просмотреть содержимое модуля Windows.pas. Найди там описание типа TPixelFormatDescriptor и посмотри, какие флаги присутствуют. Можешь также в справке посмотреть. Поэкспериментируй с флагами. Подключай их по одному или комбинациями (для этого, если помнишь, используется оператор or). Должно пойти...
З.Ы. Здесь все зависит от конфигурации драйверов твоей видеокарты...
PM MAIL WWW ICQ Skype   Вверх
Quadr0
Дата 15.5.2005, 10:06 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 14.7.2011, 20:26
  Вверх
matthew
Дата 15.5.2005, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



спасибо конечно....но я хочу разобраться....

Это сообщение отредактировал(а) matthew - 15.5.2005, 10:35
PM MAIL   Вверх
Quadr0
Дата 16.5.2005, 12:18 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 14.7.2011, 20:30
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

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

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

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

FAQ раздела лежит здесь!


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

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


 




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


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

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