Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопросы по OpenGL [Delphi, Windows]


Страницы:   1 2 3 4 5 6

Pa5ha ©   (2005-04-01 00:20:00) 

Решил написать небольшой симулятор на ОпенГЛ и столкнулся с некоторыми тонкостями.

1. скайбокс из-за интерполяции имеет стыки, которые всё сильно портят. Как их можео убрать?
2. как удалять текстуры имея только GLUint? Просто, сцены надо менять по ходу дела, а старые текстуры не удаляются до завершения (и удаляются ли вообще).

Вопросы будут поступать ещё скорее всего =)


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

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


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

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


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

Это был я :)


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

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


XProger   (2005-12-23 21:41:00) [5]

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


XProger   (2005-12-23 17:47:00) [6]

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


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

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


Pa5ha   (2005-12-22 22:52:00) [8]

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

{------------------------------------------------------------------}
{  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;


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

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


DR0N   (2005-12-18 22:17:00) [9]

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


XProger   (2005-12-18 21:47:00) [10]

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


Pa5ha   (2005-12-18 21:18:00) [11]


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

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

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


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

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

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

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


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

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


XProger   (2005-12-18 16:18:00) [14]

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


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


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


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


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

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

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

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

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


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

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


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

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

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

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


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

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

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)


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

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

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

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

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

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

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


Страницы:   1 2 3 4 5 6

Наверх

Титульная страница Поиск, карта сайта Написать письмо