![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
glBindTexture [D5, WinXP]
grouzd[E]v © (2005-07-10 18:46:00)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 что не так
Tonich (2005-07-15 11:11:00) [1]
>
> XProger © (14.07.05 21:40) [44]
> Tonich, и почему же ты не следуешь этому умному совету?
ндаааааааа....:)
вот именно ему я и следую
Ладно я не хочу спорить ни с тобой ни с кем либо еще, если ты считаешь что я передераю чужие исходники, то хуже от этого я спать не стану:)))))) Так что ради бога:)
DR0N (2005-07-14 21:52:00) [2]:)
XProger (2005-07-14 21:40:00) [3]Tonich, и почему же ты не следуешь этому умному совету?
Tonich (2005-07-14 19:18:00) [4]
>
> XProger © (14.07.05 16:52) [41]
кто то тут же на форуме сказал очень правильную фразу
код существует не только для того что бы в тупую его передрать,
а и для того что бы разобрать, понять и в последствии если пригодится добавить в свои приложения
grouzd[E]v (2005-07-14 17:34:00) [5]TO XProger: неа, я думаю все тот же...
XProger (2005-07-14 16:52:00) [6]Tonich, ещё один "копипастер" на форуме? ;)
Tonich (2005-07-14 13:35:00) [7]
> MeF Dei Corvi © (14.07.05 13:21) [39]
от ты жук
само "тело класса" я бы и сам смог частично востановить из
> MeF Dei Corvi © (13.07.05 22:23) [31]
меня какраз и интересовали методы класса:))
ну ладно и на том спасибо
MeF Dei Corvi (2005-07-14 13:21:00) [8]
> еще бы для полного счастья увидить класс переменной 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;
Но вот код процедур и функций не дам :)
MeF Dei Corvi (2005-07-14 13:07:00) [9]
> На некоторых видяхах (все гифорсы ;) это означает использовать
> сжатие по умолчанию. GL_RGBA8 этого не допустит :D
Не знал :) Ну это не моя проблема, а проблема GeForce-ов :)
Tonich (2005-07-14 12:18:00) [10]
> Tonich, какого конца?
хорощо хоть не спросил до чьего конца:)))))))))
XProger (2005-07-14 11:51:00) [11]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 11:38:00) [12]я конечно наглею, но уже если спрашивать так доконца
Tonich (2005-07-14 11:25:00) [13]
> MeF Dei Corvi © (13.07.05 22:23) [31]
круто:) еще бы для полного счастья увидить класс переменнойFImage:))
MeF Dei Corvi (2005-07-13 22:45:00) [14]
> 2) Меняем RGB на BGR (BGRA на RGBA) через функцию, написанную
> на asm.
брр... меняем BGR на RGB :)
> не судьба GL_BGR/GL_BGRA?
гм... что-то я загнался :) начинал писать ещё на стандартных Borland заголовках от OGL1.0, а там этого не было. Это уже потом код стал обрастаться всякими GL_COMPRESSED_RGB_S3TC_DXT1_EXT... когда стал юзать заголовки OGL1.5 :)
Ну тогда даже менять не надо :)
NikotiN (2005-07-13 22:27:00) [15]2 MeF Dei Corvi
//2) Меняем RGB на BGR (BGRA на RGBA) через функцию, написанную на asm.
не судьба GL_BGR/GL_BGRA?
MeF Dei Corvi (2005-07-13 22:23:00) [16]фрагмент из моего кода:
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;
MeF Dei Corvi (2005-07-13 22:20:00) [17]
> 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... Проще и быстрее, хотя качество немного ухудшается.
NikotiN (2005-07-13 19:35:00) [18]трудно формат bmp посмотреть или tga, jpg, pcx..... ? и написать ручной метод загрузки, мне вот tga нравится....
Tonich (2005-07-13 17:23:00) [19]
> XP, не трать время - он просто код нахаляву хочет.
код мне вообще не нужен, просто мне интересно как он грузит текстуры (в ручную)
я гружу почти так как и ты только вместо CODE>glTexImage2D
используюgluBuild2DMipmapsвот мне и интересно почему это самый тормознутый способ
тебе я сотрю только бы загрузить, а все остальное ......
grouzd[E]v (2005-07-13 16:57:00) [20]XP, не трать время - он просто код нахаляву хочет. Кстати у меня все работает =))) УРА!