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

Вниз

Загрузчик текстур   Найти похожие ветки 

 
Pa5ha   (2006-03-31 18:19) [0]

Сейчас немного парюсь, пытаюсь написать свой загрузчик текстур. И возникли некоторые вопросы.

Как использовать 8-мибитные текстуры? Напр.
glTexImage2D(GL_TEXTURE_2D, 0, 4, Width, Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pData)
Что вписать в поле components (там, где сейчас 4). Как распределяются биты в gl_rgb8, gl_rgba8, какова палитра для 8-мибитной текстуры, в общем, как сконвертить 24 бита в 8? Ещё слышал, что при использовании 8-мибитных текстур память нифига не экономится т.к. опенГл перегоняет все в свой формат, который для него удобен. Хотел не заморачиваться и использовать бмп, но придется юзать тга или даже свой формат, что тоже не очень удобно.

В общем, сейчас ковыряю модели из гта3. Там есть corpse. Все бы ничего, да обычный блитинг не поволяет сделать красивые пятна крови на этой машине. Вот все скретчи, разбитые стекла получились просто деально, а для крови надо альфакомпонент делать. Зы: мой блиттинг для крови, который некрасивый, но для скретчей подходит: glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR);


 
Pa5ha   (2006-03-31 18:22) [1]

+ текстура скретчей (ну вмятин на дверях, разбитых стекол) черно-белая. Тоже была альфиканалом сначала.


 
a22 ©   (2006-03-31 19:53) [2]

проблема во флагах альфа-блендинга что ли? тогда для текстуры с альфа-каналом (src_alpha, inv_src_alpha)


 
TWINc ©   (2006-03-31 20:28) [3]

блиттинг и блендин две разные вещи


 
Rial ©   (2006-03-31 21:53) [4]

Чтобы ты не копошился на уровне прошлого века, вот тебе еще в помощь:


glGenTextures(1,Result);
    glBindTexture(GL_TEXTURE_2D,Result);
    gluBuild2DMipmaps(GL_TEXTURE_2D,4,Width,Height,GL_RGBA,GL_UNSIGNED_BYTE,DataAlph a);

//Здесь идет работа с текстурой.

glDeleteTextures(1,@Result);



Конечно, удалять сразу не надо...

Код даст ускорение работы примерно в 2-3 раза.

P.S. А еще, ты память из-под Bitmap или чего у тебя там грузится, освобождаешь при работе с текстурами ?


 
Pa5ha   (2006-03-31 21:59) [5]

Rial, что именно дает прирост в данном куске кода? Мипмап или альфа?

Я гружу кусками в память с помощью pointer. Как Ян Хорн. Только он, в отличии от меня память не очищаем за текстурой =)

В общем, создал я битмап восьмибитный:width:=256;
height:=32;

fileHeader.bfType:=19778;
fileHeader.bfSize:= width*height+sizeof(FileHeader)+sizeof(InfoHeader);//49206;
fileHeader.bfReserved1:=0;
fileHeader.bfReserved2:=0;
fileHeader.bfOffBits:=54;

infoHeader.biSize:=sizeof(infoHeader);//40
infoHeader.biWidth:=width;
infoHeader.biHeight:=height;
infoHeader.biPlanes:=1;
infoHeader.biBitCount:=8;
infoHeader.biCompression:=0;
infoHeader.biSizeImage:=width*height;//49152
infoHeader.biXPelsPerMeter:=0;
infoHeader.biYPelsPerMeter:=0;
infoHeader.biClrUsed:=0;
infoHeader.biClrImportant:=0;

filewrite(f,fileheader,sizeof(fileheader));
filewrite(f,infoheader,sizeof(infoheader));

for j:=0 to height-1 do
for i:=0 to width-1 do
begin
b:=i;
filewrite(f,b,1);
end;

увидел градиент серого от черного до белого и просто черный битмап =) Ворпрос: в битмапах 8-бит есть палитра? Если да, то как её создать и как её использовать в ОпенГЛ. Меня вот щас очень интересует вопрос просто загрузки восьмибитных текстур и восьмибитных с альфаканалом.


 
Pa5ha   (2006-03-31 22:28) [6]

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


 
Rial ©   (2006-03-31 22:33) [7]

1.
Не понятно, чего ради ты стараешься.
Реально различные размеры текстур в памяти OpenGL будут только для текстур с альфа-каналом, и без него. Все равно тот вид, в котором у ТЕБЯ лежит растр, OpenGL мало интересует. Ты же даже память из-под растра освобождаешь. Если экономишь место на диске- экономь, потом переводи во вормат RGB или RGBA с помощью TBitmap Pixelformat.
2.
В битмапах есть палитра 8b, использовать ее в OpenGL - никак.
3.
По кусок кода:
а) В твоем случае ты, скорее всего, загружаешь текстуры в список.
В моем примере этого делать не нужно будет.
б) В твоем способе есть важнейший недостаток - при вызове этих списков текстура каждый раз проходит путь "оперативная память - видеопамять". Это, мягко говоря, ужасно.
В моем куске кода этого нет. Текстура напрямую загружается в видеопямять, отгружается только при необходимости (отсутствии достаточного количества этой самой памяти).
в) Если загружать текстуры так, как в куске кода, то OpenGL будет применять к ним сжатие, на острых углах фигуры будут оптимизироваться.
Отсюда - уускорение вывода в 2-3 раза.


 
Pa5ha   (2006-03-31 22:50) [8]

1. Ну чтож... Тада все будет в 24 бита. Я не использую bitmap, а посему кодить перевод в другой формат пикселей - большая жопа, как мне кажется. Только вот нафига в играх 8 бит? Они место на диске экономят чтоль? Та же мафия, гта. А то блин первый раз долго ошибку искал, пока не понял, что один битмап не в том формате =)
3.а. в моем куске кода я просто пытался создать битмап с 8 бит. Это мне, как мне кажется, не удалось т.к. см. п.2 (там есть палитра).
б. списки? 8) Где? :) Кода моего рендера тут нету :) Текстуры учился создавать у Яна Хорна. В принципе, другого способа создания текстур я не видел ещё.
в. эм, это называется мипмап т.е. к ним применяется не сжатие, а ОпенГЛ создает ещё много маленьких текстур, чтоб на большой дистанции на один пиксель приходилось не больше одного текселя.

А вообще, мануал бы какой-нить по текстурам, по работе с ними, примерчики там было бы просто здорово.


 
Rial ©   (2006-03-31 23:43) [9]

Pa5ha   (31.03.06 22:50) [8]
Проверь почту


 
KreeS ©   (2006-04-01 00:04) [10]

Можно делать восьмибитные тектуры в OpenGL и использовать их как оттенки серого или как чисто альфу (например для спрайтов света)

GL_ALPHA8 = $803C;
GL_LUMINANCE8 = $8040;

gluBuild2DMipmaps(GL_TEXTURE_2D, GL_ALPHA8, Width, Height, GL_ALPHA, GL_UNSIGNED_BYTE, PData)
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_LUMINANCE8, Width, Height, GL_LUMINANCE, GL_UNSIGNED_BYTE, PData);


 
Pa5ha   (2006-04-01 00:22) [11]

Я уже конвертер написал и свой формат, но все равно спасибо :)

KreeS, при бинде такой текстуры включать бленд glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);? Поиграемся =)

А люминанс - чо такое? какой эффект дает?

Rial, ок, пасиба, ща позырим :)


 
KreeS ©   (2006-04-01 01:14) [12]

Ну люминанс это без альфы, просто оттенки серого (один байт на все три компоненты цвета одинаковый).
А GL_ALPHA если для свечения использовать, то неплохо смотрится glBlendFunc(GL_SRC_ALPHA, GL_ONE), а вообще ее удобно использовать для одноцветных спрайтов, имеющих альфу, например кровищщи. Делаешь полностью белую текстуру с альфа-каналом и в проге можно легко менять ее цвет. Бац! И кровищща уже не красная, а зеленая, потому что из инопланетянина пролилась :), и на диске занимает в 4 раза меньше обычной, а если еще и РЛЕ компрессию прикрутить...


 
XProger ©   (2006-04-01 02:04) [13]

Pa5ha, Rial
GL_COLOR_INDEX
Вместо того, чтобы рассказывать сказки про возможности и невозможности OpenGL, почитали бы Краснова...

KreeS
прикрутив RLE компрессию - увеличишь размер дистрибутива игры.


 
Pa5ha   (2006-04-01 17:21) [14]

Эта, я сделал текстура с альфой. Текстура с кровищей, вмятинами и разбитым стеклом сделал, как в гта3. Т.е. белый квадрат+альфа. Загрузчик написал. Как теперь эту альфу в игре включить? Блендом? А AlphaFunc зачем? Краснов по поводу альфатекстуры не особо распространяется :)


 
Pa5ha   (2006-04-01 17:39) [15]

Короче, вот какая ещё проблема.
Материал задаю так:
     glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, @Materials[Sections[i].mtlNumber].Color);

Так ведь задаются ведь вроде все 4 компонента, т.е. rgba? Просто бленд задаю так:
         glEnable(GL_BLEND);
         glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Получается, что используется не альфа текстуры, а альфа материала.

Как указать конкретную альфу и можно ли использовать эти альфы вместе?


 
Pa5ha   (2006-04-02 19:45) [16]

Ну что, никто не знает? Ладно, спрошу попроще. Как выбирать между альфой материала и альфа-канала текстуры?


 
Pa5ha   (2006-04-03 23:33) [17]

Чудеса в общем какие-то творяться. Поигрался с параметрами, выставил все, как было (  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);) и все стало работать так как надо. Если у текстуры есть альфа, то используется альфа текстуры, если нету, то используется альфа материала. Во мля как :)



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

Форум: "Игры";
Текущий архив: 2007.02.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.051 c
15-1170099470
hmmm
2007-01-29 22:37
2007.02.18
помогите перевести фразу с eng.


1-1166714894
DelphiLexx
2006-12-21 18:28
2007.02.18
Нужна помощь в проектировании новой таблицы


8-1148017505
antonn
2006-05-19 09:45
2007.02.18
получить спектр звука с микрофона


15-1170137781
КиТаЯц
2007-01-30 09:16
2007.02.18
Является ли грехом использование взломанных версий? :)


2-1169710706
inkvizitor
2007-01-25 10:38
2007.02.18
3D графика





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский