Конференция "Игры" » OpenGL. Текстуры. [Delphi, Windows]
 
  • tButton © (06.02.08 13:22) [0]
    продолжаем осваивать OpenGL
    наигравшись с BMP текстурами решил написать свой формат хранения текстур
    сделал. и даже конвертер к нему сделал
    и загрузчики сделал
    и в принципе все хорошо, не считая того что OGL отображает скормленую ему текстуру крайне криво
    в частности
    1) рисует кверху ногами (понятно)
    2) рисует зеркально (понятно)
    3) рвет часть изображения (непонятно). половина текстуры отрисовывается плавно переходя в преимущественно прозрачный мусор
    4) рисует со смещением (есть подозрение, что у меня ошибка в работе с памятью)


     private
       data: array of byte; // RGBARGBARGBA
       width: word;
       height: word;
       procedure load8888(f: string);     // mode = 1
       procedure load888(f: string);      // mode = 2
       procedure load4444(f: string);     // mode = 3
       procedure load5551(f: string);     // mode = 4
       procedure save8888(f: string);
       procedure save888(f: string);
       procedure save4444(f: string);
       procedure save5551(f: string);
     public
       procedure LoadBitMap(bmp, alpha: string);
       procedure LoadTexture(file_name: string; var texture: GLuint);
       procedure SaveTexture(file_name: string; mode: byte = 1);
     end;

    procedure tGTexture.LoadTexture(file_name: string; var texture: GLuint);
    var
     f: file of byte;
     mode: byte;
     pData: Pointer;
    begin
     AssignFile(f, file_name);
     Reset(f);
     Read(f, mode);
     CloseFile(f);
     case mode of
       1: load8888(file_name);
       2: load888(file_name);
       3: load4444(file_name);
       4: load5551(file_name);
     end;

     GetMem(pData, length(data));
     move(data, pData^, length(data));

     glGenTextures(1, Texture);
     glBindTexture(GL_TEXTURE_2D, Texture);
     glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);  {Texture blends with object background}

     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 }

     gluBuild2DMipmaps(GL_TEXTURE_2D, 4, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pData);
    end;



    сейчас ищу способ залить скриншот с коммуникатора
    как только - сразу отпишусь. ибо со скрином проблема понятнее
  • @!!ex © (06.02.08 13:25) [1]
    А нафига изобретать велосипед?
    Лично я юзаю png, маленький размер, RGBA, все что нужно нормальному человеку.
    весьма не плох dds, но там загрузка посложнее.
  • tButton © (06.02.08 13:48) [2]
    у меня линк есть на w3 с описанием формата =)
    но сейчас меня интересует конкретный момент работы с OpenGL

    пысы
    изобретать велосипеды бывает полезно для общего развития =)
  • Dib@zol © (06.02.08 19:39) [3]
    http:\webfile.ru\1728424

    Вот мой модуль для работы с BMP, JPG и GIF. Альфаканал ессно отсутствует, и вычисляется уже в процессе перегонки массива байт. Однако можно дописать и поддержку альфы. А лично я щаслиф и так... :)
  • tButton © (07.02.08 00:59) [4]

    > Dib@zol ©   (06.02.08 19:39) [3]

    именно из-за альфы я за свой формат и взялся
    транспарентный битмап при повороте на границе прозрачности выдавал серую кайму

    вчера вечером принял допинг и переписал буквально три строчки
    изменил формат передаваемых данных с BYTE на FLOAT
    и все заработало... ерунда какая-то =(
  • XProger © (07.02.08 01:48) [5]
    use da tga!
  • tButton © (07.02.08 02:12) [6]

    > XProger ©   (07.02.08 01:48) [5]
    > use da tga!

    gimme da header =)
  • tButton © (07.02.08 05:06) [7]
    Лично я юзаю png, маленький размер, RGBA, все что нужно нормальному человеку.
    проверил. текстура 64х64 (рендомные пиксели)
    в пнг 24(?) - 12.8кб
    в пнг 8 - 7.3кб
    в tex 5551 - 8кб (жмется до 4.2)
    в tex 4444 - 8кб (жмется до 3.0)
    пнг не жмется, т.к. уже сжат. посему - пнг лесом.
  • ketmar © (07.02.08 05:15) [8]
    >[7] tButton © (2008-02-07 05:06:00)
    >(рендомные пиксели)

    обалдеть. нашёл, что проверять — высокоэнтропийный шум…
  • tButton © (07.02.08 05:41) [9]
    ketmar ©   (07.02.08 05:15) [8]
    >[7] tButton © (2008-02-07 05:06:00)
    >(рендомные пиксели)
    обалдеть. нашёл, что проверять — высокоэнтропийный шум…


    именно то, что хуже всего жмется. имхо - показатель.
  • ketmar © (07.02.08 06:35) [10]
    >[9] tButton © (2008-02-07 05:41:00)
    >именно то, что хуже всего жмется. имхо — показатель.

    угу. показатель. средней температуры по больнице.

    показатель — это когда ты на нескольких гигах своих реальных данных проверяешь. а сей пример — онанирование энтропии, пардон.

    ---
    Understanding is not required. Only obedience.
  • tButton © (07.02.08 07:01) [11]
    *ушел проверять*
  • tButton © (07.02.08 07:24) [12]
    кадр из фильма (512х384)
    bmp - 576k
    png24 - 163.2k
    5551+zip - 87.6k
    4444+zip - 55.3k

    обоя на рабочий стол(1120х770)
    bmp - 2.4M
    png24 - 0.9M
    5551+zip - 399.4k
    4444+zip - 246.1k

    скриншот скринсейвера the Lost Watch (1024х768)
    bmp - 2.2M
    png24 - 1.1M
    5551+zip - 753.0k
    4444+zip - 485.5k

    charmap азбуки катакана (128х128)
    bmp - 48k
    png24 - 6.6k
    5551+zip - 2.8k
    4444+zip - 2.2k
  • ketmar © (07.02.08 07:38) [13]
    проверка некорректная изначально. два последних варианта сохраняют меньше данных, потому и жмутся лучше. это же очевидная вещь. всё равно что сравнивать словарь на 100000 слов и на 10000. понятно, что второй будет и меньше, и легче. то же, что и с jpg — потери.

    ---
    Understanding is not required. Only obedience.
  • tButton © (07.02.08 09:50) [14]
    проверка некорректная изначально.
    подскажите в чем
    два последних варианта сохраняют меньше данных, потому и жмутся лучше.
    предпоследний вариант - часы в ручье. довольно-таки пестрая картинка.
    последний - да. но он приведен для сравнения.
    практически любая картинка урезаная до 15bpp сжимается до 20-25%
    про словари я знаю =)
    а качество после потери 9 бит меня вполне устраивает.

    ПыСы
    между прочим в сабже речь не об этом, а о том что не получается корректно скормить OGLу массив байт
  • ketmar © (07.02.08 09:52) [15]
    >[14] tButton © (2008-02-07 09:50:00)
    да пофигу сабж. сравнение-то некорректное. мне и сабж лениво читать — небось там тоже где-то мягкое с квадратным попуано, как в этом случае.

    ---
    Understanding is not required. Only obedience.
  • tButton © (07.02.08 10:41) [16]
    да пофигу сабж. сравнение-то некорректное. мне и сабж лениво читать
    а клавиатуру топтать не лениво, как я погляжу.
  • ketmar © (07.02.08 10:54) [17]
    >[16] tButton © (2008-02-07 10:41:00)
    не лениво. я так:
    а) отдыхаю;
    б) тестируб kpmc.

    ---
    Understanding is not required. Only obedience.
  • antonn (work) (07.02.08 11:20) [18]
    а почему бы просто не юзать обычный Tbitmap 32bit, для своего формата просто ужимать его zlib'ом?
    а если уж совсем свой, то мне вот удобней было array of dword :)
  • tButton © (07.02.08 11:40) [19]
    antonn (work)   (07.02.08 11:20) [18]
    zlib'ом не пользовался и не интересовался пока. да и речь сейчас, не о формате хранения данных, а о том как этими данными кормить OGL. не смотря на то, что проблему для себя я уже решил, причина ее возникновения по-прежднему вызывает интерес.
  • Sapersky (07.02.08 11:47) [20]
    Если потери качества устраивают - см. DDS, точнее, DXT1-5. Там по сравнению с 32-битным bmp всё сжимается в 4 раза (24-битный - в 6 раз), и результат ещё можно сжать архиватором.
  • antonn (work) (07.02.08 11:55) [21]
    tbitmap по сути тот же массив dword, только его можно просмотреть в любом редакторе :) к тому же должен же быть метод конвертирования bmp в формат текстур ogl.
 
Конференция "Игры" » OpenGL. Текстуры. [Delphi, Windows]
Есть новые Нет новых   [134431   +10][b:0][p:0.002]