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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2011, 13:15   #1
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию OpenGL. Текстуры.

Добрый день. Опять я что-то неправильно "смешал". Изучая текстуры в OpenGL, решил (всегда так делаю) изменить код, а не списать. И что-то не так сделал. Получившийся куб не имеет текстуры, точнее самой текстурой является один и тот же цвет, а еще точнее - пиксель картинки 64 на 64. Исходник во "вложениях".
Буду благодарен.
Вложения
Тип файла: zip Kub.zip (203.2 Кб, 14 просмотров)

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 22.05.2011, 15:27   #2
RomiKon
Форумчанин
 
Регистрация: 11.04.2010
Сообщений: 143
По умолчанию

Ну тут всё просто. Координаты текстуры тоже указывать надо. По вашему коду(особенно по комментарию) я вижу что вы не поняли принципа наложения текстур. Советую ознакомится с таковой ещё раз. А пока вот держите пример.
Вложения
Тип файла: zip Kub.zip (218.9 Кб, 29 просмотров)
RomiKon вне форума Ответить с цитированием
Старый 22.05.2011, 15:40   #3
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Спасибо большое. Перечитал NeHe. glTexCoord2f имеет два параметра. Это координаты текстуры, а не независимый прямоугольник. Немного иначе понял урок.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 22.05.2011, 16:42   #4
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Не подскажите, почему текстура перевернутая?

Где-то спотыкался через такую тему.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 22.05.2011, 17:05   #5
RomiKon
Форумчанин
 
Регистрация: 11.04.2010
Сообщений: 143
По умолчанию

Текстура перевёрнутая потому что в Windows принято что ось Y направлена вниз, а в OpenGL вверх. Проблема решается тремя способами:
1) направить ось Y в OpenGL вниз(самый плохой способ)
2) инвертировать второй параметр функции gltexcoord2f(x, 1-y);
3) перевернуть растр текстуры в любом графическом редакторе( я так всегда и делаю)
RomiKon вне форума Ответить с цитированием
Старый 22.05.2011, 18:41   #6
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Спасибо большое. Извините, у меня еще один вопрос (надоел, наверное, я уже) думаю, что он будет в тему, так как мой способ не очень хорош (использование битмапа, цикла и т.д.).
Вот нашел код, который опубликовал XProger(не могу нарушать авторское право).
Код:
var
  F : File;
  Size : Integer;
  Data : Pointer;
begin
  AssignFile(F, 'myfileblabla.raw');
  Reset(F, 1);
  Size := FileSize(F);
  GetMem(Data, Size);
  BlockRead(F, Data^, Size);
  CloseFile(F);
  
  glGenTextures(1, @Result);
  glBindTexture(GL_TEXTURE_2D, Result);
... // какие-то дополнительные параметры текстуры
  glTexImage2D(......, Data);
  FreeMem(Data);
end;
Написано, что этот способ более эффективен, а точнее - быстрей. Меня интересует значение процедур и откуда берется Result:
Код:
  glGenTextures(1, @Result);
  glBindTexture(GL_TEXTURE_2D, Result);
. Почему-то в гугле не нашел. Узнал только о том, что без этих функций никак. Хотя убрав их, получается нормальная текстура, наверное.

Большое спасибо за ответы.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 22.05.2011, 18:56   #7
RomiKon
Форумчанин
 
Регистрация: 11.04.2010
Сообщений: 143
По умолчанию

Ну начнём с того с в первой версии OpenGL чтобы заново использовать текстуру нужно было повторно загрузить её в память при помощи всем известной функции glTexImage2D. Это было очень неудобно поэтому в версии 1.1(вроде бы, а может в 1.2=)) ввели понятие текстурных объектов. Это такие указатели на область памяти в видеокарте. теперь благодаря им можно один раз загрузить текстуру в видео память и работать с ней через указатель. Был введён ряд новых функций.
Код:
  glGenTextures(count: Integer; var tex: PGLUint); 
  //эта функция генерирует count новых текстурных объектов и 
  //записываетуказатели на них в tex
  glGenTextures(1, @ID); // теперь в ID хранится указатель на одну текстуру
  // далее нужно как то указывать с какой текстурой мы хотим работать
  // для этого появилась функция 
  glBindTexture(GL_TEXTURE_2D, ID); // делает активной текстуру ID
  // теперь можно старыми методами загрузить текстуру
  // glTexImage или glBuild2DMipMaps
Откуда берётся Result? Так это же стандартная переменая любой функции, нужна для возврата значений
А вообще вам ещё рано так далеко уходить в изучении OpenGL.
RomiKon вне форума Ответить с цитированием
Старый 22.05.2011, 19:03   #8
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Спасибо большое. Буду знать.
--Add
А что это за тип PGLUint? Указатель или что?

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог

Последний раз редактировалось _PROGRAMM_; 22.05.2011 в 19:35.
_PROGRAMM_ вне форума Ответить с цитированием
Старый 22.05.2011, 19:38   #9
RomiKon
Форумчанин
 
Регистрация: 11.04.2010
Сообщений: 143
По умолчанию

Ну это просто тип OPenGL, используй обычный Cardinal
RomiKon вне форума Ответить с цитированием
Старый 22.05.2011, 20:05   #10
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Еще раз извините. Можете написать, а точнее дописать эти две строчки правильно(glGenTextures(1, @Result); glBindTexture(GL_TEXTURE_2D, Result); )? Я думаю, что нигде такой информации я не найду.
У меня delphi 7, поэтому заголовочный файл устаревший и данных процедур нет. Я их сам дописал (не знаю правильно ли) и не получил результата. В папку с приложением положил свой OpenGL.pas, поэтому, если будите компилировать удалите его. Еще одна просьба. Киньте свой OpenGL.pas, если он у вас "рабочий» (т.е. работают эти процедуры).

С огромным уважением.
Вложения
Тип файла: zip Kod.zip (266.8 Кб, 17 просмотров)

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Приближение и удаление от текстуры.(Opengl) peredozer Мультимедиа в Delphi 3 10.05.2010 02:59
OpenGL и текстуры N!ckeL Gamedev - cоздание игр: Unity, OpenGL, DirectX 7 05.05.2010 15:46
OpenGL некорректное наложение текстуры Selestis Мультимедиа в Delphi 1 03.02.2009 19:59
Текстуры OpenGl Stanislav Мультимедиа в Delphi 7 17.12.2008 17:55
OpenGL текстуры NoName_emaNoN Win Api 3 29.11.2007 20:11