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

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

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.08.2014, 11:54   #1
JVlasov
Новичок
Джуниор
 
Регистрация: 05.08.2014
Сообщений: 4
По умолчанию Загрузка текстуры OpenGL

Здравствуйте! Начал работать с OpenGL на Delphi XE5. Все работает хорошо, однако текстуры не загружаются, если я загружаю их после создания формы, т.е. не в OnCreate. В примере загружаю текстуры img1 при создании формы и img2 при нажатии на кнопку.

Код загрузки текстуры:
Код:

var img1,img2:cardinal;

function BmpToTex(bm:tbitmap):cardinal;
var
i,j: integer; txbits:array of array of array of byte;
begin
setlength(txbits,bm.Width,bm.Height,3);
For i:= 0 to bm.Width-1 do
For j:= 0 to bm.Height-1 do begin
TxBits[j,i,0]:= GetRValue(Bm.Canvas.Pixels[i,j]);
TxBits[j,i,1]:= GetGValue(Bm.Canvas.Pixels[i,j]);
TxBits[j,i,2]:= GetBValue(Bm.Canvas.Pixels[i,j]);
end;
result:=createtexture(bm.Width,bm.Height,GL_RGBA,@txbits);
end;

procedure LoadBMPTexture(filename: string; var image:cardinal);
var bm:tbitmap;
begin
Bm:= TBitmap.Create;
Bm.LoadFromFile(filename);
image:=bmptotex(bm);
Bm.Free;
end;

procedure TForm1.FormCreate(Sender:TObject);
begin
LoadBMPTexture('Resources/img1.bmp',img1); //Текстура загружается
end;

procedure TForm1.Button1Click(Sender:TObject);
begin
LoadBMPTexture('Resources/img2.bmp',img2); //Текстура не загружается
end;
Вопрос состоит в том, как загрузить текстуру img2, загружая ее именно при нажатии на кнопку. Заранее спасибо

P.S.: способов загрузки текстуры перепробовал много, ни один не подходит. DevIL тоже.
JVlasov вне форума Ответить с цитированием
Старый 05.08.2014, 11:55   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а где создание контекста?

скорее всего при кнопке у вас не активирован контекст.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.08.2014, 11:57   #3
JVlasov
Новичок
Джуниор
 
Регистрация: 05.08.2014
Сообщений: 4
По умолчанию

Извиняюсь, что вы имеете ввиду под созданием контекста? Если инициализацию OpenGL, она есть, и отрисовка происходит, однако, если наложить текстуру на, к примеру, квадрат, то он отрисуется как будто бы без текстуры.
JVlasov вне форума Ответить с цитированием
Старый 05.08.2014, 12:56   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

я не вижу этого создания.

у меня такие ошибки были когда я делал вещи вне активного контекста ГЛ.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.08.2014, 14:43   #5
JVlasov
Новичок
Джуниор
 
Регистрация: 05.08.2014
Сообщений: 4
По умолчанию

Вот функция создания:
Код:
procedure GLInitialize(dc: HDC; width, height: word;AntiAlias:integer);
var
 QW:int64;
 rc0:HGLRC;
begin
 GetPixelFormat(AntiAlias);
 SetDCPixelFormat(DC);
 rc0:=wglCreateContext(DC);
 ActivateRenderingContext(DC, rc0);
 glEnable(GL_BLEND);
 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 QueryPerformanceFrequency(QW);
 glEnable(GL_DEPTH_TEST);
 glEnable(GL_SCISSOR_TEST);
 glMatrixMode(gl_projection);
 glLoadIdentity;
 gluPerspective(90,width/height,0.1,20000);
 glMatrixMode(gl_modelview);
 glLoadIdentity;
end;
Вызываю так: GLInitialize(GetDC(Panel1.Handle),S creen.Width,Screen.Height,0) на весь экран в компоненте Panel1. Все работает, кроме загрузки текстур после OnCreate
JVlasov вне форума Ответить с цитированием
Старый 06.08.2014, 12:05   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

все верно, в OnCreate у вас еще выбран контекст OpenGL, потому и работает.
а при нажатии на кнопку он не выбран.

у вас в прорисовке стоит wglMakeCurrent(0,0) в конце.(поидее должен)
вам надо при загрузке текстуры, тоже активировать контекст.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 07.08.2014, 14:21   #7
JVlasov
Новичок
Джуниор
 
Регистрация: 05.08.2014
Сообщений: 4
По умолчанию

В конце отрисовки стоял wglMakeCurrent(0,0). Сейчас добавил к этому wglMakeCurrent(DC,context), где DC - GetDC(Panel1.Handle), context - wglCreateContext(DC). Таким образом новый кадр начал отрисовываться сразу после отрисовки старого. Но, все по-старому, текстура не загружается.

Кстати, "незагруженные" текстуры имеют значения, т.е. загружаются. Сейчас значение текстуры равно 101.
JVlasov вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Текстуры OPENGL gufon Общие вопросы Delphi 3 02.06.2012 12:11
OpenGL. Текстуры. _PROGRAMM_ Gamedev - cоздание игр: Unity, OpenGL, DirectX 14 01.06.2011 20:32
OpenGL и текстуры N!ckeL Gamedev - cоздание игр: Unity, OpenGL, DirectX 7 05.05.2010 15:46
Текстуры OpenGl Stanislav Мультимедиа в Delphi 7 17.12.2008 17:55
OpenGL текстуры NoName_emaNoN Win Api 3 29.11.2007 20:11