Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2005.09.11;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.019 c
1-1124716742
rummy
2005-08-22 17:19
2005.09.11
Запись динамического массива в нетипизированный файл


5-1097084089
TRyaSS
2004-10-06 21:34
2005.09.11
Компонент влияющий на форму


3-1122887461
Kara
2005-08-01 13:11
2005.09.11
Преобразование типов данных


3-1122805621
NickMan
2005-07-31 14:27
2005.09.11
Можно ли заменить подстроку через запрос?


14-1124245340
Думкин
2005-08-17 06:22
2005.09.11
17 августа. С днем рождения.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский