Главная страница
    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?



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

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

Наверх





Память: 0.57 MB
Время: 0.037 c
15-1157113395
Квэнди
2006-09-01 16:23
2006.09.24
Новый форум


11-1131206189
MTsv DN
2005-11-05 18:56
2006.09.24
Ручная прорисовка TreeView


1-1155502154
FireMan_Alexey
2006-08-14 00:49
2006.09.24
Вопрос по поводу Hook-a


2-1157402258
MAXHO
2006-09-05 00:37
2006.09.24
Как изменить цвет текста в отдельной ячейке таблицы?


15-1157054618
Игорь Шевченко
2006-09-01 00:03
2006.09.24
Дима Акуличев aka DiamondShark, с днем рождения!





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский