Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2005.11.27;
Скачать: [xml.tar.bz2];

Вниз

glBindTexture   Найти похожие ветки 

 
grouzd[E]v ©   (2005-07-10 18:46) [0]

Goodevening again my friends!
У меня опять проблемы с OGLой (а может с головой =)
Не получается подключать текстуры через glBindTexture
Раньше я делал как в одной статье:

procedure TTexture.Enable;
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
 glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,Width,Height,0,GL_RGB,GL_UNSIGNED_BYTE,data);
 glEnable(GL_TEXTURE_2D);
end;

т.е. при перерисовке объекта текстура создается заново
Теперь пробую так:

type
 TTexture = class
   width, height : integer;
   data : pByteArray;
   t : GLuint;
   procedure LoadFromFile(file_name : string);
   procedure Enable;
 end;

implementation

procedure glGenTextures(n: GLsizei; var textures: GLuint); stdcall; external opengl32;
procedure glBindTexture(target: GLenum; texture: GLuint); stdcall; external opengl32;

procedure TTexture.LoadFromFile(file_name : String);
begin
//загрузка из файла
glGenTextures(1, t);
glBindTexture(GL_TEXTURE_2D, t);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,Width,Height,0,GL_RGB,GL_UNSIGNED_BYTE,data);
end;

procedure TTexture.Enable;
begin
glBindTexture(GL_TEXTURE_2D, t);  
glEnable(GL_TEXTURE_2D);
end;

...и ничего не просходит, текстура не накладывается. скажите pls что не так


 
XProger ©   (2005-07-10 20:33) [1]

glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,Width,Height,0,GL_RGB,GL_UNSIGNED_BYTE,data);
СУПЕР!
FreeMem(data); можешь дописать, чтобы память лишнюю не занимать :)


 
grouzd[E]v ©   (2005-07-10 20:35) [2]

[1] Не смешно. Скажи лучше что не так


 
XProger ©   (2005-07-10 20:51) [3]

glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,Width,Height,0,GL_RGB,GL_UNSIGNED_BYTE,data);
Я вроде уже сказал...
Хорошо, поясню: "О великий OpenGL, создай текстуру по этому байтовому массиву с 4 компонентами на цвет но формата 3 байта на цвет."
Явных различий в форматах не замечаешь?

И ещё:

glBindTexture(GL_TEXTURE_2D, t);  
glEnable(GL_TEXTURE_2D);

Поменяй местами ради приличия :)


 
grouzd[E]v ©   (2005-07-10 20:59) [4]

Ладно, смотри:glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,Width,Height,0,GL_RGB,GL_UNSIGNED_BYTE,data);
- то же самое. Кстати взял из книги Краснова


 
XProger ©   (2005-07-10 22:47) [5]

grouzd[E]v,
Ну раз и это не работает... Текстуры хоть грузятся? Что показывает вообще?


 
grouzd[E]v ©   (2005-07-10 22:55) [6]

Текстуры грузятся и в первом и во втором случаях одинаково, но во 2-м текстура просто не накладывается - рисуется объект, залитый своим цветом


 
Zak3D[@Tm] ©   (2005-07-10 23:29) [7]

При создании текстуры, после бинда
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); //не учитывать цвет примитива
делаешь?


 
Zak3D[@Tm] ©   (2005-07-10 23:48) [8]

А... вижу, делаешь ; )
сори


 
grouzd[E]v ©   (2005-07-10 23:49) [9]

да


 
XProger ©   (2005-07-10 23:57) [10]

Zak3D[@Tm], как раз таки наоборот "учитывать цвет примитива"
grouzd[E]v,
procedure glGenTextures     (n: GLsizei; textures: PGLuint); stdcall; external opengl32;
И передавай указатель... Сомневаюсь что отличается, но мало ли...


 
grouzd[E]v ©   (2005-07-11 00:48) [11]

[10] Неа, не пашет


 
Zak3D[@Tm] ©   (2005-07-11 01:42) [12]

XProger
Ой... это же GL_MODULATE =). Ты прав.


 
MeF Dei Corvi ©   (2005-07-11 05:59) [13]

Можешь где-нить выложить полный код модуля, где у тебя описывается TTexture? Это на случай, если у тебя не "проблемы с OGLой", а именно "с головой =)"... :)


 
grouzd[E]v ©   (2005-07-11 10:03) [14]

unit textures;

interface

Uses
 windows, SysUtils, Graphics, OpenGL;

type
 TTexture = class
   id, width, height : integer;
   data : pByteArray;
   t : GLuint;
   destructor Destroy; override;
   procedure LoadFromFile(file_name : string);
   procedure Enable;
 end;

implementation

procedure glGenTextures(n: GLsizei; var textures: GLuint); stdcall; external opengl32;
procedure glBindTexture(target: GLenum; texture: GLuint); stdcall; external opengl32;

destructor TTexture.Destroy;
begin
 if Assigned(data) then FreeMem(data);
 Inherited Destroy;
end;

procedure TTexture.LoadFromFile(file_name : String);
var
B : TBitmap;
i,j : Integer;
begin
if not fileexists(file_name) then exit;
total_textures := total_textures + 1;
id := total_textures;
B := TBitmap.Create;
B.LoadFromFile(file_name);
Width := B.Width;
Height := B.Height;

GetMem(data,Width*Height*3);

for j := 0 to Height - 1 do begin
 for i := 0 to Width - 1 do begin
   data[(j*Width + i)*3] := Byte(B.Canvas.Pixels[i,j]);
   data[(j*Width + i)*3+1] := Byte(B.Canvas.Pixels[i,j] shr 8);
   data[(j*Width + i)*3+2] := Byte(B.Canvas.Pixels[i,j] shr 16);
 end;
end;

B.Free;

glEnable(GL_TEXTURE_2D);

glGenTextures(1, t);
glBindTexture(GL_TEXTURE_2D, t);

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,Width,Height,0,GL_RGB,GL_UNSIGNED_BYTE,data);

   
end;

procedure TTexture.Enable;
begin
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, t);
end;

end.


 
XProger ©   (2005-07-11 15:00) [15]

destructor TTexture.Destroy; - фтопку

procedure TTexture.LoadFromFile(const file_name : String);
...
glBindTexture(GL_TEXTURE_2D, Result);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
...
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,Width,Height,0,GL_RGB,GL_UNSIGNED_BYTE,data);
FreeMem(data);

Один из самых тормознутых методов загрузки текстуры (если не самый тормознутый)
Вообще, если и это работать не будет - ошибок в коде загрузки и включения текстур нет.
Свет на сцене есть?


 
grouzd[E]v ©   (2005-07-11 17:27) [16]

Не, не работает. Свет есть


 
XProger ©   (2005-07-11 19:03) [17]

glEnable(GL_COLOR_MATERIAL); надеюсь есть вместе со светом?


 
grouzd[E]v ©   (2005-07-11 19:06) [18]

Да


 
Леон ©   (2005-07-11 21:24) [19]

Текстурные координаты указываются?
( я их у себя забывал частенько :)  )


 
grouzd[E]v ©   (2005-07-11 23:18) [20]

[19] Леон: Да. Я же говорю, что в если при подключении вызывать glTexImage2D, то все работает. Самое обидное, что у меня компилируются другие примеры с биндом, хотя отличий вроде нет. Мистика =)


 
XProger ©   (2005-07-11 23:29) [21]

выкладывай где-нить весь пример на скачку


 
grouzd[E]v ©   (2005-07-11 23:34) [22]

Ага. Целиком. Все 16 модулей. Там даже комментов нет =) Позже попробую отдельный пример сделать


 
grouzd[E]v ©   (2005-07-12 00:06) [23]

Гм... Стал переделывать в новом проекте и эта гадость заработала =) Полтергейст... Значит проблемы с головой. Всем спасибо!


 
Tonich ©   (2005-07-13 11:26) [24]


> XProger ©   (11.07.05 15:00) [15]

ты говоришь

> Один из самых тормознутых методов загрузки текстуры (если
> не самый тормознутый)

каким методом пользуешься ты?


 
XProger ©   (2005-07-13 15:47) [25]

Tonich, ScanLine или ручным...


 
Tonich ©   (2005-07-13 16:32) [26]

интересно, а что есть ручным , пример кода если можно:)


 
grouzd[E]v ©   (2005-07-13 16:57) [27]

XP, не трать время - он просто код нахаляву хочет. Кстати у меня все работает =))) УРА!


 
Tonich ©   (2005-07-13 17:23) [28]


> XP, не трать время - он просто код нахаляву хочет.

код мне вообще не нужен, просто мне интересно как он грузит текстуры (в ручную)

я гружу почти так как и ты только вместо CODE>glTexImage2D
использую gluBuild2DMipmaps вот мне и интересно почему это самый тормознутый способ

тебе я сотрю только бы загрузить,  а все остальное ......


 
NikotiN ©   (2005-07-13 19:35) [29]

