Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];

Вниз

Вопросы по OpenGL   Найти похожие ветки 

 
Pa5ha   (2005-04-01 00:20) [0]

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

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

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


 
Pa5ha   (2005-04-01 00:51) [1]

3. раньше писал на ДХ. Там интеграция с железом более тесная. В опенГЛ есть буферы вершин, нормалей, текстур, индексов? Или все ручками? Рама же не рационально юзается. Да и еслиб это можно было в видеопамять с текстурами запихать, то был бы некоторый прирост скорости.


 
XProger ©   (2005-04-01 01:59) [2]

1)

const
GL_CLAMP_TO_EDGE = $812F;
...
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

2)

procedure glDeleteTextures(N: GLsizei; Textures: PGLuint); stdcall; external opengl32;
...
glDeleteTextures(1, @ID);


P.S.
Pa5ha, смешной ты парень ;)


 
@!!ex   (2005-04-01 12:17) [3]

>XProger ©
http://www.rul-clan.ru/me/Bug.JPG
Сверху - с использованием
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
Снизу без.
Может я чего не так делаю, но ИМХО разницы нету.


 
A22 ©   (2005-04-01 12:20) [4]

не помню константы Gl"a, но в принципе стыки на скайбоксе как раз и убираются клэмпом. ну, можно еще миррор попробовать


 
Pa5ha   (2005-04-01 13:03) [5]

http://www.cs.karelia.ru/~vpashkov/bug.jpg - мой баг такого плана ибо с другой стороны текстуры она совсем другого цвета.

@!!ex, у Тебя текстуры вроде не стыкуются вообще.


 
XProger ©   (2005-04-01 19:05) [6]

Pa5ha, вот тут кламп поможет
@!!ex, а тебе поможет точное представление какие координаты текстуры куда пойдут на скайбоксе, ибо, как говорят, либо не стыкуются, либо не той стороной... ;)


 
Pa5ha   (2005-04-01 19:38) [7]

XProger, расскажи плиз про кламп. Что такое? Что то лучше не стало.


 
XProger ©   (2005-04-01 22:12) [8]

Биндишь текстуру и ставишь кламп (2 строки которые я дал)
После этого OpenGL не будет интерполировать цвета на гранях полигона с цветами текстуры на противоположной грани. Повторять нельзя будет текстуру проще говоря... ;)


 
Pa5ha   (2005-04-02 00:18) [9]

XProger, ну, код то я встявить догадался, только результат вроде не изменился. Может и изменился, но лучше не стало.

Ещё вопрос: почему в проектах Джона Хорна ФПС не больше 100, хотя никаких ограничений в коде вроде нету и построен он не на мультимедийном таймере.


 
XProger ©   (2005-04-02 02:03) [10]

Ян Хорн писал простые примеры, и в большинстве случаев не стремился к оптимальности кода. В основном только эффекты...
А в данный момент сайт поддерживают его друзья, ибо нет больше с нами Хорни :(
А ограничение в 100 фпс связанно с автоматическим контролем вертикальной синхроницазии драйвером по умолчанию. Если же ты вручную уберёшь её, то фпс увеличится. ян также писал пример на эту тему VSync зовётся, поищи...


 
Pa5ha   (2005-04-04 03:03) [11]

Вывожу модель. На двух поверхностях, соединяющихся под маленьким углом появляются зубчики. Это вроде бага Z-буфера. Как это можно убрать? Потом покажу скрин.

Только что написал загрузку моделей. 2 часа багу отлавливал. Каляка маляка рисовалась. Оказалось не в том порядке считывал координаты =)


 
XProger ©   (2005-04-04 16:27) [12]

Удаление зубчиков "Z-Battle"
1) (zFar - zNear) чем меньше тем точнее расчёт :)
2) glPolygonOffset


 
Pa5ha   (2005-04-07 19:22) [13]

Итак. Подоспели ещё пара вопросов.

1. Как работать со скайбоксом? Тот что он должен следовать за камерой понятно. Но что делать при изменении высоты? Симулятор то авиа...
2. Пришло время сделать консоль. Шрифт должен грузиться из файла и я хочу, чтоб он имел альфа канал. Как это лучше реализовать? Если есть примеры, то...


 
XProger ©   (2005-04-07 20:37) [14]

1) Для авиа симов скайбокс не катит ;)
2) Обычная GrayScale текстура. Рисуешь каждый символ квадом с символом из текстуры :)


 
Pa5ha   (2005-04-08 00:23) [15]

Что то я пока в настройки не втыкаю. Буду думать, искать...
Что надо сделать, чтоб с 3д переключиться в 2д, потом обратно при условии, что 2д рисуется в конце кадра.

А чтож со скайбоксом то делать? Такой красивый получился =)


 
XProger ©   (2005-04-08 22:08) [16]


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;


Используй скайбокс, если результат устраивает... ;)


 
Pa5ha   (2005-04-09 15:51) [17]

XProger, спасибо. Ща воткну.

Скайбокс устраивает на земле. А как делают в авиасимуляторах небо? Хотя бы намек.

Как кламп отменить, чтоб текстуры тайлить?

Зачем нужно glColor, если есть материалы?

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); // цвет примитива не учитывается
А как отменить эту команду? Т.е. включить смешивание текстуры с цветом примитива?


 
XProger ©   (2005-04-09 17:13) [18]

1) Вместо клампа ставь GL_REPEAT
2) Вместо GL_DECAL ставь GL_MODULATE

Небо, хм... ну собсна вокруг планеты нашей чёрный космос вот.
Следовательно тебе нуна добиваться голубого неба путём использования GL_FOG и имхо для этого лучше использовать GL_EXT_FOG_COORD (расширение).
Но, можно обойтись без этого. Просто рисуя скайбокс без текстуры.
Как рисуем:
На высоте около 20 км (макс высота полёта допустим) небо будет уже совершенно чёрным :)
Следовательно цвет скайбокса там будет (0 0 0).
На высоте 0 над уровнем океана небо голубое и цвет скайбокса соотвтетвенно (70 170 255) к примеру.
У нас есть текущая высота (H), и максимальная (20 км). Определяем цвет скайбокса.

R := 70 - trunc(70/20*H);
G := 170 - trunc(170/20*H);
B := 255 - trunc(255/20*H);
glColor3ub(R, G, B);

Всё цвет скай бокса установили. Затем чтобы нарисовать его нам нужно:
1) Повернуть камеру (без смещения)
2) Отключить тест глубины
3) Отключить текстуру
Всё... далее рисуешь скайбокс. Затем пойдёт отрисовка ландшафта и летательного аппарата :)


 
Pa5ha   (2005-04-10 14:24) [19]

Небо тогда получается без текстур. А как тогда с облаками быть?

Думал думал, почему ФПС резко упал, а потом вспомнил, что купил новый монитор =) Как отключить синхронизацию, а то у меня при 1280х1024 фпс до 36 падает при всего 1000 полигонов? Т.е. при таком раскладе у меня максимум может быть 70 в лучшем случае. Почему же в КС ФПС держится стабильно на 60 при том же разрешении на OpenGL рендере, хотя там намного все сложнее?


 
XProger ©   (2005-04-10 18:25) [20]

А сколько BPP выставил? Ато большинство карточек "презирают" 32 бит на пиксель ;)


 
Pa5ha   (2005-04-10 22:35) [21]

Я тут так подумал... glDeleteTexture удалят текстуру или только указатель на её? Для создания её выделяется память: GetMEM. Вызывает ли glDeleteTexture FreeMEM?


 
XProger ©   (2005-04-11 00:57) [22]

ты выделаешь память под буфер, затем передаёшь OGL значения из него , он в свою очередь копирует их в память видяхи и создаёт текстурку. После этого твой буфер уже не нужен и ты его можешь смело высвобождать.
А саму текстуру из памяти видяхи удаляй при помощи glDeleteTexture


 
parovoZZ ©   (2005-04-12 09:31) [23]

А вот в функции gluPerspective каким должен быть угол зрения камеры, чтобы отображалось всё правильно (60 градусов? по аналогии с фототехникой).


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

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


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

Примеры Джона Хорна имеют возможность запускаться в полноэкранном режиме. Для этого служит флаг 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;


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


 
Zak3D[@Tm] ©   (2005-04-12 23:01) [26]

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

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;


 
XProger ©   (2005-04-12 23:10) [27]

"не более 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.
Ян Хорн будет правильнее...


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


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

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

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


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

Это где такие ограничения на 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-13 01:37) [30]

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

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

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

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


 
XProger ©   (2005-04-13 01:54) [31]

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

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

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


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


 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


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

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


 
XProger ©   (2005-04-13 14:08) [34]


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

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

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


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

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

Значит так: =)
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] -


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

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


 
XProger ©   (2005-04-13 17:25) [37]

