Текущий архив: 2005.09.11;
Скачать: CL | DM;
ВнизOpenGL : glBlengFunc : Текстура БЕЗ альфа канала... Найти похожие ветки
← →
Кефир87 (2005-05-07 14:51) [0]Что-бы нормально вывести bmp шрифт мне нада что-бы фон был прозрачный... Фон совпадает с glClearColor (не знаю как мне это в голову пришло...). Так вот как использовать glBlendFunc что-бы этот мой 0 255 255 у текстуры был абсолютно прозрачным. И только он... А то я вот попробовал по эксперементировать... Лучший результат получился при glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA); но при этом какой-то фон все-таки заметен...
Если есть другие варианты...
← →
XProger © (2005-05-07 15:32) [1]"он совпадает с glClearColor" и?
А никак! Используй альфа канал :)
А лучше для шрифта нарисовать ч/б картинку и рисовать всё это добро с glBlendFunc(GL_SRC_ALPHA, GL_ONE);
При этом сама текстура создаётся не GL_RGB, а GL_ALPHA (т.е. 8 bpp)
В этом случае чем чернее тексель на текстуре тем он прозрачней на полигоне :)
← →
XProger © (2005-05-07 15:34) [2]P.S.
Для таких текстур (GL_ALPHA) рисовать будешь с glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
← →
Pa5ha (2005-05-07 16:36) [3]Или делай, как у Яна Хорна.
glBlendFunc(GL_ONE, GL_ONE);
Обычная текстура с блендингом. тока вот я сам так сдела, а как работает пока не знаю. Может, кто объяснит?
Выглядит так: http://d3dengine.narod.ru/opengl/screenshots/screenshot12.jpg
← →
XProger © (2005-05-07 17:02) [4]Pa5ha, чего не нравится?
← →
Pa5ha (2005-05-08 02:25) [5]Все нравиться, тока как работает? Как цает вычисляется?
← →
XProger © (2005-05-08 02:35) [6]Цвет ты сам задаёшь при помощи glColor перед вызовом отрисовки текста.
← →
Кефир87 (2005-05-08 16:09) [7]А можно вообще подробнее про текст... Пожалуста 8)
← →
Кефир87 (2005-05-08 16:15) [8]Меня интересует как приобразовать оконные координаты в GLевские... или наоборот... Ну что-бы текстура не растягивалась и не сжималась
← →
XProger © (2005-05-08 17:07) [9]
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 21:14) [10]Это понятно... А дальше что? Указывать вершины как
...glVertex2f(0.0, 0.0);
glVertex2f(10, 0);
glVertex2f(10, 16);
glvertex2f(0, 16);
...
Если буква в тестуре 10х16...
← →
XProger © (2005-05-09 01:37) [11]Текстура 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-14 19:55) [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-14 20:11) [13]перед выводом текста не пробовал glColor3f(1, 1, 1) делать? :)
← →
Кефир87 (2005-05-14 21:09) [14]
> 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 22:02) [15]Блендинг включил?
Текстура чёрно-белая? (чёрный будет прозрачным)
← →
Кефир87 (2005-05-14 23:23) [16]Ну да... Белые буквы на черном фоне... БМП 8бпп...
> Блендинг включил?glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE);
И текстура есть... Во всяком случае из файла читается точно... С 24бпп все было нормально...
← →
XProger © (2005-05-15 01:12) [17]Следовательно не правильно грузишь текстуру:
1) BMP в отличии от TGA не имеет ч/б вариаций. Т.е. в заголовке идёт палитра, а далее индексы цветов этой палитры в качестве данных:)
2) glGenTextures() как ты её декларировал?
3) не закрываешь файл ;)))
← →
Кефир87 (2005-05-15 13:39) [18]
> 1) BMP в отличии от TGA не имеет ч/б вариаций. Т.е. в заголовке
> идёт палитра, а далее индексы цветов этой палитры в качестве
> данных:)
Ок. тогда как загрузить правильно 8бпп бмп или ТГА?
> 2) glGenTextures() как ты её декларировал?procedure glGenTextures(n: GLsizei; var textures: GLuint); stdcall; external opengl32;
> 3) не закрываешь файл ;)))
Ну блин... Забыл просто 8) Бывает 8)
← →
XProger © (2005-05-15 15:10) [19]Кефир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 16:14) [20]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 17:14) [21]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 20:35) [22]
> 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 22:59) [23]Это не интерполяция...
У тебя размер текстуры не является степенью двойки!
2560x16 - это ужас просто. Делай 256х256!
gluBuild2DMipmaps при получении "корявых" размеров текстуры растягивает её до ближайшего 2^n. Тем самым портя качество текстуры :)
Используй glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Страницы: 1 вся ветка
Текущий архив: 2005.09.11;
Скачать: CL | DM;
Память: 0.52 MB
Время: 0.01 c