![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
OpenGL : glBlengFunc : Текстура БЕЗ альфа канала... [Delphi, Windows]
Кефир87 © (2005-05-07 14:51:00)Что-бы нормально вывести bmp шрифт мне нада что-бы фон был прозрачный... Фон совпадает с glClearColor (не знаю как мне это в голову пришло...). Так вот как использовать glBlendFunc что-бы этот мой 0 255 255 у текстуры был абсолютно прозрачным. И только он... А то я вот попробовал по эксперементировать... Лучший результат получился при glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA); но при этом какой-то фон все-таки заметен...
Если есть другие варианты...
XProger (2005-05-15 22:59:00) [1]Это не интерполяция...
У тебя размер текстуры не является степенью двойки!
2560x16 - это ужас просто. Делай 256х256!
gluBuild2DMipmaps при получении "корявых" размеров текстуры растягивает её до ближайшего 2^n. Тем самым портя качество текстуры :)
Используй glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Кефир87 (2005-05-15 20:35:00) [2]
> pData^,
Блин!! Забыл.... Стыдно....
...
Но проблемы не закончелись... При GL_ALPHA ничего не получается... Опять черные квадраты... Зато при GL_RED все работает почти как надо... Только при задание glColor цвет получается бледно-нужный... Что-ж такое...
И вот еще... Как отключить эту дурацкую интерполяцию? Что-бы буквы отображались... ммм... "пиксель в пиксель" так сказать... Если делаю фильтр GL_NEAREST не на много лучше получается...
procedure TText.PrintText(s:string; x,y,z:glfloat);
var
chw:glfloat;
ch : byte;
i:Integer;
begin
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluOrtho2D(0, 800, 600, 0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
glViewport(0, 0, 800, 600);
glEnable(GL_TEXTURE_2D);
if blend then
begin
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE);
end;
glBindTexture(GL_TEXTURE_2D, font.point);
chw := 1/256;
for i := 1 to length(s) do
begin
ch := ord(s[i])-1;
glbegin(GL_QUADS);
glTexCoord(chw*ch, 1); glVertex3f(x+(i-1)*w, y+0, z);
glTexCoord(chw*ch+chw, 1); glVertex3f(x+(i-1)*w+w, y+0, z);
glTexCoord(chw*ch+chw, 0); glVertex3f(x+(i-1)*w+w, y+h, z);
glTexCoord(chw*ch, 0); glVertex3f(x+(i-1)*w, y+h, z);
glEnd;
end;
glDisable(GL_TEXTURE_2D);
if blend then glDisable(GL_BLEND);
end;
Вот так я зделал...
XProger (2005-05-15 17:14:00) [3]FillChar(hed, hsz, 0); - ни к чему...
AssignFile(tga, FileName);
Reset(tga, 1);
BlockRead(tga, hed, SizeOf(hed));
if hed.ImageType <> 3 then Exit;
Seek(F, SizeOf(hed) + hed.FileType);
size := hed.Width * hed.Height;
GetMem(pData, size);
BlockRead(tga, pData^, size); // заметь значёк ^ ;)
...
Да и glDisable(GL_TEXTURE_2D) зачем делаешь, тож не понятно...
Кефир87 (2005-05-15 16:14:00) [4]XProger, а там нет случайно никакой доп. информации? Или я что-то забыл... Но Width*Height не совпадает с FileSize(f)-sizeof(TGA_Header)... У меня в любом случае вылезает I/O Error 998...
Вот что я написал:
function LoadTGATexture(const FileName : string): GLuint;
type
TGA_Header = packed record // Header type for TGA images
FileType : Byte;
ColorMapType : Byte;
ImageType : Byte;
ColorMapStart : WORD;
ColorMapLength : WORD;
ColorMapDepth : Byte;
OrigX : WORD;
OrigY : WORD;
Width : WORD;
Height : WORD;
BPP : Byte;
ImageInfo : Byte;
end;
const
hsz = sizeof(TGA_Header);
var
tga : file;
hed : TGA_Header;
pData : Pointer;
size : Integer;
begin
FillChar(hed, hsz, 0);
AssignFile(tga, FileName);
Reset(tga, 1);
BlockRead(tga, hed, hsz);
size := hed.Width*hed.Height;
GetMem(pData, size);
BlockRead(tga, pData, size);
glDisable(GL_TEXTURE_2D);
glGenTextures(1, Result);
glBindTexture(GL_TEXTURE_2D, Result);
gluBuild2DMipmaps(GL_TEXTURE_2D, 1, hed.Width, hed.Height, GL_ALPHA, GL_UNSIGNED_BYTE, pData);
FreeMem(pData);
CloseFile(tga);
end;
ImageType = 3- проверенно...
Изображение 2560x16...
XProger (2005-05-15 15:10:00) [5]Кефир87, я бы посоветовал грузить TGA
TGA_Header = packed record // Header type for TGA images
FileType : Byte;
ColorMapType : Byte;
ImageType : Byte;
ColorMapStart : WORD;
ColorMapLength : WORD;
ColorMapDepth : Byte;
OrigX : WORD;
OrigY : WORD;
Width : WORD;
Height : WORD;
BPP : Byte;
ImageInfo : Byte;
end;
Если ImageType = 3, то это не сжатый ч/б растр.
Далее читаешь Width*Height байт как ты делал с bmp :)
Кефир87 (2005-05-15 13:39:00) [6]
> 1) BMP в отличии от TGA не имеет ч/б вариаций. Т.е. в заголовке
> идёт палитра, а далее индексы цветов этой палитры в качестве
> данных:)
Ок. тогда как загрузить правильно 8бпп бмп или ТГА?
> 2) glGenTextures() как ты её декларировал?
procedure glGenTextures(n: GLsizei; var textures: GLuint); stdcall; external opengl32;
> 3) не закрываешь файл ;)))
Ну блин... Забыл просто 8) Бывает 8)
XProger (2005-05-15 01:12:00) [7]Следовательно не правильно грузишь текстуру:
1) BMP в отличии от TGA не имеет ч/б вариаций. Т.е. в заголовке идёт палитра, а далее индексы цветов этой палитры в качестве данных:)
2) glGenTextures() как ты её декларировал?
3) не закрываешь файл ;)))
Кефир87 (2005-05-14 23:23:00) [8]Ну да... Белые буквы на черном фоне... БМП 8бпп...
> Блендинг включил?
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE);
И текстура есть... Во всяком случае из файла читается точно... С 24бпп все было нормально...
XProger (2005-05-14 22:02:00) [9]Блендинг включил?
Текстура чёрно-белая? (чёрный будет прозрачным)
Кефир87 (2005-05-14 21:09:00) [10]
> XProger
Это как? Перед вызовом?
glColor3f(1.0, 1.0, 1.0);
ttxt.PrintText('FPS : ' + inttostr(FPS), -1, 0.95);
Толку ноль...
А вообще я хотел бы что-бы текст был красным... Для этого glColor3f(1.0, 0.0, 0.0)...
Где же ошибка...
XProger (2005-05-14 20:11:00) [11]перед выводом текста не пробовал glColor3f(1, 1, 1) делать? :)
Кефир87 (2005-05-14 19:55:00) [12]Я тут возврящаюсь к этой теме... про текст... Мне кажется я что-то делаю не правильно...
Загрузка MBP 8bpb...
procedure TTexture.LoadAlpha(const FileName : string);
begin
point := Load8bpp(FileName);
end;
function TTexture.Load8bpp(const FileName:string):GLuint;
const
szh = SizeOf(TBitmapFileHeader);
szi = SizeOf(TBitmapInfoHeader);
var
BmpFile : File;
bfh : TBitmapFileHeader;
bmi : TBitmapInfoHeader;
x, size: GLint;
temp: GLbyte;
sWidth, tHeight: GLsizei;
pData : pointer;
begin
AssignFile (BmpFile, FileName);
Reset (BmpFile, 1);
Size := FileSize (BmpFile) - szh - szi;
Blockread(BmpFile, bfh, szh);
BlockRead (BmpFile, bmi, szi);
If Bfh.bfType <> $4D42 then
begin
Exit;
end;
sWidth := bmi.biWidth;
tHeight := bmi.biHeight;
GetMem (pData, Size);
BlockRead(BmpFile, pData^, Size);
glDisable(GL_TEXTURE_2D);
glGenTextures(1, Result);
glBindTexture(GL_TEXTURE_2D, Result);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
gluBuild2DMipmaps(GL_TEXTURE_2D, 1, sWidth, tHeight, GL_ALPHA, GL_UNSIGNED_BYTE, pData);
FreeMem(pData);
end;
А вот примерно так я текст вывожу... Ну это я для теста... Потом буду делать Ortho2d...
procedure TText.PrintText(s:string; x,y:glfloat);
var
chw:glfloat;
ch : byte;
i:Integer;
begin
glMatrixMode(GL_PROJECTION);
glPushMatrix;
glLoadIdentity;
glMatrixMode(GL_MODELVIEW);
glPushMatrix;
glLoadIdentity;
glTranslatef(x,y, 0);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE);
glBindTexture(GL_TEXTURE_2D, font.point);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);}
chw := 1/256;
for i := 1 to length(s) do
begin
ch := ord(s[i])-1;
glbegin(GL_QUADS);
glColor3f(1.0, 0.0, 0.0);
glTexCoord(chw*ch, 0); glVertex2f((i-1)*0.04, 0.0);
glTexCoord(chw*ch+chw, 0); glVertex2f((i-1)*0.04+0.04, 0.0);
glTexCoord(chw*ch+chw, 1); glVertex2f((i-1)*0.04+0.04, 0.06);
glTexCoord(chw*ch, 1); glVertex2f((i-1)*0.04, 0.06);
glColor(1.0, 1.0, 1.0);
glEnd;
end;
glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
glMatrixMode(GL_PROJECTION);
glPopMatrix;
glMatrixMode(GL_MODELVIEW);
glPopMatrix;
end;
Да... А дело то в том что вместо букв черные квадраты...
XProger (2005-05-09 01:37:00) [13]Текстура 256х256 буква 16х16
var
FontBase : DWORD;
procedure Font_Init;
const
cs = 1/16;
var
i: DWORD;
cx, cy: single;
begin
FontBase := glGenLists(256);
for i := 0 to 255 do
begin
glNewList(FontBase + i, GL_COMPILE);
cx := (i mod 16)/16;
cy := (i div 16)/16;
glBegin(GL_QUADS);
glTexCoord2f(cx, -cy); glVertex2f( 0, 0);
glTexCoord2f(cx + cs, -cy); glVertex2f(16, 0);
glTexCoord2f(cx + cs, -cy - cs); glVertex2f(16, 16);
glTexCoord2f(cx, -cy - cs); glVertex2f( 0, 16);
glEnd;
glTranslatef(8, 0, 0);
glEndList;
end;
...
procedure glTextOut(font: TTexture; const Text: string; X, Y : Integer; sx : single = 1; sy: single = 1);
var
s : string;
i : integer;
l : integer;
begin
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GEQUAL, 1/255);
glListBase(FontBase);
glTex_Enable(font);
glPushMatrix;
glTranslatef(X, Y, 0);
glScalef(sx, sy, 1);
s := Text;
l := Length(s);
for i := 1 to l do
glCallLists(1, GL_UNSIGNED_BYTE, @s[i]);
glPopMatrix;
glDisable(GL_ALPHA_TEST);
end;
Кефир87 (2005-05-08 21:14:00) [14]Это понятно... А дальше что? Указывать вершины как
...
glVertex2f(0.0, 0.0);
glVertex2f(10, 0);
glVertex2f(10, 16);
glvertex2f(0, 16);
...
Если буква в тестуре 10х16...
XProger (2005-05-08 17:07:00) [15]
procedure glSetOrtho(Width, Height: integer);
begin
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluOrtho2D(0, width, height, 0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
glViewport(0, 0, width, height);
end;
Где width, height - ширина и высота окна соответственно
Кефир87 (2005-05-08 16:15:00) [16]Меня интересует как приобразовать оконные координаты в GLевские... или наоборот... Ну что-бы текстура не растягивалась и не сжималась
Кефир87 (2005-05-08 16:09:00) [17]А можно вообще подробнее про текст... Пожалуста 8)
XProger (2005-05-08 02:35:00) [18]Цвет ты сам задаёшь при помощи glColor перед вызовом отрисовки текста.
Pa5ha (2005-05-08 02:25:00) [19]Все нравиться, тока как работает? Как цает вычисляется?
XProger (2005-05-07 17:02:00) [20]Pa5ha, чего не нравится?