Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.53 MB
Время: 0.029 c
14-1124261048
phpbb
2005-08-17 10:44
2005.09.11
Подскажите хороший форум по phpbb


11-1106571334
WhiteGuy
2005-01-24 15:55
2005.09.11
KeyDown, strtoint, StringReplace ...


4-1121762729
Kolan
2005-07-19 12:45
2005.09.11
Проверка очереди Com порта неработает.


3-1122469503
Yana
2005-07-27 17:05
2005.09.11
Получить список таблиц User-а


1-1124358762
PalPalych
2005-08-18 13:52
2005.09.11
I/O error 123