трудно формат bmp посмотреть или tga, jpg, pcx..... ? и написать ручной метод загрузки, мне вот tga нравится....


 
MeF Dei Corvi ©   (2005-07-13 22:20) [30]


> gluBuild2DMipmaps

это ещё тормознее, чем glTexImage2D.

Значит так:
1) Грузим bmp или tga файл, грузим вручную, т.е. никаких TBitamp и пр. Для tga надо ещё писать процедуру RLE декомпрессии. Jpeg файл лучше не использовать, но и его можно грузить через какой-нить jpeg.dll.
2) Меняем RGB на BGR (BGRA на RGBA) через функцию, написанную на asm.
3) Используем расширение GL_SGIS_generate_mipmap, благо есть оно уже на всех видеокартах, для генерации мипмапов.
4) Используем glTexImage2D.

Кстати, можно грузить не из bmp и tga, а из файла в формате GL_COMPRESSED_RGBA_ARB... Проще и быстрее, хотя качество немного ухудшается.


 
MeF Dei Corvi ©   (2005-07-13 22:23) [31]

фрагмент из моего кода:

procedure TTexture.LoadFromFile(const FileName: String; MipMap:Boolean=false; Compression:TTexCompression=tc_None);
var texformat:GLUint;
begin
 FImage.Free;
 FImage.LoadFromFile(FileName);
 FRWidth:=FImage.RealWidth;
 FRHeight:=FImage.RealHeight;
 glBindTexture(GL_TEXTURE_2D, FTextureId);
 FMipmap:=False;
 if(MipMap) then begin
   if GL_SGIS_generate_mipmap then begin
     glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, GL_TRUE);
     FMipmapFilter:=ttf_Linear;
     FMipmap:=True;
   end;
 end;
 FCompressed:=Compression<>tc_None;
 FBPP:=FImage.BPP;
 if(FImage.BPP=4) then begin
   case Compression of
     tc_None: texformat:=GL_RGBA;
     tc_DXT1: texformat:=GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
     tc_DXT3: texformat:=GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
     tc_DXT5: texformat:=GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
     tc_ARB: texformat:=GL_COMPRESSED_RGBA_ARB;
   end;
 end else begin
   case Compression of
     tc_None: texformat:=GL_RGB;
     tc_DXT1,tc_DXT3,tc_DXT5: texformat:=GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
     tc_ARB: texformat:=GL_COMPRESSED_RGB_ARB;
   end;
 end;
 if(FImage.GLFormat=GL_RGB) or (FImage.GLFormat=GL_RGBA) then
 glTexImage2D(GL_TEXTURE_2D, 0, texformat,FImage.Width, FImage.Height, 0,FImage.GLFormat, GL_UNSIGNED_BYTE, FImage.Data) else begin
   FCompressed:=True;
   glCompressedTexImage2DARB(GL_TEXTURE_2D,0,FImage.GLFormat,FImage.Width,FImage.Height,0,FImage.DataSize,FImage.Data);
 end;
 FGLFormat:=texformat;
 FMode:=tdm_Modulate;
 FWidth:=FImage.Width;
 FHeight:=FImage.Height;
 SetFilter(ttf_Linear);
 if(MipMap) and (GL_SGIS_generate_mipmap) then glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, GL_False);
 if(MipMap) and (not FMipMap) then AutoMipMap;
end;


 
NikotiN ©   (2005-07-13 22:27) [32]

2 MeF Dei Corvi
//2) Меняем RGB на BGR (BGRA на RGBA) через функцию, написанную на asm.
не судьба GL_BGR/GL_BGRA?


 
MeF Dei Corvi ©   (2005-07-13 22:45) [33]


> 2) Меняем RGB на BGR (BGRA на RGBA) через функцию, написанную
> на asm.

брр... меняем BGR на RGB :)

> не судьба GL_BGR/GL_BGRA?

гм... что-то я загнался :) начинал писать ещё на стандартных Borland заголовках от OGL1.0, а там этого не было. Это уже потом код стал обрастаться всякими GL_COMPRESSED_RGB_S3TC_DXT1_EXT... когда стал юзать заголовки OGL1.5 :)
Ну тогда даже менять не надо :)


 
Tonich ©   (2005-07-14 11:25) [34]


> MeF Dei Corvi ©   (13.07.05 22:23) [31]

круто:) еще бы для полного счастья увидить класс переменной FImage :))


 
Tonich ©   (2005-07-14 11:38) [35]

я конечно наглею, но уже если спрашивать так доконца


 
XProger ©   (2005-07-14 11:51) [36]

MeF Dei Corvi,
tc_None: texformat:=GL_RGBA;
На некоторых видяхах (все гифорсы ;) это означает использовать сжатие по умолчанию. GL_RGBA8 этого не допустит :D

Tonich, какого конца?

P.S.
Для TGA библиотеку недавно писал: http://xproger.mirg.ru/?id=2&page=3


 
Tonich ©   (2005-07-14 12:18) [37]


> Tonich, какого конца?

хорощо хоть не спросил до чьего конца:)))))))))


 
MeF Dei Corvi ©   (2005-07-14 13:07) [38]


> На некоторых видяхах (все гифорсы ;) это означает использовать
> сжатие по умолчанию. GL_RGBA8 этого не допустит :D

Не знал :) Ну это не моя проблема, а проблема GeForce-ов :)


 
MeF Dei Corvi ©   (2005-07-14 13:21) [39]


> еще бы для полного счастья увидить класс переменной FImage
> :))

Запросто :)

 TGLImage=class
 private
   FData:Pointer;
   FDataSize:Cardinal;
   FGLFormat:GLUInt;
   FBPP:Byte;
   FWidth,FHeight:Word;
   FRWidth,FRHeight:Word;
   FLoaded:Boolean;
   FImageFormat:TImageFormat;
   procedure LoadFromBMP(Stream:TStream);
   procedure LoadFromTGA(Stream:TStream);
   procedure LoadFromTME(Stream:TStream);
   procedure LoadFromtxr(Stream:TStream);
 public
   property Width:Word read FWidth;
   property Height:Word read FHeight;

   property RealWidth:Word read FRWidth;
   property RealHeight:Word read FRHeight;

   property DataSize:Cardinal read FDataSize;
   property Data:Pointer read FData;
   property Loaded:Boolean read FLoaded;
   property GLFormat:GLUInt read FGLFormat;
   property BPP:Byte read FBPP;

   procedure LoadFromStream(Stream:TStream;ImageFormat:TImageFormat);
   procedure LoadFromFile(const FileName:String);

   procedure Free;
   constructor Create;
   destructor Destroy;
 end;

Но вот код процедур и функций не дам :)


 
Tonich ©   (2005-07-14 13:35) [40]


> MeF Dei Corvi ©   (14.07.05 13:21) [39]

от ты жук
само "тело класса" я бы и сам смог частично востановить из

> MeF Dei Corvi ©   (13.07.05 22:23) [31]
меня какраз и интересовали методы класса:))
ну ладно и на том спасибо


 
XProger ©   (2005-07-14 16:52) [41]

Tonich, ещё один "копипастер" на форуме? ;)


 
grouzd[E]v ©   (2005-07-14 17:34) [42]

TO XProger: неа, я думаю все тот же...


 
Tonich ©   (2005-07-14 19:18) [43]


>
> XProger ©   (14.07.05 16:52) [41]

кто то тут же на форуме сказал очень правильную фразу

код существует не только для того что бы в тупую его передрать,
а и для того что бы разобрать, понять и в последствии если пригодится добавить в свои приложения


 
XProger ©   (2005-07-14 21:40) [44]

Tonich, и почему же ты не следуешь этому умному совету?


 
DR0N ©   (2005-07-14 21:52) [45]

:)


 
Tonich ©   (2005-07-15 11:11) [46]


>
> XProger ©   (14.07.05 21:40) [44]
> Tonich, и почему же ты не следуешь этому умному совету?
ндаааааааа....:)

вот именно  ему я и следую

Ладно я не хочу спорить ни с тобой ни с кем либо еще, если ты считаешь что я передераю чужие исходники, то хуже от этого я спать не стану:)))))) Так что ради бога:)



Страницы: 1 2 вся ветка

Форум: "Игры";
Текущий архив: 2005.11.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.58 MB
Время: 0.015 c
14-1130859331
kaif
2005-11-01 18:35
2005.11.27
Задача с конусом


3-1129479821
maVladimir
2005-10-16 20:23
2005.11.27
RowSelection in TCustomDBGrid


2-1131498348
DimonS
2005-11-09 04:05
2005.11.27
Запрос в ADO


3-1129176875
Рафик
2005-10-13 08:14
2005.11.27
MSSQL Dependencies


14-1130918218
kaif
2005-11-02 10:56
2005.11.27
Задачка: доска против Думкина





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский