Форум программистов
 
Расширенный поиск
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 24.07.2012, 21:07   #1
impulsgraw
Верховный Судья
Форумчанин
 
Аватар для impulsgraw
 
Регистрация: 23.11.2010
Адрес: Нижний Новгород
Сообщений: 82
Репутация: 6
Отправить сообщение для impulsgraw с помощью MSN Отправить сообщение для impulsgraw с помощью Yahoo
skype: giper06
Печаль OpenGl Загрузка текстур в массив

Здравствуйте! Такая проблема. При загрузке текстур в массив, они не накладываются вообще. Не знаю, в чём проблема, либо glBindTexture не работает, либо функция подгрузки. Но если загрузить те же текстуры не в массив, а в одиночные переменные, то всё работает.

Код:

var
Grass : glUint;
sky: array [0..5] of glUint;

//.........

procedure glInit();
var
    i, j : integer;
begin
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_SMOOTH);
glClearDepth(1.0);
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
LoadTexture('tex/skybox/1.jpg', sky[0], false);
LoadTexture('tex/skybox/2.jpg', sky[1], false);
LoadTexture('tex/skybox/3.jpg', sky[2], false);
LoadTexture('tex/skybox/4.jpg', sky[3], false);
LoadTexture('tex/skybox/5.jpg', sky[4], false);
LoadTexture('tex/skybox/6.jpg', sky[5], false);
LoadTexture('tex/grass_10.jpg', Grass, false);
end;

//.........................................

procedure DrawBox;
begin

     glBegin(GL_QUADS);

     glBindTexture(GL_TEXTURE_2D, sky[0]);

     glTexCoord2f(0, 0); glVertex3f(-6, -6, 6);
     glTexCoord2f(0, 1); glVertex3f( 6, -6, 6);
     glTexCoord2f(1, 1); glVertex3f( 6, -6, -6);
     glTexCoord2f(1, 0); glVertex3f(-6, -6, -6);

     glBindTexture(GL_TEXTURE_2D, sky[1]);

     glcolor3f(1, 0, 0);
     glTexCoord2f(0, 0); glVertex3f(-6, 6, 6);
     glTexCoord2f(0, 1); glVertex3f( 6, 6, 6);
     glTexCoord2f(1, 1); glVertex3f( 6, 6, -6);
     glTexCoord2f(1, 0); glVertex3f(-6, 6, -6);

     glBindTexture(GL_TEXTURE_2D, sky[2]);

      glcolor3f(0, 1, 0);
     glTexCoord2f(0, 0); glVertex3f(-6, 6, -6);
     glTexCoord2f(0, 1); glVertex3f( 6, 6, -6);
     glTexCoord2f(1, 1); glVertex3f( 6,-6, -6);
     glTexCoord2f(1, 0); glVertex3f(-6,-6, -6);

     glBindTexture(GL_TEXTURE_2D, sky[3]);

      glcolor3f(0, 0, 1);
     glTexCoord2f(0, 0); glVertex3f(-6, 6, 6);
     glTexCoord2f(0, 1); glVertex3f( 6, 6, 6);
     glTexCoord2f(1, 1); glVertex3f( 6,-6, 6);
     glTexCoord2f(1, 0); glVertex3f(-6,-6, 6);

     glBindTexture(GL_TEXTURE_2D, sky[4]);

      glcolor3f(1, 1, 0);
     glTexCoord2f(0, 0); glVertex3f(-6, 6, 6);
     glTexCoord2f(0, 1); glVertex3f(-6, 6,-6);
     glTexCoord2f(1, 1); glVertex3f(-6,-6,-6);
     glTexCoord2f(1, 0); glVertex3f(-6,-6, 6);

     glBindTexture(GL_TEXTURE_2D, sky[5]);

      glcolor3f(0, 1, 1);
     glTexCoord2f(0, 0); glVertex3f( 6, 6, 6);
     glTexCoord2f(0, 1); glVertex3f( 6, 6,-6);
     glTexCoord2f(1, 1); glVertex3f( 6,-6,-6);
     glTexCoord2f(1, 0); glVertex3f( 6,-6, 6);

   glEnd;

end;

На все объекты накладывается текстура травы (Grass).
impulsgraw вне форума   Ответить с цитированием
Старый 24.07.2012, 21:23   #2
nXs
Форумчанин
 
Регистрация: 26.02.2010
Адрес: г. Винница
Сообщений: 125
Репутация: 23
По умолчанию

Покажи код LoadTexture().
nXs вне форума   Ответить с цитированием
Старый 24.07.2012, 21:42   #3
impulsgraw
Верховный Судья
Форумчанин
 
Аватар для impulsgraw
 
Регистрация: 23.11.2010
Адрес: Нижний Новгород
Сообщений: 82
Репутация: 6
Отправить сообщение для impulsgraw с помощью MSN Отправить сообщение для impulsgraw с помощью Yahoo
skype: giper06
По умолчанию

Код:

function LoadTexture(Filename: String; var Texture : GLuint; LoadFromRes : Boolean) : Boolean;
begin
  if copy(Uppercase(filename), length(filename)-3, 4) = '.BMP' then
    LoadBMPTexture(Filename, Texture, LoadFromRes);
  if copy(Uppercase(filename), length(filename)-3, 4) = '.JPG' then
    LoadJPGTexture(Filename, Texture, LoadFromRes);
  if copy(Uppercase(filename), length(filename)-3, 4) = '.TGA' then
    LoadTGATexture(Filename, Texture, LoadFromRes);
end;

function LoadJPGTexture(Filename: String; var Texture: GLuint; LoadFromResource : Boolean): Boolean;
var
  Data : Array of LongWord;
  W, Width : Integer;
  H, Height : Integer;
  BMP : TBitmap;
  JPG : TJPEGImage;
  C : LongWord;
  Line : ^LongWord;
  ResStream : TResourceStream;      // used for loading from resource
begin
  result :=FALSE;
  JPG:=TJPEGImage.Create;

  if LoadFromResource then // Load from resource
  begin
    try
      ResStream := TResourceStream.Create(hInstance, PChar(copy(Filename, 1, Pos('.', Filename)-1)), 'JPEG');
      JPG.LoadFromStream(ResStream);
      ResStream.Free;
    except on
      EResNotFound do
      begin
        MessageBox(0, PChar('File not found in resource - ' + Filename), PChar('JPG Texture'), MB_OK);
        Exit;
      end
      else
      begin
        MessageBox(0, PChar('Couldn''t load JPG Resource - "'+ Filename +'"'), PChar('BMP Unit'), MB_OK);
        Exit;
      end;
    end;
  end
  else
  begin
    try
      JPG.LoadFromFile(Filename);
    except
      MessageBox(0, PChar('Couldn''t load JPG - "'+ Filename +'"'), PChar('BMP Unit'), MB_OK);
      Exit;
    end;
  end;

  // Create Bitmap
  BMP:=TBitmap.Create;
  BMP.pixelformat:=pf32bit;
  BMP.width:=JPG.width;
  BMP.height:=JPG.height;
  BMP.canvas.draw(0,0,JPG);        // Copy the JPEG onto the Bitmap

  //  BMP.SaveToFile('D:\test.bmp');
  Width :=BMP.Width;
  Height :=BMP.Height;
  SetLength(Data, Width*Height);

  For H:=0 to Height-1 do
  Begin
    Line :=BMP.scanline[Height-H-1];   // flip JPEG
    For W:=0 to Width-1 do
    Begin
      c:=Line^ and $FFFFFF; // Need to do a color swap
      Data[W+(H*Width)] :=(((c and $FF) shl 16)+(c shr 16)+(c and $FF00)) or $FF000000;  // 4 channel.
      inc(Line);
    End;
  End;

  BMP.free;
  JPG.free;

  Texture :=CreateTexture(Width, Height, GL_RGBA, addr(Data[0]));
  result :=TRUE;
end;

function CreateTexture(Width, Height, Format : Word; pData : Pointer) : Integer;
var
  Texture : GLuint;
begin
  glGenTextures(1, Texture);
  glBindTexture(GL_TEXTURE_2D, Texture);
  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);  {Texture blends with object background}
//  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);  {Texture does NOT blend with object background}

  { Select a filtering type. BiLinear filtering produces very good results with little performance impact
    GL_NEAREST               - Basic texture (grainy looking texture)
    GL_LINEAR                - BiLinear filtering
    GL_LINEAR_MIPMAP_NEAREST - Basic mipmapped texture
    GL_LINEAR_MIPMAP_LINEAR  - BiLinear Mipmapped texture
  }  

  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); { only first two can be used }
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); { all of the above can be used }

  if Format = GL_RGBA then
    gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, pData)
  else
    gluBuild2DMipmaps(GL_TEXTURE_2D, 3, Width, Height, GL_RGB, GL_UNSIGNED_BYTE, pData);
//  glTexImage2D(GL_TEXTURE_2D, 0, 3, Width, Height, 0, GL_RGB, GL_UNSIGNED_BYTE, pData);  // Use when not wanting mipmaps to be built by openGL

  result :=Texture;
