![]() |
| ||
|
|
Новости |
Поиск |
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-13 16:32:00) [21]интересно, а что есть ручным , пример кода если можно:)
XProger (2005-07-13 15:47:00) [22]Tonich, ScanLine или ручным...
Tonich (2005-07-13 11:26:00) [23]
> XProger © (11.07.05 15:00) [15]
ты говоришь
> Один из самых тормознутых методов загрузки текстуры (если
> не самый тормознутый)
каким методом пользуешься ты?
grouzd[E]v (2005-07-12 00:06:00) [24]Гм... Стал переделывать в новом проекте и эта гадость заработала =) Полтергейст... Значит проблемы с головой. Всем спасибо!
grouzd[E]v (2005-07-11 23:34:00) [25]Ага. Целиком. Все 16 модулей. Там даже комментов нет =) Позже попробую отдельный пример сделать
XProger (2005-07-11 23:29:00) [26]выкладывай где-нить весь пример на скачку
grouzd[E]v (2005-07-11 23:18:00) [27][19] Леон: Да. Я же говорю, что в если при подключении вызывать glTexImage2D, то все работает. Самое обидное, что у меня компилируются другие примеры с биндом, хотя отличий вроде нет. Мистика =)
Леон (2005-07-11 21:24:00) [28]Текстурные координаты указываются?
( я их у себя забывал частенько :) )
grouzd[E]v (2005-07-11 19:06:00) [29]Да
XProger (2005-07-11 19:03:00) [30]glEnable(GL_COLOR_MATERIAL); надеюсь есть вместе со светом?
grouzd[E]v (2005-07-11 17:27:00) [31]Не, не работает. Свет есть
XProger (2005-07-11 15:00:00) [32]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 10:03:00) [33]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.
MeF Dei Corvi (2005-07-11 05:59:00) [34]Можешь где-нить выложить полный код модуля, где у тебя описывается TTexture? Это на случай, если у тебя не "проблемы с OGLой", а именно "с головой =)"... :)
Zak3D[@Tm] (2005-07-11 01:42:00) [35]XProger
Ой... это же GL_MODULATE =). Ты прав.
grouzd[E]v (2005-07-11 00:48:00) [36][10] Неа, не пашет
XProger (2005-07-10 23:57:00) [37]Zak3D[@Tm], как раз таки наоборот "учитывать цвет примитива"
grouzd[E]v,
procedure glGenTextures (n: GLsizei; textures: PGLuint); stdcall; external opengl32;
И передавай указатель... Сомневаюсь что отличается, но мало ли...
grouzd[E]v (2005-07-10 23:49:00) [38]да
Zak3D[@Tm] (2005-07-10 23:48:00) [39]А... вижу, делаешь ; )
сори
Zak3D[@Tm] (2005-07-10 23:29:00) [40]При создании текстуры, после бинда
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); //не учитывать цвет примитива
делаешь?