Форум: "Игры";
Текущий архив: 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]
меня какраз и интересовали методы класса:))
ну ладно и на том спасибо
Страницы: 1 2 вся ветка
Форум: "Игры";
Текущий архив: 2005.11.27;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.022 c