end;

Писал не сам, скачал готовый модуль Textures.pas
Вложения
Тип файла: rar Textures.rar (4.1 Кб, 23 просмотров)
impulsgraw вне форума   Ответить с цитированием
Старый 24.07.2012, 21:55   #4
nXs
Форумчанин
 
Регистрация: 26.02.2010
Адрес: г. Винница
Сообщений: 125
Репутация: 23
По умолчанию

В общем фишка вот в чем, на вскидку LoadTextures работает правильно, и в твоем коде нет ошибок. Совет, посмотри какие значения в масиве sky, скорее всего одинаковые, поэтому биндится постоянно одна и та же текстура, если так значит не работает GlGenTextures (кстати правильно вызывать ее так glGenTextures(1,@Texture), по крайней мере с моими хидерами так), у меня такой глюк был правда не помню как исправил.
nXs вне форума   Ответить с цитированием
Старый 24.07.2012, 22:02   #5
impulsgraw
Верховный Судья
Форумчанин
 
Аватар для impulsgraw
 
Регистрация: 23.11.2010
Адрес: Нижний Новгород
Сообщений: 82
Репутация: 6
Отправить сообщение для impulsgraw с помощью MSN Отправить сообщение для impulsgraw с помощью Yahoo
skype: giper06
По умолчанию

Посмотрел отладчиком сразу после создания текстур. Sky = (1, 2, 3, 4, 5, 6); Grass = 7. Вот такая-вот фигня, всё правильно. А почему вызывается не правильно не знаю.
Но если загрузить те же текстуры не в массив, а в одиночные переменные, то всё работает.
impulsgraw вне форума   Ответить с цитированием
Старый 24.07.2012, 23:16   #6
impulsgraw
Верховный Судья
Форумчанин
 
Аватар для impulsgraw
 
Регистрация: 23.11.2010
Адрес: Нижний Новгород
Сообщений: 82
Репутация: 6
Отправить сообщение для impulsgraw с помощью MSN Отправить сообщение для impulsgraw с помощью Yahoo
skype: giper06
По умолчанию

Ура!!! решил проблему! если понадобится, с массивом всё ок. на самом деле, функция glBindTexture НЕ может выполняться внутри программных скобок opengl (glBegin, glEnd).
impulsgraw вне форума   Ответить с цитированием
Старый 25.07.2012, 00:10   #7
Пепел Феникса
Модератор
Заслуженный модератор
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 20,985
Репутация: 3402

icq: 446843180
skype: phoenix_proger
По умолчанию

а читали бы доки, то сразу бы видели:
Цитата:
GL_INVALID_OPERATION is generated if glBindTexture is executed between the execution of glBegin and the corresponding execution of glEnd.
__________________
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума   Ответить с цитированием
Старый 25.07.2012, 01:18   #8
nXs
Форумчанин
 
Регистрация: 26.02.2010
Адрес: г. Винница
Сообщений: 125
Репутация: 23
По умолчанию

Блин... Извиняюсь, я протупил.
nXs вне форума   Ответить с цитированием
Старый 29.07.2012, 20:14   #9
drdolgopoloff
Новичок
 
Регистрация: 29.07.2012
Сообщений: 1
Репутация: 10
По умолчанию

Дополнительная информация на http://aspk.view-php.com
drdolgopoloff вне форума   Ответить с цитированием
Старый 21.05.2014, 00:01   #10
nonsys
Пользователь
 
Регистрация: 25.09.2011
Сообщений: 11
Репутация: 10
По умолчанию

Цитата:
Ура!!! решил проблему! если понадобится, с массивом всё ок. на самом деле, функция glBindTexture НЕ может выполняться внутри программных скобок opengl (glBegin, glEnd).
СПАСИБО ДРУЖИЩЕ!!! Ты не представляешь как долго я искал ответ на свой вопрос почему всё работает нормально, но как ни крути рисуется только последняя загруженная текстура...
nonsys вне форума   Ответить с цитированием
Ответ



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прозрачность TGA текстур в OpenGL. _PROGRAMM_ Gamedev - cоздание и обсуждение игр 4 09.08.2011 13:57
Загрузка множества текстур. OpenGL Asker13 Gamedev - cоздание и обсуждение игр 2 17.04.2011 13:10
Загрузка текстур alexprey Мультимедиа в Delphi 0 21.03.2011 23:14
OpenGL - наложение текстур. Nater Общие вопросы Delphi 0 21.02.2011 21:14
наложение текстур в OpenGL FJFray Мультимедиа в Delphi 1 23.10.2010 12:40




18:46.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru