Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.27;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.04 c
5-1113682257
Бывший студент
2005-04-17 00:10
2005.11.27
Использование TFont


6-1115775430
Lex_!
2005-05-11 05:37
2005.11.27
HTML код в TWebBrowser


2-1131523754
Goast
2005-11-09 11:09
2005.11.27
Мерцает image!


2-1131379330
Александр СПб
2005-11-07 19:02
2005.11.27
Параметрический запрос


14-1131286082
_xroot
2005-11-06 17:08
2005.11.27
ThemeEngine 5.52