То что я тебе дал работает 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 20:40) [38]

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


 
XProger ©   (2005-04-13 22:30) [39]

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

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 22:48) [40]

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

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


 
Zak3D[@Tm] ©   (2005-04-13 23:50) [41]

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


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

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


 
dRake ©   (2005-04-14 02:21) [43]

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

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


 
Pa5ha   (2005-04-14 12:20) [44]

Нет. Просто бесконечный цикл завершается. В конце припишу PostQuitMessage.
Что ещё для этого надо? Какие обработчики?


 
Pa5ha   (2005-04-14 12:39) [45]

PostQuitMessage(0); вставил. Лучше не стало.


 
Zak3D[@Tm] ©   (2005-04-14 14:40) [46]

Pa5ha
Покажи как приложение закрываешь.


 
Zak3D[@Tm] ©   (2005-04-14 14:45) [47]

Наверно ты DestroyWindow(...) забыл сделать.


 
Pa5ha   (2005-04-14 15:59) [48]

Блин, все написал, отправил, интернал сервер эррор. Короче. В двух словах. Дестрой Окна у меня есть. Весь проект в этой части как две капли с Хорновским basicEngine. Такая бага появляется только после завершения из фуллскрина. Потом на эту кнопку нажимаешь и она исчезает.


 
Zak3D[@Tm] ©   (2005-04-14 17:33) [49]

Может Windows.UnregisterClass( AppName, hInstance ); не делаешь?
А вообще не знаю, на код смотреть нужно, а Хорновского Енгина нет ща под рукой.


 
П7   (2005-04-14 17:39) [50]

Даже если и не делать анрег - не должна бага выскакивать...


 if FullScreen then
 begin
   ChangeDisplaySettings(TDevMode(nil^), CDS_FULLSCREEN);
   Log.Msg("Set normal screen settings.");
 end;
 if DestroyWindow(Wnd) then
   Log.Msg("Window is destroyed.")
 else
   Log.Err("Window is NOT destroyed.");
 if UnregisterClass(WIN_CLASS_NAME, Instance) then
   Log.Msg("Window class is unregistered.")
 else
   Log.Err("Window class is NOT unregistered.");


Вот как делаю я... Проблем не замечал.


 
Venom Spawn ©   (2005-04-14 17:43) [51]


>    ChangeDisplaySettings(TDevMode(nil^), CDS_FULLSCREEN);


Вот! Давно хотел узнать - что есть такое разыменовывание указателя nil? (Препод по инфе сказал что это попросту не скомпилится :), тем не менее у Яна Хорна всё пашет!)


 
П7   (2005-04-14 17:47) [52]

Видно не шибко твой препод рубит... (: Так ему и передай! (:


 
Venom Spawn ©   (2005-04-14 17:49) [53]

И всё же, что получается при Nil^?


 
П7   (2005-04-14 17:53) [54]

А потестить самому?


 
П7   (2005-04-14 18:30) [55]

http://burks.bton.ac.uk/burks/language/pascal/uddf/pages/fullscrn.htm - в самом конце...
думаю сам догадаешься... И препода научишь. (:


 
Pa5ha   (2005-04-14 19:29) [56]

У меня "absolute 0" не компилится.


 if CFG.EngineSet.Fullscreen  then             // Change back to non fullscreen
 begin
   ChangeDisplaySettings(devmode(nil^), 0);
 end;

...

 if ((h_DC > 0) and (ReleaseDC(h_Wnd, h_DC) = 0)) then
 begin
   MessageBox(0, "Release of device context failed!", "Error", MB_OK or MB_ICONERROR);
   h_DC := 0;
 end;

 // Attempts to destroy the window
 if ((h_Wnd <> 0) and (not DestroyWindow(h_Wnd))) then
 begin
   MessageBox(0, "Unable to destroy window!", "Error", MB_OK or MB_ICONERROR);
   h_Wnd := 0;
 end;

 // Attempts to unregister the window class
 if (not UnRegisterClass("OpenGL", hInstance)) then
 begin
   MessageBox(0, "Unable to unregister window class!", "Error", MB_OK or MB_ICONERROR);
   hInstance := 0;
 end;


Фрагмент моего кода.


 
П7   (2005-04-14 20:40) [57]

И на каком отрезке вашего кода возникает ошибка?


 
Pa5ha   (2005-04-14 23:35) [58]

П7, блин :), ошибка не вылетает. Кнопка застревает на панели. Потом кликнешь и она исчезает.


 
cyborg ©   (2005-04-15 08:31) [59]


> [50] П7   (14.04.05 17:39)
>    ChangeDisplaySettings(TDevMode(nil^), CDS_FULLSCREEN);

Чего это такое? По нулевому адресу неизвестно чего указываешь? Очень странно, что это работает.


 
XProger ©   (2005-04-15 13:19) [60]

cyborg,
Функция требует var переменную (указатели в C++)
Ты даёшь ей переменную, которая по сути нильная. Функция видит что ей подали nil и возвращает видео режим на тот что прописан в реестре.

Pa5ha,
Вот тебе код из моего движка который 100% работает (проверено ;)

procedure xglClose; stdcall;
begin
Log(" ");
Log("---- R_Close ----");
Log("Shutting down OpenGL subsystem");
if not inWindow then  // Change back to non fullscreen
begin
ChangeDisplaySettings(devmode(nil^), 0);
ShowCursor(True);
end;

if xglGamma_def <> xglGamma_Get then
begin
Log("...Restore default display brightness to " +IntToStr(xglGamma_def)+ "% : success");
xglGamma_Set(xglGamma_def);
end;

if wglMakeCurrent(DC, 0) then
Log("...wglMakeCurrent( NULL, NULL ): success")
else
Log("...wglMakeCurrent( NULL, NULL ): failed");

if wglDeleteContext(RC) then
Log("...deleting GL context: success")
else
begin
Log("...deleting GL context: failed");
RC:=0;
end;

if (DC > 0) and (ReleaseDC(Handle, DC) <> 0) then
Log("...releasing DC: success")
else
begin
Log("...releasing DC: failed");
DC:=0;
end;

if (Handle <> 0) and (DestroyWindow(Handle)) then
Log("...destroying window: success")
else
begin
Log("...destroying window: failed");
Handle := 0;
end;

Log("---- finished R_Close ----");
end;


 
Pa5ha   (2005-04-15 17:10) [61]

XProger, После DestroyWindow надо вызывать UnregisterClass. Или нет? У меня все точно так же. В общем, незнаю. Буду искать багу.

В функции возврата гаммы лучше сначала вызватьxglGamma_Set(xglGamma_def);
, а потом написать в лог, что операция выполнена успешно :)


 
XProger ©   (2005-04-15 19:40) [62]

Pa5ha, xglGamma_Set(xglGamma_def) всегда выполняется успешно ;)
Я класс окна не убиваю, и ничего ужасного не происходит... :D


 
Pa5ha   (2005-04-15 23:04) [63]

Итак, пришло время по-тохому пытаться написать что то типа игры. Как это сделать???

Как грамотно оганизовать работу с LOD?
Переднюю и заднюю плоскости отсечения (ну или как из там) надо задавать только для сцены целиком?


 
XProger ©   (2005-04-16 01:28) [64]

Тебе помогут ГеймДевки! =)
http://GameDev.ru


 
Pa5ha   (2005-04-18 23:02) [65]

А как сделать, чтоб прога в свернутом состоянии меньше жрала?


 
XProger ©   (2005-04-19 02:19) [66]

Если прогу минимизировали останавливай цикл. Или добавь в него Sleep :) До тех пор, пока не откроют снова...


 
parovoZZ ©   (2005-04-19 09:47) [67]

А sleep винду не затормозит? Как-то засунул этот слип (1000), так вся винда в предсмертные судуроги впала.


 
Pa5ha   (2005-04-19 12:51) [68]

Ну дак а как этот цикл остановить? В том то и дело.


 
XProger ©   (2005-04-19 13:07) [69]

Да... со слипом эт я сморозил...
Но можно и так:

while not isQuit do
begin
while PeekMessage(msg, 0, 0, 0, PM_REMOVE) do
 begin
 TranslateMessage(msg);
 DispatchMessage(msg);
 if isQuit then
  Exit;
 end;
... // тут апдейт и отрисовка
if not glActive then // этот флажок меняешь когда сворачивают/разворачивают прогу
 WaitMessage;
end;


 
Pa5ha   (2005-05-05 15:35) [70]

Привет! Это опять я. Что то часто не грузиться у меня форум... =(
На гейм деве что то ничего не нашел интересного. Скорее всего, не там смотрел.

Интересно, как в авиасимах отрисовывается ландшафт на 50км? Это так далеко задняя отсекающая плоскость? А потом как отрисовывается модель? Плз, нет ли у кого ссылочки на грамотное создание лодов? http://Gamedev.ru не пойдет =)

Пытался сделать ауру от света фонарей (ну или как это наз-ся...) Не получается создать из восьмибитного BMP-файла восьмибитную текстуру. Модуль ДжонаХорна вылетает при возвращении управления из функции LoadBitmap, но первая строка (запись в лог) после вызова этой функции не выполняется. Не могу пока понять, в чем дело. Не поможет ли кто кодом создания 8-мибитной текстуры из 8-битного BMP-файла (с загрузкой последнего)?


 
Sapersky   (2005-05-05 18:21) [71]

http://Gamedev.ru не пойдет =)

И всё-таки http://Gamedev.ru :)
По лодам для ландшафта (геомипмэппингу) там была весьма неплохая статья. Как раз применительно к симулятору.
Ещё можно поискать по словосочетанию "chunked lod".


 
XProger ©   (2005-05-05 18:28) [72]

МЛЯ! Сколько раз уже повторял, не Джон, а Ян! ;)
И вообще, в его модуле нет поддержки 8 битных текстур! Там же ясно написанно 24 bit онли!

function LoadTex(const FileName: string): DWORD;
type
TaRGB = array [0..1] of record B, G, R : Byte; end;
PRGB  = ^TaRGB;
TaRGBA = array [0..1] of record R, G, B, A : Byte; end;
PRGBA  = ^TaRGBA;
var
bmp  : TBitmap;
x, y : integer;
Data : PRGBA;
p    : PRGB;
idx  : integer;
begin
Result := 0;
bmp := TBitmap.Create;
try
bmp.LoadFromFile(FileName);
bmp.PixelFormat := pf24bit;
GetMem(Data, bmp.Width*bmp.Height*4);
idx := 0;
for y := 0 to bmp.Height - 1 do
 begin
 p := bmp.ScanLine[y];
 for x := 0 to bmp.Width - 1 do
  begin
  Data[idx].R := p[x].R;
  Data[idx].G := p[x].G;
  Data[idx].B := p[x].B;
  // Вот если чёрный то альфа текселя равна 0... вот :)
  if Data[idx].R + Data[idx].G + Data[idx].B = 0 then
   Data[idx].A := 0
  else
   Data[idx].A := 255;
  inc(idx);
 end;
end;
except
bmp.Free;
Exit;
end;
glGenTextures(1, @Result);
glBindTexture(GL_TEXTURE_2D, Result);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
// $8058 - это типа GL_RGBA8, т.е. насильное отменение сжатия текстур видяхой...
gluBuild2DMipmaps(GL_TEXTURE_2D, $8058, bmp.Width, bmp.Height, GL_RGBA, GL_UNSIGNED_BYTE, Data);
bmp.Free;
FreeMem(Data);
end;

Грузит любой bmp в 32 битную текстурку, при этом чёрный цвет - прозрачный!
Ну не правда ли гениально а? ;)

Далее по поводу 50 км. А вот когда ты взлетаешь... линия горизонта меняет своё положение? Впринципе этим можно принебреч. А следовательно вот тебе и те самые скай боксы ;) Сделай голубой горизонт и голубой туман (так оно на самом деле и есть по свойствам атмосферы). И вроде никаких проблем возникнуть не должно :)

P.S.
8 bit bmp жмутся намного хуже ч/б tga ;)


 
Pa5ha   (2005-05-05 19:23) [73]


> МЛЯ! Сколько раз уже повторял, не Джон, а Ян! ;)

Ы, первый раз слышу:)

Модуль тот, который грузит тока БМП. Так и наз-ся BMP.pas =)

Ващета мне надо было сделать свечение вокруг фонаря (лампы). Сделал блендингом. Вроде так ничо. Жить можно. Но хотел восьмибитной альфитекстурой все же ) Ладно.

Насчет скайбокса тоже думал... ХЗ чо там и как ) По идее, если это модельный симулятор, то камера будет все время на земле, но хотелось сделать преследующую камеру. Посмотрем. Будем искать.

Кста, ещё насчет света фар/фонарей. Рисую плоскость с текстурой (блендингом), перпендикулярную линии взгляда. При повороте эта плоскость проходит через капот/крыло/что угодно и получается некрасиво. Если не понятно, сделаю скрин. Давно хотел узнать как от этого избавиться.


 
XProger ©   (2005-05-05 19:55) [74]

glDisable(GL_DEPTH_TEST) знаем такое? ;)


 
Pa5ha   (2005-05-05 21:26) [75]

