Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.07.2010, 21:37   #1
ZotaC
Форумчанин
 
Аватар для ZotaC
 
Регистрация: 25.06.2009
Сообщений: 163
Смущение OpenGL и 2d-игры

Здравствуйте, наверняка, многие задумывались о создании 2d-игр на OpenGL, а кто-то даже и занимался этим. Вот, у меня возникли такие вопросы:

1. Как создавать карту из ячеек, если координаты в OpenGL не такие, как в Delphi? То есть, там координаты идут от -1 до 1. Короче, как переводить такие координаты в нормальные, если мне, например, хочется нарисовать карту, состоящую из ячеек 100х100 пикселей.

2. В OpenGL есть две такие функции:

glTexCoord2f(-1, 0);
glVertex2f(-1, 0);

Что обозначает первая из них? Да, да, я знаю, что это координата текстуры, которая берется из переменной типа glUInt. Но как она влияет на программу? Как ни пытался понять это, так и не смог.

3. Неужто при рисовании нужно каждый раз загружать изображение?

LoadTexture('0.tga', Texture, False);

И, кстати, что здесь значит слово False?

4. 50% загрузки процессора - это нормально, если я рисую на экране фон и одну текстуру 150х150 в формате tga, с альфа-каналом? Рисую в таймере с интервалом 31 мс.

5. Почему при рисовании фона на окне, развернутом на весь экран он рисуется 4 раза? Картинка с фоном - такого же размера, что и экран.

Заранее спасибо всем, кто ответит хотя бы на некоторые из этих вопросов.

Последний раз редактировалось ZotaC; 03.07.2010 в 21:40.
ZotaC вне форума Ответить с цитированием
Старый 03.07.2010, 22:16   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

1)можно переводить. а можно и установить какие хотите.
2)координата текстуры(которую нужно сначала применить)
3)я не знаю что это за функция, скорее всего можно сохранять её результат.
4)код в студию.
5)опять же нужен код.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.07.2010, 22:29   #3
ZotaC
Форумчанин
 
Аватар для ZotaC
 
Регистрация: 25.06.2009
Сообщений: 163
По умолчанию

Вот, что написано в таймере:

Код:
glClear(GL_COLOR_BUFFER_BIT);
  LoadTexture('Fon.jpg', Texture, False);
  glEnable(GL_TEXTURE_2D);
  glBegin(GL_QUADS);
    glTexCoord2f(-1, 1);
    glVertex2f(-1, 1);
    glTexCoord2f(1, 1);
    glVertex2f(1, 1);
    glTexCoord2f(1, -1);
    glVertex2f(1, -1);
    glTexCoord2f(-1, -1);
    glVertex2f(-1, -1);
  glEnd;
  LoadTexture('0.tga', Texture, False);
  glEnable(GL_TEXTURE_2D);
  glBegin(GL_QUADS);
    glTexCoord2f(-1, 0);
    glVertex2f(-1, 0);
    glTexCoord2f(0, 0);
    glVertex2f(0, 0);
    glTexCoord2f(0, -1);
    glVertex2f(0, -1);
    glTexCoord2f(-1, -1);
    glVertex2f(-1, -1);
  glEnd;
  SwapBuffers(DC);
ZotaC вне форума Ответить с цитированием
Старый 04.07.2010, 01:18   #4
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

У меня заработало почему-то только когда подправил на
Код:
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glEnable(GL_TEXTURE_2D); - не надо постоянно писать, только при создании формы например...
LoadTexture('Fon.jpg', Texture, False); - нужно вызывать только когда меняется текстура... И у меня частое её вызывание к жутким глюкам приводило...(
Цитата:
Но как она влияет на программу?
Всмысле? Выбираете какую точку на текстуре "использовать" для данной вершины... Обычно от 0 до 1... Или будет тайлинг...

У меня нету файлов tga да ещё и с альфа-каналом... Так что не могу проверить, но с блендингом вроде какие-то особые баги могут быть...

Про "5" можно поподробнее?
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 04.07.2010, 08:53   #5
ZotaC
Форумчанин
 
Аватар для ZotaC
 
Регистрация: 25.06.2009
Сообщений: 163
По умолчанию

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

Цитата:
LoadTexture('Fon.jpg', Texture, False); - нужно вызывать только когда меняется текстура... И у меня частое её вызывание к жутким глюкам приводило...(
Ну а как, например, быть, если в игре есть 15-20 текстур, которые нужно рисовать, да и плюс - анимация. Без частой замены точно не обойтись.

Цитата:
Всмысле? Выбираете какую точку на текстуре "использовать" для данной вершины... Обычно от 0 до 1... Или будет тайлинг...
Все, спасибо, 5 пункт исправлен. Заполнение было из-за непонимания действия функции glTexCoord2f(); Все заработало, когда я стал вводить в нее значения от 0 до 1. Я так понимаю, что это - координаты куска изображения, который мы берем из файла с рисунком, да? То есть, можно рисовать не весь файл, а только его часть. Тогда такой вопрос, аналогичный вопросу в 1 пункте (так я и не понял ответа на него). Если у меня есть спрайт с анимацией в одном файле, то как с помощью этой функции вычислять координаты того кадра, который нужно рисовать?

Последний раз редактировалось ZotaC; 04.07.2010 в 09:00.
ZotaC вне форума Ответить с цитированием
Старый 04.07.2010, 14:08   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
то как с помощью этой функции вычислять координаты того кадра, который нужно рисовать?
допустим ширина рисунка 256, тогда выходит так:
x/256-1
насчет y не помню...где там ноль?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.07.2010, 20:23   #7
ZotaC
Форумчанин
 
Аватар для ZotaC
 
Регистрация: 25.06.2009
Сообщений: 163
По умолчанию

А нельзя объяснить эти цифры, если не сложно? Быть может, получится использовать их и при переводе из обычных координат в координаты OpenGL (пункт 1).
ZotaC вне форума Ответить с цитированием
Старый 04.07.2010, 20:42   #8
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Цитата:
Быть может, получится использовать их и при переводе из обычных координат в координаты OpenGL
Вообще opengl можно настроить чтобы он использовал обычные координаты экрана (не 0,0-1,1 а например 0,0-640,480).
Погугли команды связанные с матрицами.

Последний раз редактировалось Вадим Буренков; 04.07.2010 в 20:50.
Вадим Буренков вне форума Ответить с цитированием
Старый 04.07.2010, 21:45   #9
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
Лампочка

У меня некоторые проблемы со свободным временем... Я ещё только начинаю с OGL разбираться...

Пытался начать изучение с одних видеоуроков, но думаю зря я так начал... Не оттуда ли вы модули используете для работы с OGL (dglOpenGL и Textures)? Один знакомый недавно сказал что они изначально кривые...
Цитата:
Ну а как, например, быть, если в игре есть 15-20 текстур, которые нужно рисовать, да и плюс - анимация. Без частой замены точно не обойтись.
Это я пока не выяснял... И самому интересно... У меня покачто всё с одной и той же текстурой делается... ^^

Цитата:
Я так понимаю, что это - координаты куска изображения, который мы берем из файла с рисунком, да? То есть, можно рисовать не весь файл, а только его часть.
Ну да... Надо будет попробовать сделать чтоб в одной картинке было несколько текстур (в некоторых играх такие видел)...


А при растягивании надо как-то вот так делать... Кажется.....
Код:
Procedure TForm1.FormResize(Sender: TObject);
var a: Integer;
begin
glPushMatrix;
a:=ABS(ClientWidth-ClientHeight) Div 2;
If ClientWidth>ClientHeight Then
      glViewport(a, 0, ClientHeight, ClientHeight)
Else
      glViewport(0, a, ClientWidth, ClientWidth);
glPopMatrix;
End;
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 04.07.2010, 22:13   #10
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Возьмите любой опенсорс движок на OpenGL и посмотрите как там проводится инициализация/рисование. Я только так могу в OpenGL разбираться .
Вадим Буренков вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
OpenGL...Игры без тормозов...Как?! saggy Мультимедиа в Delphi 10 03.07.2010 12:25
разработка игры "Реверси". Имеется код этой игры на С++ CD-RW Помощь студентам 0 28.03.2010 00:13
Хочу начать писать игры на OpenGL lionbeast Помощь студентам 2 02.10.2009 11:04
OpenGL Paul_AG C++ Builder 20 14.09.2009 19:07
OpenGL в С# LeGAl Общие вопросы .NET 0 30.04.2009 02:15