Я никогда не работал ни с OpenGL, ни с C++, ни с какими подобными гигантами программной части, которые используются для создания 3D игр, хотя бы уровня Half-life: Counter-Strike.
По этому позвольте в этой теме я буду задавать вопросы, которые так или иначе связаны с графической и технической частью создания игр. В качестве ответов так же принимаются ссылки на небольшие статьи (не книги).
Всю 3D графику на экран игры выводит OpenGL, а каким образом рисуются 2D объекты, т.е. тексты, спрайты на экране, меню и т.д., тоже OpenGL функции?
Для OpenGL нет разницы что рисовать, пусть это модель или карта? Т.е. везде используется одна система: считывание координат фигур из файла и их воспроизведение в 3D мире?
Почему используются текстуры определенных размеров (16x16, 64x64 и т.д.)? Легче для видеокарты?
OpenGL работает со светом и тенями? Как это вообще реализуется (светлые и темные области уровня)?
1. 2D объекты выводятся прямо перед камерой в ортогональной проекции.
Теми же самыми методами отрисовки.
2. Больше скажу - ОпенГЛ ни сном ни духом ни про какие-то там модели или карты. Это всего лишь слой абстракции для удобства конечного пользователя. Если будет надо - можно с таким же успехом вкомпилить в приложение набор вертексов и текстур и точно так же вывести на экран.
Так иногда поступают в демках физических движков - например модельку кролика зашивают в exe.
3. В принципе новые карточки поддерживают NON Power of two текстуры.
Но лучше не рисковать. Две-три сильно некратные текстуры способны просадить фпс до нуля.
4. Это смотря что понимать под работой со светом и тенями. Если на мапперском уровне - поставил лампочку на карту и включил её, то подобные методы там тоже есть, но они как правило медленные и кол-во источников ограничено шестью-семью. То что мы нарисовали без освещения можно либо затемнить либо еще больше засветить.
Попиксельное затемнение достигается наложением лайтмап на геометрию уровня (умножением яркости лайтмапы на текстуру). Можно делать вертексное освещение (регулировать цвет вертексов). Можно наконец в реалтайме тени накладывать, либо делать засветку простым сложением яркости. Да много методов вообщем.
Вот про модели освещения почитай, если интересно: http://steps3d.narod.ru/tutorials/l...g-tutorial.html
qpAHToMAS писал: Всю 3D графику на экран игры выводит OpenGL, а каким образом рисуются 2D объекты, т.е. тексты, спрайты на экране, меню и т.д., тоже OpenGL функции?
Вообще-то есть такая штука, называется растровые шрифты...Тоже средствами opengl реализовано.
2.
ИМХО нет.
3.Сам незнаю.
4.ДА. Светлые создается источник света, темные отбрасывание теней и всё.
Дядя Миша писал: 2D объекты выводятся прямо перед камерой в ортогональной проекции.
Теми же самыми методами отрисовки.
Удивительно и в тоже время страшно представить как же высчитываются их координаты ("в углу экрана", "от угла на 5 пикселей" и т.д.).
Если спрайт, например, того же радара в CS — это плоскость, то что из себя представляют такие сложные элементы, как консоль, главное меню настроек в том же CS или Option Implicit?
Еще вопросы:
На сколько я понимаю, что бы такая громадная штука как игра работала, надо использовать множество потоков? В одном обрабатывается физика на всем уровне, в другом: поведение игрока со стороны клиента, в прочих: поведение AI и т.д. Это действительно так (уж очень сложно)?
Коллизии и физика в целом напрямую работают с OpenGL, что бы например просчитывать столкновение камеры с картой (как в QuakeIII в режиме наблюдения нельзя летать сквозь карту)?
Удивительно и в тоже время страшно представить как же высчитываются их координаты ("в углу экрана", "от угла на 5 пикселей" и т.д.).
Ничего такого самому высчитывать не надо, всё гораздо проще.
Цитата:
На сколько я понимаю, что бы такая громадная штука как игра работала, надо использовать множество потоков?
Вовсе нет. Обычно, если к игре прикручивают многопоточность, то это для того, чтобы что-нибудь оптимизировать (использовать многоядерность, или что-нибудь загружать в фоне)
Цитата:
Коллизии и физика в целом напрямую работают с OpenGL
qpAHToMAS писал: Удивительно и в тоже время страшно представить как же высчитываются их координаты ("в углу экрана", "от угла на 5 пикселей" и т.д.).
А что в этом страшного? У тебя есть четыре глобальных координаты - четыре угла экрана. От них обычно все и пляшут.
Надо нам, к примеру. нарисовать иконку фонарика, так и пишем:
От правого края экрана отступ минус 10 пикселей.
И от верха плюс 10. (0,0 обычно считается за левый верхний угол экрана).
Цитата:
qpAHToMAS писал: Если спрайт, например, того же радара в CS — это плоскость, то что из себя представляют такие сложные элементы, как консоль, главное меню настроек в том же CS или Option Implicit?
Не поверишь - точно такие же плоскости.
Консоль - это картинка, на которую "мовевитчем" привязаны буквы.
Цитата:
qpAHToMAS писал: надо использовать множество потоков
Потоки как правило виртуальные, по типу тчинков в той же халфе.
Настоящие потоки очень муторно использовать из-за синхронизации.
К тому же код, отлично работающий на одной платформе, может давать сбои на другой.
Дядя Миша писал: Потоки как правило виртуальные, по типу тчинков в той же халфе.
Что-то ничего нагуглить нормального про эти "Виртуальные потоки" не могу , есть какая-нибудь ссылка на теоретическое объяснение того, что это такое и чем они отличаются от обычных, полностью отдельных потоков?
Цитата:
BUzer писал: Физика не имеет никакого отношения к опенгл.
Видимо все "твердотельные" зоны 3D уровня имеют отдельное место в памяти и уже с этими данными работают всякие коллизии . Я то думал что можно прям так рулить:
qpAHToMAS можно одни и те же плоскости (точнее говоря - полигоны) скармливать как опенгл так и физическому движку. Не такого понятия как опенгл-плоскость. Плоскость она плоскость и есть. А вообще в современных играх обычно физическая модель хранится отдельно от визуальной и представляет из себя более упрощенную, низкополигональную модель.
qpAHToMAS писал: Что-то ничего нагуглить нормального про эти "Виртуальные потоки" не могу
ну я может быть неудачно выразился. Ну ты тчинки видел в хл1 ? А систему тчинков в хл2? Вот это оно и есть.
Цитата:
qpAHToMAS писал: если(opengl_плоскость_на_пути) { действие }
жэсть.
А если директ3Д или софтвар, тогда што?
Цитата:
Government-Man писал: можно одни и те же плоскости (точнее говоря - полигоны) скармливать как опенгл так и физическому движку
На кой чёрт опенглу плоскости? Они нужны только на этапе отсечения невидимых полигонов ну и для физики конечно.
Цитата:
Government-Man писал: А вообще в современных играх обычно физическая модель хранится отдельно от визуальной и представляет из себя более упрощенную, низкополигональную модель.
qpAHToMAS это всего лишь функции в которых выполняется логика энтить в хл (от англ. think - "думать"). В хл можно устанавливать функцию которая будет вызвана в следующий раз: SetThink( MyCoolThink ); и время вызова: pev->nextthink = gpGlobals->time + 0.5f;
"Виртуальными потоками" я бы эту систему не назвал...
К опенгл она тем более не имеет никакого отношения.
Government-Man, на сколько я понял — это простой поток, только в его начале стоит пауза, которую не допустимо было бы поставить в место, откуда вызывается функция.