Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.24;
Скачать: CL | DM;

Вниз

Вопросы по OpenGL   Найти похожие ветки 

 
Pa5ha   (2005-12-17 17:45) [80]

Итак, пришло время продолжить :)

Есть ли в ОпенГЛ цветовой ключ и как его юзать? Искал, не нашел. А в директ Иксе есть :)


 
П7   (2005-12-17 19:24) [81]

1. Есть альфа-канал.
2. Есть блендинг.
3. Есть альфа-маска.


 
Pa5ha   (2005-12-18 13:16) [82]

П7, аотфа-канал, как и маска (сужу только по названию) отпадают т.к. требуют отдельного слоя с альфа-компонентой. Можно поподробнее. Требуется просто задать прозрачность для определенного цвета без гимора. Т.е. переписывать загрузчик текстур и добвлять альфаканал - не канает. Да и ресурсоёмко.


 
П7   (2005-12-18 13:31) [83]

Ничё и не ресурсоёмко. Нету обычного цветового ключа в Опене.Читай Краснова в общем.


 
Pa5ha   (2005-12-18 13:39) [84]

Дак читал. Там его нету, это я уже понял :)

Как сделать, чтоб ничо не переписывать? Ломает :) Думал, ща пару строк вставлю типа glEnable(gl_color_key); :)

Я даж фотожоп не знаю. Как я буду альфу добавлять? :)

Можно про бленд что-нить поподробнее?

Что есть альфа-маска?

И ещё. Надо где-нить физику самолета нарыть. Статью какую-нить. А то я даже не знаю, с какой стороны подойти.


 
Кефир87 ©   (2005-12-18 13:56) [85]

Ну придется переписывать (дописывать) загрузщик. Я это уже делал:

function LoadSprite(const BMP24 : string):GLuint;
var
 bf   : TBitmapFileHeader;
 bi   : TBitmapInfoHeader;
 f    : file of Byte;
 size : Cardinal;
 p,a  : Pointer;
 x    : Integer;
begin
 Result := 0;
 AssignFile(f, BMP24);
 Reset(f);

 BlockRead(f, bf, sizeof(bf));

 if bf.bfType = $4D42 then
 begin
   BlockRead(f, bi, sizeof(bi));

   if bi.biBitCount = 24 then
   begin
     size := bi.biWidth*bi.biHeight*3;
     GetMem(p, size);
     BlockRead(f, p^, size);
     GetMem(a, bi.biWidth*bi.biHeight*4);

     for x := 0 to bi.biWidth*bi.biHeight-1 do
     begin
       TRGBAarr(a^)[x].r := TBGRArr(p^)[x].r;
       TRGBAarr(a^)[x].g := TBGRArr(p^)[x].g;
       TRGBAarr(a^)[x].b := TBGRArr(p^)[x].b;

       if (TBGRArr(p^)[x].r = 255)and(TBGRArr(p^)[x].g=0)and(TBGRArr(p^)[x].b = 255)then
         TRGBAarr(a^)[x].a := 0 else
           TRGBAarr(a^)[x].a := 255;

     end;

     Result := GenTexture(a, bi.biWidth, bi.biHeight, 32, GL_RGBA);

     FreeMem(a);
     FreeMem(p);
   end;
 end;

 CloseFile(f);
end;


Надеюсь понятно что GenTexture делает текстуру по указателю 8)


 
П7   (2005-12-18 13:59) [86]

Переписывать придётся загрузчик текстур.
0. Выделяем память под текстуру с альфаканалом.
1. Читаем пиксель
2. Если пиксель <> цветовой ключ то [3] иначе [4]
3. Заносим пиксель в дату текстуры с альфой = 1.0 и [1]
4. Заносим в дату тектуры пиксель чёрного (или любого другого) цвета с альфой = 0.0 и [1]

Так, теперь мы можем выводить 2 способами.
1. С помощью блендинга - долго, но красиво и поддерживается всякие способы + прозрачность отдельных пикселей от 0.0 до 1.0.
2. Альфа-маской (альфа-отсечением) - быстро и в качестве замены уветового ключа - самое оно. Задаётся минимальная видимая прозрачность - остальное вырезается.

Поподробнее тебе расскажет твой друг РАМБЛЕР! (:


 
Pa5ha   (2005-12-18 14:02) [87]

Дак а нет расширений никаких, чтоб именно цветовой глюч? Ведь в директе есть! Значит, аппаратно реализован! Значит огород городить не стоит. Ладно. Сам найду. Если не найду... то за исходники спасибо :)


 
Pa5ha   (2005-12-18 14:17) [88]

Увы и ах :) Нашел точно такой же топ :) Где на просторах :)

Придется делать альфу :(

С альфомаской как делать - примерно представляю. На д3д делал. Надо только новый синтаксис освоить :)

И исчо: чо там насчет физики самолета? Расскажите хоть, как подступиться. (а может ветку новую задвинуть? :) )


 
Кефир87 ©   (2005-12-18 15:54) [89]


> Переписывать придётся загрузчик текстур.
> 0. Выделяем память под текстуру с альфаканалом.
> 1. Читаем пиксель
> 2. Если пиксель <> цветовой ключ то [3] иначе [4]
> 3. Заносим пиксель в дату текстуры с альфой = 1.0 и [1]
> 4. Заносим в дату тектуры пиксель чёрного (или любого другого)
> цвета с альфой = 0.0 и [1]


Это именно то, что я написал 8)


 
XProger ©   (2005-12-18 16:18) [90]

Pa5ha, сперва тебе необходимо побороть свою лень. А физику самолёта в МАИ тебе расскажут...


 
П7   (2005-12-18 18:49) [91]

РАМБЛЕР - твой друг!


 
NE_Parovoz ©   (2005-12-18 19:57) [92]

Pa5ha
>>Ведь в директе есть! Значит, аппаратно реализован!
в dx sdk так и написано, что аппаратно?

имхо, единственные способ "hardware" реализации (если это можно так назвать) - шейдеры

но зачем это надо?


 
Pa5ha   (2005-12-18 21:18) [93]


> П7   (18.12.05 18:49) [91]
> РАМБЛЕР - твой друг!

Гы. В таком слечае этот форум вообще не нужен.

С МАИ тоже, конечно, остроумная шутка. За физикой автомобиля идти к форду, за построением уровней к строителям, документацией по карточке идти в представительство ATI,nVidia...


 
XProger ©   (2005-12-18 21:47) [94]

Pa5ha, я знал, что ты смышлёный парень...


 
DR0N ©   (2005-12-18 22:17) [95]

Видите, всегда все гениальное - просто...
Уровни для Кваки4 делали профессиональные  инженеры-проектировщики =) им сейчас мало платят, вот в коммерцию подались =D


 
Pa5ha   (2005-12-22 22:52) [96]

глупость какая. Не могу цветовой глюч написать.

{------------------------------------------------------------------}
{  Load texture with color key                                     }
{------------------------------------------------------------------}
function LoadSprite(const BMP24 : string;mipmap:boolean):GLuint;
const
 ColorKey: Cardinal = $00FFFFFF;
type
 PPixelArray = ^TPixelArray;
 TPixelArray = array [0..0] of Byte;
var
bf   : TBitmapFileHeader;
bi   : TBitmapInfoHeader;
f    : file of Byte;
size : Cardinal;
p,a  : PPixelArray;//Pointer;

x    : Cardinal;
begin
 p:=nil;
 a:=nil;

Result := 0;
AssignFile(f, BMP24);
Reset(f);

BlockRead(f, bf, sizeof(bf));

if bf.bfType = $4D42 then
begin
  BlockRead(f, bi, sizeof(bi));

  if bi.biBitCount = 24 then
  begin
    size := bi.biWidth*bi.biHeight;
    GetMem(p, size*3);if p = nil then MessageBox(0, PChar("Can""t create ""p"""), "Loading Textures", MB_OK);
    BlockRead(f, p^, size*3);
    //SwapRGB24(p, size);
    GetMem(a, size*4);if a = nil then MessageBox(0, PChar("Can""t create ""a"""), "Loading Textures", MB_OK);

    for x := 0 to size-1 do
    begin
       a[x*4+0]:=p[x*3+2];
       a[x*4+1]:=p[x*3+1];
       a[x*4+2]:=p[x*3+0];
       a[x*4+3]:=255*
                 ord((p[x*3+0]<>((ColorKey and $00FF0000) shl 16))or
                     (p[x*3+1]<>((ColorKey and $0000FF00) shl 8))or
                     (p[x*3+2]<>((ColorKey and $000000FF) shl 0)));
//      TRGBAarr(a^)[x].r := TBGRArr(p^)[x].r;
//      TRGBAarr(a^)[x].g := TBGRArr(p^)[x].g;
//      TRGBAarr(a^)[x].b := TBGRArr(p^)[x].b;

//       if (TBGRArr(p^)[x].r = 255)and(TBGRArr(p^)[x].g=0)and(TBGRArr(p^)[x].b = 255)then
//         TRGBAarr(a^)[x].a := 0 else
//           TRGBAarr(a^)[x].a := 255;

    end;

//     Result := GenTexture(a, bi.biWidth, bi.biHeight, 32, GL_RGBA);

 glGenTextures(1, Result);

//  glBindTexture(GL_TEXTURE_2D, Result);
 { Select a filtering type. BiLinear filtering produces very good results with little performance impact
   GL_NEAREST               - Basic texture (grainy looking texture)
   GL_LINEAR                - BiLinear filtering
   GL_LINEAR_MIPMAP_NEAREST - Basic mipmapped texture
   GL_LINEAR_MIPMAP_LINEAR  - BiLinear Mipmapped texture
 }
 if mipmap then
   begin
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR); { only first two can be used }
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); { all of the above can be used }
     gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, bi.biWidth, bi.biHeight, GL_RGBA, GL_UNSIGNED_BYTE, a);
   end else
   begin
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); { only first two can be used }
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); { all of the above can be used }
     glTexImage2D(GL_TEXTURE_2D, 0, 3, bi.biWidth, bi.biHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, a);  // Use when not wanting mipmaps to be built by openGL
   end;

    FreeMem(a);
    FreeMem(p);
  end else
      MessageBox(0, PChar("Texture not loaded"), PChar("BMP Unit"), MB_OK);
end;

CloseFile(f);
end;


Короче, он грузит текстуру, но на ней какие-то полоски :)

И все остальные текстуры тоже грузятся с одними полосками, хотя грузяться другой функцией. Не могу понять, где собака порылась. Или мне надо идти учить матчасть?


 
Добрый   (2005-12-23 13:24) [97]

Можно юзать 8-битные текстуры? Да/нет.


 
XProger ©   (2005-12-23 17:47) [98]

Pa5ha, учить
Добрый, Да


 
XProger ©   (2005-12-23 21:41) [99]

Подсказка: смотри на значение параметров для glTexImage2D


 
Добрый   (2005-12-24 20:35) [100]

XProger, Вах, я тормоз :) Свежий взгляд внёс свежую струю. Спасибо :)


 
Pa5ha   (2005-12-24 20:36) [101]

Это был я :)


 
Pa5ha   (2005-12-24 20:52) [102]

Блин, лучше на стало. Это я исправил после того, как запостил :(


 
Pa5ha   (2005-12-24 21:06) [103]

Ладно, не парьтесь пока. перепишу по своему, посмотрим. Жаль, что мессаги не добавляются. Флуд получается из кучи мессаг одного человека. Я не умею сразу выразить свою мысль :)



Страницы: 1 2 3 вся ветка

Текущий архив: 2006.09.24;
Скачать: CL | DM;

Наверх




Память: 0.66 MB
Время: 0.031 c
1-1154439659
Евгений Владимирович
2006-08-01 17:40
2006.09.24
Как перевести DateTime в минуты?


4-1148457913
truegosha
2006-05-24 12:05
2006.09.24
QueryServiceStatus Отказано в доступе


15-1157458802
ddddd
2006-09-05 16:20
2006.09.24
Как расторгнуть контракт?


1-1155316602
wipr
2006-08-11 21:16
2006.09.24
Как изменить определенный байт в файле


2-1157114544
VitV
2006-09-01 16:42
2006.09.24
FastReport-подсчёт количества строк