Форум: "Игры";
Текущий архив: 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.041 c