XProger, знать то знаем, но при выглюченом тесте глубины блик (так называется) будет рисоваться всегда. Вощем, на геймдеве написано, что надо проверять расстояние до источника света. Пока что то мне лень это делать. И так номано )


 
XProger ©   (2005-05-05 22:36) [76]

http://XProger.narod.ru (IE)
найди там XEngine... заберись на второй этаж и посмотри на лампочки. Так хотишь? ;)


 
Pa5ha   (2005-05-06 00:11) [77]

XProger, очень такая впечатляющая игрулина ) Сделать хочу так же и даже кажись знаю, как такое реализовать в коде. Будут вопросы, обращусь )


 
3DMan   (2005-07-28 18:14) [78]

ПАМАГИТЕ!!! Хачу в свой движок (пока што еще практически никакой) приделать скайбокс. Как ево сделать? Хачу такойже как и в Serious Sam. Падскажите.


 
DeadMeat ©   (2005-07-28 19:01) [79]


> ПАМАГИТЕ!!! Хачу в свой движок (пока што еще практически
> никакой) приделать скайбокс. Как ево сделать? Хачу такойже
> как и в Serious Sam. Падскажите.

Хъыы...
Приколист..

---
...Death Is Only The Begining...


 
Pa5ha   (2005-12-17 17:45) [80]

Итак, пришло время продолжить :)

Есть ли в ОпенГЛ цветовой ключ и как его юзать? Искал, не нашел. А в директ Иксе есть :)


 
П7   (2005-12-17 19:24) [81]

1. Есть альфа-канал.
2. Есть блендинг.
3. Есть альфа-маска.


 
Pa5ha   (2005-12-18 13:16) [82]

П7, аотфа-канал, как и маска (сужу только по названию) отпадают т.к. требуют отдельного слоя с альфа-компонентой. Можно поподробнее. Требуется просто задать прозрачность для определенного цвета без гимора. Т.е. переписывать загрузчик текстур и добвлять альфаканал - не канает. Да и ресурсоёмко.


 
П7   (2005-12-18 13:31) [83]

Ничё и не ресурсоёмко. Нету обычного цветового ключа в Опене.Читай Краснова в общем.


 
Pa5ha   (2005-12-18 13:39) [84]

Дак читал. Там его нету, это я уже понял :)

Как сделать, чтоб ничо не переписывать? Ломает :) Думал, ща пару строк вставлю типа glEnable(gl_color_key); :)

Я даж фотожоп не знаю. Как я буду альфу добавлять? :)

Можно про бленд что-нить поподробнее?

Что есть альфа-маска?

И ещё. Надо где-нить физику самолета нарыть. Статью какую-нить. А то я даже не знаю, с какой стороны подойти.


 
Кефир87 ©   (2005-12-18 13:56) [85]

Ну придется переписывать (дописывать) загрузщик. Я это уже делал:

function LoadSprite(const BMP24 : string):GLuint;
var
 bf   : TBitmapFileHeader;
 bi   : TBitmapInfoHeader;
 f    : file of Byte;
 size : Cardinal;
 p,a  : Pointer;
 x    : Integer;
begin
 Result := 0;
 AssignFile(f, BMP24);
 Reset(f);

 BlockRead(f, bf, sizeof(bf));

 if bf.bfType = $4D42 then
 begin
   BlockRead(f, bi, sizeof(bi));

   if bi.biBitCount = 24 then
   begin
     size := bi.biWidth*bi.biHeight*3;
     GetMem(p, size);
     BlockRead(f, p^, size);
     GetMem(a, bi.biWidth*bi.biHeight*4);

     for x := 0 to bi.biWidth*bi.biHeight-1 do
     begin
       TRGBAarr(a^)[x].r := TBGRArr(p^)[x].r;
       TRGBAarr(a^)[x].g := TBGRArr(p^)[x].g;
       TRGBAarr(a^)[x].b := TBGRArr(p^)[x].b;

       if (TBGRArr(p^)[x].r = 255)and(TBGRArr(p^)[x].g=0)and(TBGRArr(p^)[x].b = 255)then
         TRGBAarr(a^)[x].a := 0 else
           TRGBAarr(a^)[x].a := 255;

     end;

     Result := GenTexture(a, bi.biWidth, bi.biHeight, 32, GL_RGBA);

     FreeMem(a);
     FreeMem(p);
   end;
 end;

 CloseFile(f);
end;


Надеюсь понятно что GenTexture делает текстуру по указателю 8)


 
П7   (2005-12-18 13:59) [86]

Переписывать придётся загрузчик текстур.
0. Выделяем память под текстуру с альфаканалом.
1. Читаем пиксель
2. Если пиксель <> цветовой ключ то [3] иначе [4]
3. Заносим пиксель в дату текстуры с альфой = 1.0 и [1]
4. Заносим в дату тектуры пиксель чёрного (или любого другого) цвета с альфой = 0.0 и [1]

Так, теперь мы можем выводить 2 способами.
1. С помощью блендинга - долго, но красиво и поддерживается всякие способы + прозрачность отдельных пикселей от 0.0 до 1.0.
2. Альфа-маской (альфа-отсечением) - быстро и в качестве замены уветового ключа - самое оно. Задаётся минимальная видимая прозрачность - остальное вырезается.

Поподробнее тебе расскажет твой друг РАМБЛЕР! (:


 
Pa5ha   (2005-12-18 14:02) [87]

Дак а нет расширений никаких, чтоб именно цветовой глюч? Ведь в директе есть! Значит, аппаратно реализован! Значит огород городить не стоит. Ладно. Сам найду. Если не найду... то за исходники спасибо :)


 
Pa5ha   (2005-12-18 14:17) [88]

Увы и ах :) Нашел точно такой же топ :) Где на просторах :)

Придется делать альфу :(

С альфомаской как делать - примерно представляю. На д3д делал. Надо только новый синтаксис освоить :)

И исчо: чо там насчет физики самолета? Расскажите хоть, как подступиться. (а может ветку новую задвинуть? :) )


 
Кефир87 ©   (2005-12-18 15:54) [89]


> Переписывать придётся загрузчик текстур.
> 0. Выделяем память под текстуру с альфаканалом.
> 1. Читаем пиксель
> 2. Если пиксель <> цветовой ключ то [3] иначе [4]
> 3. Заносим пиксель в дату текстуры с альфой = 1.0 и [1]
> 4. Заносим в дату тектуры пиксель чёрного (или любого другого)
> цвета с альфой = 0.0 и [1]


Это именно то, что я написал 8)


 
XProger ©   (2005-12-18 16:18) [90]

Pa5ha, сперва тебе необходимо побороть свою лень. А физику самолёта в МАИ тебе расскажут...


 
П7   (2005-12-18 18:49) [91]

РАМБЛЕР - твой друг!


 
NE_Parovoz ©   (2005-12-18 19:57) [92]

Pa5ha
>>Ведь в директе есть! Значит, аппаратно реализован!
в dx sdk так и написано, что аппаратно?

имхо, единственные способ "hardware" реализации (если это можно так назвать) - шейдеры

но зачем это надо?


 
Pa5ha   (2005-12-18 21:18) [93]


> П7   (18.12.05 18:49) [91]
> РАМБЛЕР - твой друг!

Гы. В таком слечае этот форум вообще не нужен.

С МАИ тоже, конечно, остроумная шутка. За физикой автомобиля идти к форду, за построением уровней к строителям, документацией по карточке идти в представительство ATI,nVidia...


 
XProger ©   (2005-12-18 21:47) [94]

Pa5ha, я знал, что ты смышлёный парень...


 
DR0N ©   (2005-12-18 22:17) [95]

Видите, всегда все гениальное - просто...
Уровни для Кваки4 делали профессиональные  инженеры-проектировщики =) им сейчас мало платят, вот в коммерцию подались =D


 
Pa5ha   (2005-12-22 22:52) [96]

глупость какая. Не могу цветовой глюч написать.

{------------------------------------------------------------------}
{  Load texture with color key                                     }
{------------------------------------------------------------------}
function LoadSprite(const BMP24 : string;mipmap:boolean):GLuint;
const
 ColorKey: Cardinal = $00FFFFFF;
type
 PPixelArray = ^TPixelArray;
 TPixelArray = array [0..0] of Byte;
var
bf   : TBitmapFileHeader;
bi   : TBitmapInfoHeader;
f    : file of Byte;
size : Cardinal;
p,a  : PPixelArray;//Pointer;

x    : Cardinal;
begin
 p:=nil;
 a:=nil;

Result := 0;
AssignFile(f, BMP24);
Reset(f);

BlockRead(f, bf, sizeof(bf));

if bf.bfType = $4D42 then
begin
  BlockRead(f, bi, sizeof(bi));

  if bi.biBitCount = 24 then
  begin
    size := bi.biWidth*bi.biHeight;
    GetMem(p, size*3);if p = nil then MessageBox(0, PChar("Can""t create ""p"""), "Loading Textures", MB_OK);
    BlockRead(f, p^, size*3);
    //SwapRGB24(p, size);
    GetMem(a, size*4);if a = nil then MessageBox(0, PChar("Can""t create ""a"""), "Loading Textures", MB_OK);

    for x := 0 to size-1 do
    begin
       a[x*4+0]:=p[x*3+2];
       a[x*4+1]:=p[x*3+1];
       a[x*4+2]:=p[x*3+0];
       a[x*4+3]:=255*
                 ord((p[x*3+0]<>((ColorKey and $00FF0000) shl 16))or
                     (p[x*3+1]<>((ColorKey and $0000FF00) shl 8))or
                     (p[x*3+2]<>((ColorKey and $000000FF) shl 0)));
//      TRGBAarr(a^)[x].r := TBGRArr(p^)[x].r;
//      TRGBAarr(a^)[x].g := TBGRArr(p^)[x].g;
//      TRGBAarr(a^)[x].b := TBGRArr(p^)[x].b;

//       if (TBGRArr(p^)[x].r = 255)and(TBGRArr(p^)[x].g=0)and(TBGRArr(p^)[x].b = 255)then
//         TRGBAarr(a^)[x].a := 0 else
//           TRGBAarr(a^)[x].a := 255;

    end;

//     Result := GenTexture(a, bi.biWidth, bi.biHeight, 32, GL_RGBA);

 glGenTextures(1, Result);

//  glBindTexture(GL_TEXTURE_2D, Result);
 { Select a filtering type. BiLinear filtering produces very good results with little performance impact
   GL_NEAREST               - Basic texture (grainy looking texture)
   GL_LINEAR                - BiLinear filtering
   GL_LINEAR_MIPMAP_NEAREST - Basic mipmapped texture
   GL_LINEAR_MIPMAP_LINEAR  - BiLinear Mipmapped texture
 }
 if mipmap then
   begin
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR); { only first two can be used }
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); { all of the above can be used }
     gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, bi.biWidth, bi.biHeight, GL_RGBA, GL_UNSIGNED_BYTE, a);
   end else
   begin
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); { only first two can be used }
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); { all of the above can be used }
     glTexImage2D(GL_TEXTURE_2D, 0, 3, bi.biWidth, bi.biHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, a);  // Use when not wanting mipmaps to be built by openGL
   end;

    FreeMem(a);
    FreeMem(p);
  end else
      MessageBox(0, PChar("Texture not loaded"), PChar("BMP Unit"), MB_OK);
end;

CloseFile(f);
end;


Короче, он грузит текстуру, но на ней какие-то полоски :)

И все остальные текстуры тоже грузятся с одними полосками, хотя грузяться другой функцией. Не могу понять, где собака порылась. Или мне надо идти учить матчасть?


 
Добрый   (2005-12-23 13:24) [97]

Можно юзать 8-битные текстуры? Да/нет.


 
XProger ©   (2005-12-23 17:47) [98]

Pa5ha, учить
Добрый, Да


 
XProger ©   (2005-12-23 21:41) [99]

Подсказка: смотри на значение параметров для glTexImage2D


 
Добрый   (2005-12-24 20:35) [100]

XProger, Вах, я тормоз :) Свежий взгляд внёс свежую струю. Спасибо :)


 
Pa5ha   (2005-12-24 20:36) [101]

Это был я :)


 
Pa5ha   (2005-12-24 20:52) [102]

Блин, лучше на стало. Это я исправил после того, как запостил :(


 
Pa5ha   (2005-12-24 21:06) [103]

Ладно, не парьтесь пока. перепишу по своему, посмотрим. Жаль, что мессаги не добавляются. Флуд получается из кучи мессаг одного человека. Я не умею сразу выразить свою мысль :)



Страницы: 1 2 3 вся ветка

Форум: "Игры";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.75 MB
Время: 0.074 c
2-1156982136
AlDun
2006-08-31 03:55
2006.09.24
Access Violation


2-1157193648
иван8511
2006-09-02 14:40
2006.09.24
Сменить стиль шрифта


2-1157319054
ramzes2
2006-09-04 01:30
2006.09.24
как назначить родителя диалогу


2-1157024256
2face
2006-08-31 15:37
2006.09.24
Ошибка


15-1157028811
Мимо проходил
2006-08-31 16:53
2006.09.24
Про Ветхий Завет





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский