Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопросы по OpenGL [Delphi, Windows]


Страницы:   1 2 3 4 5 6

Pa5ha ©   (2005-04-01 00:20:00) 

Решил написать небольшой симулятор на ОпенГЛ и столкнулся с некоторыми тонкостями.

1. скайбокс из-за интерполяции имеет стыки, которые всё сильно портят. Как их можео убрать?
2. как удалять текстуры имея только GLUint? Просто, сцены надо менять по ходу дела, а старые текстуры не удаляются до завершения (и удаляются ли вообще).

Вопросы будут поступать ещё скорее всего =)


dRake   (2005-04-14 02:21:00) [61]

>После завершения работы в фуллскрине на панели остается кнопка >приложения, хотя оно уже давно сгинуло. Что делать?

Как закрываешься? PostQuitMessage c обработкой?


Pa5ha   (2005-04-14 01:59:00) [62]

После завершения работы в фуллскрине на панели остается кнопка приложения, хотя оно уже давно сгинуло. Что делать?


Zak3D[@Tm]   (2005-04-13 23:50:00) [63]

Pa5ha   (13.04.05 01:37) [30]
>>Кстати, директХ требовал восстановления поверхности после минимиза и прочего подобного действа. А почему ОпенГЛ не просит?
----------------------
В Опене это автоматизированно : ).
Всё так сказать для людёв.


Pa5ha   (2005-04-13 22:48:00) [64]

Вай, оно работает =)
Я правда сначала устанавливал разрешение, потом максимализировал и получал примерно: http://www.cs.karelia.ru/~vpashkov/others/bug.jpg

Сколько раз можно сделать PUSHMATRIX?


XProger   (2005-04-13 22:30:00) [65]

Постойка... ты сказал максимизации? ;)

ShowWindow(s_Handle, SW_SHOWNORMAL);

Здесь нет максимизации!
Размеры окна должны соответствовать размерам поля вывода.

glViewport(0, 0, W, H);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
if is3D then
gluPerspective(90, W/H, 0.4, 1000) // три измерения
else
gluOrtho2D(0, W, H, 0); // на одно меньше ;)
glMatrixMode(GL_MODELVIEW);      
glLoadIdentity;

Здесь W H - Ширина и Высота ОКНА! Ты уверен что даёшь ClientWidth и ClientHeight окна?


Pa5ha   (2005-04-13 20:40:00) [66]

Работать то все работает. Может, даже текст отображается (его не видно). Просто после максимизации приложения большая часть экрана пуста. Внизу тонкая полоска изображения. Т.е. область вывода куда то далеко вниз уезжает. Я могу исходники выслать на мыло.


XProger   (2005-04-13 17:25:00) [67]

То что я тебе дал работает 100% корректно!
Для винвордед нужно будет хранить ещё одну переменную и для изменения стиля окна использовать SetWindowLong:

procedure SetWindow;
var
Style : Longint;
i, j  : integer;
begin
i := 0;
j := 0;
Style := GetWindowLong(Handle, GWL_STYLE);
if inWindow then
begin
i := GetSystemMetrics(SM_CYCAPTION) +
     GetSystemMetrics(SM_CYBORDER) * 2;
j := GetSystemMetrics(SM_CXBORDER) * 2;
SetWindowLong(Handle, GWL_STYLE, Style or WS_CAPTION or WS_BORDER or WS_SYSMENU);
end
else
SetWindowLong(Handle, GWL_STYLE, Style and (not WS_CAPTION) and (not WS_BORDER) and (not WS_SYSMENU));

SetWindowPos(Handle, HWND_TOPMOST, 0, 0, xglWidth + j, xglHeight + i, SWP_NOZORDER or SWP_FRAMECHANGED);
end;


Pa5ha   (2005-04-13 15:07:00) [68]

Эх, исходник бы чего-нить 3д с возможностью выбора фуллскрин/виндовед и корректным сворачиванием. А то я что исправлю, новая бага появляется.


Pa5ha   (2005-04-13 14:48:00) [69]

Ну т.е. теперь разрешение как у рабочего стола становиться при восстановлении. Сделал невозможность изменять размер окна при фуллскрине (они (размеры) как то умудрялись меняться), так теперь вьюпорт не там устанавливается. =)

Значит так: =)
Faces[i][0] - первая вершина
Faces[i][1] - текустурные координаты первой вершины
Faces[i][2] - нормаль первой вершины
Faces[i][3] - вторая вершина
Faces[i][4] -
Faces[i][5] -
Faces[i][6] - третья вершина
Faces[i][7] -
Faces[i][8] -


XProger   (2005-04-13 14:08:00) [70]


Faces: array of array[0..8] of Word;
FaceCount: word;

тебя эти Word не смущают? А что это за фейс с 9-ю вершинами кстати? :)

"теперь разрешение не восстанавливается правильное" - это как? :)


Pa5ha   (2005-04-13 02:08:00) [71]

Матрицы "обнулил" :) Теперь все тип топ. Тока теперь разрешение на восстанавливается правильное =)


Pa5ha   (2005-04-13 02:05:00) [72]


 Model: Record
   Textures: array of glUint;
    Buffer: record
       Vert: array of TCoord;
       Norm: array of TCoord;
       Tex:  array of TTexCoord;
       Faces: array of array[0..8] of Word;
       FaceCount: word;
       SectionsCount: word;
       Sections: array of
         record
           MtlNumber: word;
           FaceStart: word;
           FaceCount: word;
         end;
       Materials: array of
         record
           MTLcolor: array[0..3]of GLfloat;
           TexNumber: integer;
         end;
    end;
 end;

Структура "модель" :D


XProger   (2005-04-13 01:54:00) [73]

Pa5ha,
Это всё руки и только они... Покажи как описывается меш модели? :)

Можно GetMem/FreeMem использовать.

Матрицу вида и матрицу проекции "обнуляй" перед отрисовкой сцены, а не при смене размеров окна.


Pa5ha   (2005-04-13 01:37:00) [74]

Короче, при количестве полигонов более 2^16/2 прога выдаёт ошибку такую же, как при неправильном юзании динамического массива.

Так как там прална ресрсы хранить?

Ещё функция glWrite Хорна перестают вообще что то отрисовывать после того, как получает рандольку вместо ректа. Кстати, директХ требовал восстановления поверхности после минимиза и прочего подобного действа. А почему ОпенГЛ не просит?

Монитор у меня с квадратными пихелами и разрешением (физическим) 1280х1024. Видно, что это не 4 к 3-м. А 800 на 600 - 4 к трем. Вот и искажения. Картинка растянута по оси У. Придется AspectCorrection делать.


XProger   (2005-04-13 00:41:00) [75]

Это где такие ограничения на integer? Ещё раз повторяю: Delphi это не паскаль!
[code]
Shortint -128..127 signed 8-bit
Smallint -32768..32767 signed 16-bit
Longint -2147483648..2147483647 signed 32-bit
Int64 -2^63..2^63-1 signed 64-bit
Byte 0..255 unsigned 8-bit
Word 0..65535 unsigned 16-bit
Longword 0..4294967295 unsigned 32-bit
[/code]

Про искажение, это твои проблемы. Всмысле, криво написал что-то... ;)


Pa5ha   (2005-04-12 23:30:00) [76]


> "не более 32000", ты вроде не на паскале пишешь ;)

Ну, тип в SetLength первого параметра integer. Вот и ограничение.

А ничего, если сначала создастся контекст воспроизведения, etc а потом я установлю фуллскрин?
===
Вроде работает, только консоль куда то делвается после сворачивания и модель какая то сжатая по краям. Неужто у монитора не 4:3 :shock:


XProger   (2005-04-12 23:10:00) [77]

"не более 32000", ты вроде не на паскале пишешь ;)

Обрабатывай
[code]
 WM_ACTIVATEAPP:
  if LOWORD(wParam) = WA_ACTIVE then
   begin
   ShowWindow(s_Handle, SW_SHOWNORMAL);
   // Display(Width, Height, BPP, Freq); - фулскрин
   end
  else
   begin
   ShowWindow(s_Handle, SW_SHOWMINIMIZED);
   ChangeDisplaySettings(_devicemodeA(nil^), CDS_FULLSCREEN);
   end;
[/code]

P.S.
Ян Хорн будет правильнее...


Zak3D[@Tm]   (2005-04-12 23:01:00) [78]

Я делаю примерно так:

WM_ACTIVATE :  begin
                      case LoWord(wParam) of
                          WA_ACTIVE,WA_CLICKACTIVE : begin
                            PostMessage(Window, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
                            SetFullscreen(ScreenWidth,ScreenHeight,BitDepth, Freq);  
                            ShowCursor( false );
                          end;
                          WA_INACTIVE : begin                  
                            PostMessage(Window, WM_SYSCOMMAND, SC_MINIMIZE, 0);
                            RestoreResolution();
                          end;
                      end

//Устанавливаем
function SetFullscreen( Width, Height, Bits , Freq : word ) : bool;
var DeviceMode: TDevMode;
begin
 with DeviceMode do
 begin
   dmSize := SizeOf(DeviceMode);
   dmPelsWidth := Width;
   dmPelsHeight := Height;
   dmBitsPerPel := Bits;
   dmDisplayFrequency := Freq;
   dmFields:= DM_PELSWIDTH or DM_PELSHEIGHT or DM_BITSPERPEL or DM_DISPLAYFREQUENCY;
 end;
 Result:=ChangeDisplaySettings(DeviceMode, CDS_FULLSCREEN)= DISP_CHANGE_SUCCESSFUL;;
end;

//Возвращаем
procedure RestoreResolution();
begin
 ChangeDisplaySettings(TDevMode(nil^), CDS_FULLSCREEN);
end;


Pa5ha   (2005-04-12 22:07:00) [79]

Примеры Джона Хорна имеют возможность запускаться в полноэкранном режиме. Для этого служит флаг FullScreen. А вот корректно минимизироваться они не умеют. Установленное разрешение остается. Пробовал вручную менять настройки на стандартные на время минимизации приложения вот так:    WM_SYSCOMMAND :
     begin
       if wParam = SC_MINIMIZE then
         begin
           if Fullscreen then             // Change back to non fullscreen
             begin
               ChangeDisplaySettings(devmode(nil^), 0);
               ShowCursor(True);
             end;
         end else
       if wParam = SC_MAXIMIZE then
         begin
         end;
     end;


Тока ничего хорошего из этого не получилось. Как быть? Может вовсе не так надо делать?


Pa5ha   (2005-04-12 11:35:00) [80]

И как "правильно" хранить ресурсы игры (ну модели там).
Я создаю динамический массив (4 штуки: вершини, нормали, тектсуры, буффер вершин). При загрузке одной модели появлялась ошибка. Все обыскал, потом решил проверить аргумент SetLength. Там ок-ся интегер и следовательно в моей проге не более 32000 полигонов может быть.


Страницы:   1 2 3 4 5 6

Наверх

Титульная страница Поиск, карта сайта Написать письмо