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

Вниз

блендинг текстур по маске   Найти похожие ветки 

 
korvin88   (2006-07-19 19:30) [0]

Всем привет!

Вопрос практический - как совместить две текстуры на одном полигоне, имея битовую маску их совмещения? Т.е. там, где маска белая, должна быть одна текстура, а там, где черная - другая. API - OpenGL.


 
DeadMeat ©   (2006-07-19 19:49) [1]

http://www.delphi3d.net/articles/viewarticle.php?article=terraintex.htm
Правда пример на терраин, но сам принцип думаю понятен.


 
korvin88   (2006-07-20 04:06) [2]

Нет, не то. Там они не используют маску, а просто блендят текстуры. Мне же нужно именно по маске.


 
tButton ©   (2006-07-20 07:49) [3]

пройтись по текстурам
а потом результат положить на полигон
если маска не динамическая, то такой ваиант наиболее быстродейственнен

а вообще можно сначала положить одну текстуру
а маску сделать альфаканалом второй текстуры
и положить вторую текстуру сверьху


 
korvin88   (2006-07-20 08:36) [4]

tButton
Как именно сделать и то и другое? И что значит динамическая маска? Типа динамически изменяется со временем? У меня просто много разных масок и нужно выводить много полигонов с разными текстурами, смешанными по этим разным маскам. Т.е. изменять текстуры (приделывать к ним альфу и т.д.) не катит.


 
DeadMeat ©   (2006-07-20 08:47) [5]


> Нет, не то. Там они не используют маску, а просто блендят
> текстуры. Мне же нужно именно по маске.

Вообщето они не просто блендят текстуры, а именно блендят их по маске. Я по этому примеру делал текстурирование своего терраина. Правда есть конечно и ограничение на количество. Зато шустро.

Если надо много, то gr32 и ей подобные в помощь. Но это уже не аппаратно.
Либо как в ссылке, но многопроходным рендерингом.

Больше не знаю...
Есть конечно еще и шейдеры. Там тоже просто реализуется, но насчет быстродействия, судя по моим экспериментам, при количестве текстур больше 4-5 на один полик, тормоза выше чем через комбайнер. Хотя шейдер простой как пятка.. Пришлось оптимизировать по дальности отрисовки.


 
tButton ©   (2006-07-20 08:48) [6]

1 вариант.
есть: текстура 1, текстура 2, маска для смешивания
мешаешь обе текстуры по маске результат кладёшь в третью текстуру
эту третью текстуру кладёшь на полигон

2 вариант
есть: текстура 1, текстура 2, маска для смешивания
кладёшь на полигон текстуру 1
делаешь маску альфа-каналом для второй текстуры (или её дубликата)
кладёшь вторую текстуру на полигон поверх первой


 
korvin88   (2006-07-20 10:03) [7]

tButton
Второй вариант пока отпадает - работать, конечно, будет, только медленно. Мне же маски нужно будет часто менять.

Степень подробности первого варианта поражает :))). Самое интересное место - мешаешь обе текстуры по маске. Хотелось бы узнать, как именно это сделать? То, что потом результат нужно будет вывести на экран, можно было не говорить :).


 
tButton ©   (2006-07-20 12:44) [8]

а что не понятно?
проходишься по пикселям
result.R = sprite1.R * mask + sprite2.R * (mask - 1);
result.G = sprite1.G * mask + sprite2.G * (mask - 1);
result.B = sprite1.B * mask + sprite2.B * (mask - 1);
где
sprite#.R - красная составляющая цвета пикселя
sprite#.G - зелёная составляющая цвета пикселя
sprite#.B - синяя составляющая цвета пикселя
mask - значение маски для данного пикселя выраженое в значении 0..1
и так для каждого пикселя.


 
korvin88   (2006-07-20 13:38) [9]

tButton
Делать это в realtime?!?! Тогда уж лучше каждый раз приделывать к текстуре нужную альфу :)). Предложенный тобой способ, может, конечно, и правильный, теоретически... Но блин, меня ведь в первую очередь интересует практическая реализация такого эффекта. То, что их цвета нужно смешать по подобному закону, я уже давно понял. Но как именно это сделать??? Только шейдеры, или можно обойтись расширениями? Какими? И как?

Именно для этого я и указываю, что юзаю OpenGL. Тут, по идее, нужен блендинг, но у меня не получается его правильно настроить. Я вывожу маску - отлично. Вывожу поверх нее полигон с текстурой травы и glBlendFunc(GL_DST_COLOR,GL_ZERO) - вроде пока нормально (там где маска белая - появляется трава). Но затем пытаюсь вывести еще один полигон, с текстурой камня и glBlendFunc(GL_SRC_COLOR,GL_ONE ) - и все, уже облом (трава и камень резко меняют цвет, накладываясь друг на друга). Если юзать не битовую маску, а с альфой, то можно добиться, что камень выводится еще нормально, но трава, что ни делай, смешана с текстурой камня :((. Уже задолбался с этим :(. Я явно что-то делаю не так и почти наверняка существуют правила, как делать подобные вещи верным образом. Я вот и хочу узнать у вас, как это делается, т.к. по логике вещей, я явно не первый, кто с этим сталкивается. Искренне надеюсь на вашу помощь.


 
Trimp ©   (2006-07-20 14:12) [10]


> Делать это в realtime?!?! Тогда уж лучше каждый раз приделывать
> к текстуре нужную альфу :)). Предложенный тобой способ,
> может, конечно, и правильный, теоретически... Но блин, меня
> ведь в первую очередь интересует практическая реализация
> такого эффекта. То, что их цвета нужно смешать по подобному
> закону, я уже давно понял. Но как именно это сделать???


Это можно сделать через расширение ARB_texture_env_combine.
Описание тут http://steps3d.narod.ru/tutorials/tutorial-4.html


 
korvin88   (2006-07-20 15:24) [11]

Trimp
Гы... це я (как ты, наверное, уже понял) :))). В общем, ты мне это уже советовал :))). Просто тогда на геймдеве я рано порадовался - в реализацию закрался глюк (см. пост выше) и я решил уточнить вопрос здесь.
Мне действительно интересно, можно ли отладить вариант с блендингом.


 
a22 ©   (2006-07-20 17:34) [12]

если собираешься менять маску - делай шейдером. шейдер в 3 строки, не такой уж тяжелый, а быстрее все равно никак не сделаешь


 
korvin88   (2006-07-20 18:05) [13]

a22
Я шейдеры раньше вообще не изучал. Но раз так, то видимо, придется. Если не трудно, то подкинь сам шейдер, чтобы я мог в нем разобраться, а также какую-нить простую доку для начинающих по использованию шейдеров в Delphi/OpenGL.


 
tButton ©   (2006-07-21 08:44) [14]


> Делать это в realtime?!?!

а сделать это один раз в начале никак?


 
korvin88   (2006-07-21 11:45) [15]

tButton
Обьясняю подробно:
У меня есть ландшафт, нужно его затайлить. То место, где, например, трава граничит с камнем, нужно затекстурить по определенной маске - часть травой, а часть - камнем. Масок у меня много (16 штук). Текстур тоже (минимум - 5). Мне нужно, чтобы ландшафт рисовался, а следовательно, и текстуры блендились по маске в реальном времени (желательно с приемлимым FPS :))). Ты, насколько я понимаю, предлагаешь мне еще на этапе инициализации из базовых 16 черно-белых масок и 5 текстур сгенерировать все возможные комбинации совмещения этих текстур и забить все это в оперативу, чтобы потом рисовать по мере надобности???
Я, конечно, не спец в этом деле, но, imho, очень сильно пострадает время загрузки, а также на все это потребуется много памяти.


 
a22 ©   (2006-07-21 12:10) [16]

во многих играх тайлы были заранее нарисованы. оперативка дешевле новой видеокарты


 
tButton ©   (2006-07-21 14:25) [17]


> сгенерировать все возможные комбинации совмещения этих текстур
> и забить все это в оперативу, чтобы потом рисовать по мере
> надобности???

не все, а только те которые используются
и получится у тебя 16*5 80 текстур
не так уж много для современного железа

> во многих играх тайлы были заранее нарисованы.

угум-с

> оперативка дешевле новой видеокарты

однако или я чего не понимаю или текстуры - таки лежат в видеопамяти


 
korvin88   (2006-07-21 17:41) [18]

tButton
Вот тут ты не прав. Что значит, "только те, которые используются"? Теоретически, использоваться могут все комбинации. А следовательно, их общее число будет около 400 (навскидку). Забиндинные текстуры, насколько я знаю, действительно хранятся в видеопамяти. Нагрузка на нее будет определятся размерами тайлов. Их можно сделать небольшим, так что первая проблема не так важна, разве что если только в видеокарте не стоит ограничение на кол-во используемых текстур :))). Гораздо больше меня смущает этап загрузки всего этого дела - 100-процентно получится медленно и печально :((.

В общем, резюмирую: такие варианты для тайлинга, как
1)заготовить хренову тучу текстур заранее.
2)сгенерить эту самую тучу на этапе инициализации.
и т.п., я буду использовать только тогда, когда израсходую все остальные методы. А следовательно, с нетерпением жду ответа от a22 по поводу того шейдера в 3 строки (уж больно заманчиво звучит :))).


 
korvin88   (2006-07-22 13:35) [19]

All
Up! Ну что? У кого-нить есть идеи? Может все-таки операцию, которую предложил tButton можно провернуть и без шейдеров, только с помощью расширений? У меня пока не получается :(. Ну хоть смысл простого блендинга понял - и то польза :).

В общем тут получается, что при обычном блендинге нельзя смешать одновременно 3 текстуры (ну, 2 типа земли и маску). Сначала нужно смешать 2 (одну землю и маску). Потом добавить еще одну (вторую землю). Так вот последняя добавленная влияет на уже готовую и правильно затекстуренную часть результирующего тайла :((. И никак от этого не избавишься :(. В голову лезет пока только использовать дополнительный буффер цвета и потом обьединять его с основным. Но нутром чую, что идея -бред :))).


 
OSokin ©   (2006-07-22 21:01) [20]

Я знаю, как это делается с GDI! RTFM MaskBlt и юзай с обоими рисунками! Как еще - спрашивай у antonn"а :)


 
DeadMeat ©   (2006-07-22 22:06) [21]

Так я и не понял, почему способ из ссылки не подходит.


 
A22 ©   (2006-07-22 22:29) [22]

sampler2D TexBase0 : register(s0);
sampler2D TexBase1 : register(s1);
sampler2D TexMask  : register(s2);

void ps_main(in float2 iTex0 : TEXCOORD0, out float4 output : COLOR)
{
   float4 c0 = tex2D(TexBase0, iTex0);
   float4 c1 = tex2D(TexBase1, iTex0);
   output = (c1 - c0)*tex2D(TexMask, iTex0).r + c0;
}

это на HLSL, я работал только с DirectX. но думаю, разницы особой нет. Шейдер берет 3 текстуры и смешивает две первые по маске (третья текстура). ничего особо умного, по сути то же, что предлагали считать на процессоре, но переписанное для видюхи.

2 tButton
насчет текстур и памяти - где они будут лежать от пула зависит :)


 
korvin88   (2006-07-23 04:27) [23]

OSokin
Нет, мне нужен именно OpenGL. Если antonn что-нибудь знает, то пусть отпишется :).

DeadMeat
Может я, конечно, чего-то не понимаю, но там у них маскирование не используется. Маска - это не те данные, которые указывают, где на карте располагается трава, а где земля. Маска - это те данные, которые указывают на то, как в каждом конкретном тайле смешиваются эти текстуры.

Вот маска (приблизительно):
0000000000000000
0000000000000000
0000000000000000
0000000100000000
0011001101111000
1111111111111111
1111111111111111
1111111111111111

Единицы - белый цвет, нули - черный. Каждый тайл должен рисоваться с 3 параметрами - текстура для белого цвета, текстура для черного и маска. Если цвет маски серый (0.5), то должна получится смесь соответствующих текстур. В примере из статьи они для каждого вертекса указывают "coverage factor", т.е (насколько я понял), с какой прозрачностью нужно нарисовать там ту, или иную текстуру. Я пытаюсь реализовать совсем другой метод.

A22
Спасибо, попробую разобраться :).


 
DeadMeat ©   (2006-07-23 13:05) [24]

Собсна говоря это не просто Covarage factor.
Там ведь число в пределах 0..255. Это не так, что вот 0 это трава, а 255 это земля и ничего более. Между ними как раз и идет градация. 127 - это будет среднее между травой и землей. Да и там просто показан пример. Принцип можно из него понять и сделать как надо. Маска ведь черно белая, как ни крути. В начале (к примеру) кладется трава. И там, где на маске, скажем 255 - идет трава. Но если маску сгладить и сделать не сразу 255, а к примеру градиентом от 0 до 255, плавным, то и на полике будет плавный переход. Это и есть блендинг по вашей маске. И как раз используя расширения. А точнее комбайнер. Есть и ограничение, на 4 текстуры одновременно, но что мешает подставлять нужные текстуры в нужный момент?

Хотя конечно я могу и ошибаться, пускай спецы меня поправят. Я давно уже OGLом не занимался. Времени нет.


 
korvin88   (2006-07-23 13:52) [25]

DeadMeat
Все верно - это один из вариантов затайлить ландшафт. Но я делаю по другому. У меня маска определена для каждого тайла, а не вертекса.

Раскажу, пожалуй, зачем я это все придумал:

Какой самый простой и тупой способ красиво затайлить ландшафт? Правильно - подготовить заранее все текстуры тайлов со всеми переходами и рисовать их по мере надобности. Но вот проблема - а что если у нас 5 базовых текстур (трава, земля, снег, песок и дорога)? Тогда, как я уже говорил несколькими постами выше, нам нужно порядка 400 текстур с переходами (трава-земля 16 видов, трава-снег 16 видов и т.д.). Тут я и подумал - почему бы это дело не оптимизировать и хранить только базовые текстуры и 16 черно-белых масок переходов, а остальные блендить на основе этих масок в realtime. Такая вот была исходная мысль.


 
DeadMeat ©   (2006-07-23 22:26) [26]

Я чего сказать та хочу... Блендинг по маске мона сделать комбайнером без проблем. Хоть какой. Просто главное его правильно применить. В примере как раз это и показано. Просто вчитаться надо.
Там на всю поверхность кладется одна текстура, потом по маске, кладется другая. И получается, что маска это Coverage factor, которая показывает, где трава, а где земля. В маске это черные и белые участки. Можно еще и альфа канал подключить. Тогда одной маской можно сразу три текстуры сблендить. Но на самом деле это и есть нужный Вам (как я понял) бленд текстур по маске. Разве не так?


 
XProger ©   (2006-07-24 00:10) [27]

GLSL fragment program
uniform sampler2D mask;
uniform sampler2D tex1;
uniform sampler2D tex2;

void main(void)
{
  vec2 tc = gl_TexCoord[0].st;
  gl_FragColor = mix(texture2D(tex1, tc), texture2D(tex2, tc), texture2D(mask, tc));
}


tButton дал верное решение твоей задачи, советую не воротить носом...


 
korvin88   (2006-07-24 15:07) [28]

DeadMeat
Нет, не так, блин :). По видимому, тут без иллюстраций не обойтись. Маска у меня кладется на [b]каждый[/b] тайл. [b]Совместно[/b] с двумя текстурами. И цвет маски определяет прозрачность текселей (так, кажется, это называется) на этих текстурах, а не прозрачность самих текстур.

Короче, вот:

[b]Пример №1[/b] (как тут по человечески заливать изображения и давать ссылки я не знаю, так что сорри :))
У нас есть:
маска смешивания - http://www.gamedev.ru/images/?id=13117
текстура №1 (для белого цвета) - http://www.gamedev.ru/images/?id=13118
текстура №2 (для черного цвета) - http://www.gamedev.ru/images/?id=13119
После смешивания мы должны наложить на квад - http://www.gamedev.ru/images/?id=13120

Для полного понимания идем дальше :)))
[b]Пример №2[/b]
У нас есть:
маска смешивания - http://www.gamedev.ru/images/?id=13121
текстура №1 (для белого цвета) - http://www.gamedev.ru/images/?id=13122
текстура №2 (для черного цвета) - http://www.gamedev.ru/images/?id=13123
И какую текстуру мы должны получить в итоге??? Правильно - http://www.gamedev.ru/images/?id=13124

Надеюсь, теперь все понятно? :)) Таким образом мы для каждого квада создаем по мере надобности текстуру прямо в процессе рендеринга (на основе базовых текстур и масок). Если ты мне подскажешь, как на комбайнерах из статьи сделать такой эффект, буду тебе очень благодарен.

XProger
Я и не ворочу, просто он дал мне теорию (с которой я полностью согласен), а у меня проблемы именно с практической реализацией. За шейдер спасибо. Изучать я собирался GLSL, так что твой пример мне как раз кстати :).


 
korvin88   (2006-07-24 15:19) [29]

Правка:
Пардон, в примере 2 очепятка :)). Черному цвету соответствует текстура №1 (песок), а белому - №2 (снег).


 
DeadMeat ©   (2006-07-24 15:46) [30]

Можете меня повесить на тупость, но так я и не понял, в чем разница.
Щас времени нету это дело поднимать на чистом OGL (давно это было), поэтому простой пример на GLScene, использующий те же комбайнеры:
http://slil.ru/22949959
312 kb

Это не то?


 
DeadMeat ©   (2006-07-24 15:47) [31]


> повесить за тупость


 
DeadMeat ©   (2006-07-24 15:53) [32]

Дико извиняюсь... Не то закачал.
Вот:
http://slil.ru/22949983


 
antonn ©   (2006-07-24 16:07) [33]

korvin88   (23.07.06 4:27) [23]
Нет, мне нужен именно OpenGL. Если antonn что-нибудь знает, то пусть отпишется :).

по ОГЛ ниче не знаю :)
для битмапов(есть простор для оптимизации):
procedure CopyTransparentMask(_B_in,_B_out,_B_mask:Tbitmap; _x,_y:integer);
const  MaxPixelCount = MaxInt div SizeOf(TRGBTriple);
type  PRGBArray = ^TRGBArray;
     TRGBArray = array[0..MaxPixelCount-1] of TRGBTriple;
var x, y: Integer; RowOut,RowIn,RowMask: PRGBArray;
   _r,_b,_g:integer;
begin
if (_x+_B_in.Width)>_B_out.Width then exit; if _x<0 then exit;
if (_y+_B_in.Height)>_B_out.Height then exit; if _y<0 then exit;
 _B_in.PixelFormat:=pf24bit; //!!
 _B_out.PixelFormat:=pf24bit; //!!
 _B_mask.PixelFormat:=pf24bit; //!!
 for y:=0 to _B_in.Height-1 do begin
    RowOut:= _B_out.ScanLine[y+_y];
    RowIn:= _B_in.ScanLine[y];
    RowMask:= _B_mask.ScanLine[y];
   for x:=0 to _B_in.Width-1 do
    if not((RowIn[x].rgbtRed=rc1)and(RowIn[x].rgbtGreen=gc1)and(RowIn[x].rgbtBlue=bc1))  then begin
         _r:= trunc(RowOut[x+_x].rgbtRed+((((RowIn[x].rgbtRed)-RowOut[x+_x].rgbtRed)/100)*(RowMask[x].rgbtRed*100/255)));
        if _r>255 then _r:=255 else if _r<0 then _r:=0;
         _g:= trunc(RowOut[x+_x].rgbtGreen+(((RowIn[x].rgbtGreen-RowOut[x+_x].rgbtGreen)/100)*(RowMask[x].rgbtGreen*100/255)));
        if _g>255 then _g:=255 else if _g<0 then _g:=0;
         _b:= trunc(RowOut[x+_x].rgbtBlue+(((RowIn[x].rgbtBlue-RowOut[x+_x].rgbtBlue)/100)*(RowMask[x].rgbtBlue*100/255)));
        if _b>255 then _b:=255 else if _b<0 then _b:=0;
         RowOut[x+_x].rgbtRed:=_r;
         RowOut[x+_x].rgbtGreen:=_g;
         RowOut[x+_x].rgbtBlue:=_b;
   end;
 end
end;


 
korvin88   (2006-07-24 16:34) [34]

DeadMeat
Ты прав, признаю. Комбайнеры мне помогут. Спасибо :). Действительно, в этом примере, если Tex0 - первая текстура, Tex2 - вторая, а Tex1 - битовая маска, а код комбайнера


Tex0:=Tex0;
Tex1:=Tex1;
Tex2:=Tex2;
Tex2:=Interpolate (Tex0, Tex2, Tex1);


то получается именно то, что надо (теперь хоть ясно, что с чем интерполировать :)).

Дело за малым - сделать такое самому :))). Но вот в этом мне поможет скорее не твой пример про ландшафт (там тоже комбайнеры, но принцип, я все же считаю, немного другой), а статья, которуй мне посоветовал Trimp.

Еще раз, спасибо.

P.S.
DeadMeat
Первый пример тоже рабочий (именно по нему я ответ писал), просто текстуры нужно было свои в папку кинуть :). Так даже удобнее :)).

antonn
Нет, нет. Это простой блендинг вручную. Мне нужен был аппартный, средствами OpenGL.


 
DeadMeat ©   (2006-07-24 16:36) [35]

korvin88
Собсна пжалста..


> Первый пример тоже рабочий (именно по нему я ответ писал),
>  просто текстуры нужно было свои в папку кинуть :). Так
> даже удобнее :)).

Ну в этом можно кликом загружать свои. Поэтому решил перезалить.
Там в подсказке записан формат команд. Но это так... для примера. Просто удобная обертка над комбайнером в виде "шейдера".


 
korvin88   (2006-07-25 14:13) [36]

Блииин, опять ничего не выходит :((((. Вроде разобрался по статье, что с чем интерполировать. Прикинул также по примеру DeadMeat"а, как нужно делать. Сделал. И нифига не работает - результат такой-же, какого я всегда добивался при обычном блендинге! Т.е. вторая текстура банально влияет на уже наложенную :((. Вот код:


Procedure DrawMaskedPolygon(PMask,PTex1,PTex2 : GLUint; x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4 : GLfloat);
begin
 glPushAttrib(GL_ALL_ATTRIB_BITS);
   //биндим текстуру травы (для белого цвета)
   glActiveTextureARB(GL_TEXTURE0_ARB    );
   glEnable          (GL_TEXTURE_2D      );
   glBindTexture     (GL_TEXTURE_2D,PTex1);
   glTexEnvi         (GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE        );

   //биндим маску
   glActiveTextureARB(GL_TEXTURE1_ARB    );
   glEnable          (GL_TEXTURE_2D      );
   glBindTexture     (GL_TEXTURE_2D,PMask);
   glTexEnvi         (GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE       );

   //биндим текстуру земли (для черного цвета)
   glActiveTextureARB(GL_TEXTURE2_ARB    );
   glEnable          (GL_TEXTURE_2D      );
   glBindTexture     (GL_TEXTURE_2D,PTex2);
   glTexEnvi         (GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_COMBINE_ARB    );
   glTexEnvi         (GL_TEXTURE_ENV,GL_COMBINE_RGB_ARB ,GL_INTERPOLATE_ARB);

   //устанавливаем по порядку Arg0, Arg1 и Arg2 для формулы интерполяции Arg0*Arg2+Arg1*(1-Arg2)
   //самое тонкое место... может, ошибка здесь???
   glTexEnvi (GL_TEXTURE_ENV,GL_SOURCE0_RGB_ARB ,GL_PREVIOUS_ARB);
   glTexEnvi (GL_TEXTURE_ENV,GL_OPERAND0_RGB_ARB,GL_SRC_COLOR   );

   glTexEnvi (GL_TEXTURE_ENV,GL_SOURCE1_RGB_ARB ,GL_TEXTURE     );
   glTexEnvi (GL_TEXTURE_ENV,GL_OPERAND1_RGB_ARB,GL_SRC_COLOR   );

   glTexEnvi (GL_TEXTURE_ENV,GL_SOURCE2_RGB_ARB ,GL_PREVIOUS_ARB);
   glTexEnvi (GL_TEXTURE_ENV,GL_OPERAND2_RGB_ARB,GL_SRC_COLOR   );

   //собственно, выводим сам квад
   glBegin(GL_TRIANGLE_STRIP);
     glNormal3f          (0,1,0   );
     glMultiTexCoord2fARB(GL_TEXTURE0_ARB,co,cz);
     glMultiTexCoord2fARB(GL_TEXTURE1_ARB,co,cz);
     glMultiTexCoord2fARB(GL_TEXTURE2_ARB,co,cz);
     glVertex3f          (x1,y1,z1);

     glNormal3f          (0,1,0   );
     glMultiTexCoord2fARB(GL_TEXTURE0_ARB,cz,cz);
     glMultiTexCoord2fARB(GL_TEXTURE1_ARB,cz,cz);
     glMultiTexCoord2fARB(GL_TEXTURE2_ARB,cz,cz);
     glVertex3f          (x2,y2,z2);

     glNormal3f          (0,1,0   );
     glMultiTexCoord2fARB(GL_TEXTURE0_ARB,co,co);
     glMultiTexCoord2fARB(GL_TEXTURE1_ARB,co,co);
     glMultiTexCoord2fARB(GL_TEXTURE2_ARB,co,co);
     glVertex3f          (x3,y3,z3);

     glNormal3f          (0,1,0   );
     glMultiTexCoord2fARB(GL_TEXTURE0_ARB,cz,co);
     glMultiTexCoord2fARB(GL_TEXTURE1_ARB,cz,co);
     glMultiTexCoord2fARB(GL_TEXTURE2_ARB,cz,co);
     glVertex3f          (x4,y4,z4);
   glEnd ;
 glPopAttrib ;
end ;


Может, я опять неправильно понял, как это дело использовать? Помогите, пожалуйста, разобраться.


 
Trimp ©   (2006-07-25 15:20) [37]

//самое тонкое место... может, ошибка здесь???
Здесь

glTexEnvi (GL_TEXTURE_ENV,GL_SOURCE0_RGB_ARB ,GL_PREVIOUS_ARB);
glTexEnvi (GL_TEXTURE_ENV,GL_OPERAND0_RGB_ARB,GL_SRC_COLOR   );

glTexEnvi (GL_TEXTURE_ENV,GL_SOURCE1_RGB_ARB ,GL_TEXTURE     );
glTexEnvi (GL_TEXTURE_ENV,GL_OPERAND1_RGB_ARB,GL_SRC_COLOR   );

glTexEnvi (GL_TEXTURE_ENV,GL_SOURCE2_RGB_ARB ,GL_PREVIOUS_ARB);
glTexEnvi (GL_TEXTURE_ENV,GL_OPERAND2_RGB_ARB,GL_SRC_ALPHA   );


 
Trimp ©   (2006-07-25 15:31) [38]

Замечание

Вместо

//биндим маску
  glActiveTextureARB(GL_TEXTURE1_ARB    );
  glEnable          (GL_TEXTURE_2D      );
  glBindTexture     (GL_TEXTURE_2D,PMask);
  glTexEnvi         (GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE       );

лучше

  glActiveTextureARB(GL_TEXTURE1_ARB    );
  glEnable          (GL_TEXTURE_2D      );
  glBindTexture     (GL_TEXTURE_2D, PMask);
  glTexEnvi         (GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_COMBINE_ARB    );
  glTexEnvi         (GL_TEXTURE_ENV,GL_COMBINE_RGB_ARB
,GL_REPLACE);

  glTexEnvi         (GL_TEXTURE_ENV,GL_COMBINE_ALPHA_ARB
,GL_REPLACE);

  glTexEnvi (GL_TEXTURE_ENV,GL_SOURCE0_RGB_ARB ,GL_PREVIOUS_ARB);
  glTexEnvi (GL_TEXTURE_ENV,GL_OPERAND0_RGB_ARB,GL_SRC_COLOR   );

  glTexEnvi (GL_TEXTURE_ENV,GL_SOURCE0_ALPHA_ARB ,GL_TEXTURE);
  glTexEnvi (GL_TEXTURE_ENV,GL_OPERAND0_ALPHA_ARB,GL_SRC_ALPHA   );

P.S. Ознакомься получше со статьёй.


 
korvin88   (2006-07-25 18:10) [39]

Trimp
Мда... пришлось повозиться, но оно в итоге заработало, наконец, как надо :).

All
Спасибо большое, всем, кто потратил на меня свое время :))).


 
Trimp ©   (2006-07-25 18:21) [40]

В чём ошибка то была?


 
korvin88   (2006-07-25 19:02) [41]

Trimp
Чья? Моя? В ДНК, надо полагать, раз так долго все это рожал :))). Но и ты тоже немного ошибся в последнем примере. Перепутал параметры - они должны относиться к маске, т.е. к первой текстуре, а не нулевой :). Это меня долго смущало. Плюс ко всему я никак не мог допереть, что маску легче сделать с альфой (возможно даже, без альфы - никак). Ну и баги по мелочи. Ну сейчас хоть работает :)). Если интересно, то вот правильная процедура (пока не оптимизировал - наверняка это все можно свести к более простой форме).


Procedure DrawMaskedPolygon(PMask,PTex1,PTex2 : GLUint; x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4 : GLfloat);
begin
 glPushAttrib(GL_ALL_ATTRIB_BITS);
   glActiveTextureARB(GL_TEXTURE0_ARB    );
   glEnable          (GL_TEXTURE_2D      );
   glBindTexture     (GL_TEXTURE_2D,PTex2);
   glTexEnvi         (GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE ,GL_COMBINE_ARB    );
   glTexEnvi         (GL_TEXTURE_ENV,GL_COMBINE_RGB_ARB  ,GL_REPLACE        );
   glTexEnvi         (GL_TEXTURE_ENV,GL_COMBINE_ALPHA_ARB,GL_REPLACE        );

   glActiveTextureARB(GL_TEXTURE1_ARB    );
   glEnable          (GL_TEXTURE_2D      );
   glBindTexture     (GL_TEXTURE_2D, PMask);
   glTexEnvi         (GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE ,GL_COMBINE_ARB    );
   glTexEnvi         (GL_TEXTURE_ENV,GL_COMBINE_RGB_ARB  ,GL_INTERPOLATE_ARB);
   glTexEnvi         (GL_TEXTURE_ENV,GL_COMBINE_ALPHA_ARB,GL_REPLACE        );

   glActiveTextureARB(GL_TEXTURE2_ARB    );
   glEnable          (GL_TEXTURE_2D      );
   glBindTexture     (GL_TEXTURE_2D,PTex1);
   glTexEnvi         (GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE ,GL_COMBINE_ARB    );
   glTexEnvi         (GL_TEXTURE_ENV,GL_COMBINE_RGB_ARB  ,GL_INTERPOLATE_ARB);
   glTexEnvi         (GL_TEXTURE_ENV,GL_COMBINE_ALPHA_ARB,GL_REPLACE        );

   glTexEnvi (GL_TEXTURE_ENV,GL_SOURCE0_RGB_ARB   ,GL_PREVIOUS_ARB);
   glTexEnvi (GL_TEXTURE_ENV,GL_OPERAND0_RGB_ARB  ,GL_SRC_COLOR   );

   glTexEnvi (GL_TEXTURE_ENV,GL_SOURCE1_RGB_ARB   ,GL_TEXTURE     );
   glTexEnvi (GL_TEXTURE_ENV,GL_OPERAND1_RGB_ARB  ,GL_SRC_COLOR   );
   glTexEnvi (GL_TEXTURE_ENV,GL_SOURCE1_ALPHA_ARB ,GL_TEXTURE     );
   glTexEnvi (GL_TEXTURE_ENV,GL_OPERAND1_ALPHA_ARB,GL_SRC_ALPHA   );

   glTexEnvi (GL_TEXTURE_ENV,GL_SOURCE2_RGB_ARB   ,GL_PREVIOUS_ARB);
   glTexEnvi (GL_TEXTURE_ENV,GL_OPERAND2_RGB_ARB  ,GL_SRC_ALPHA   );

   glBegin(GL_TRIANGLE_STRIP);
     glNormal3f          (0,1,0   );
     glMultiTexCoord2fARB(GL_TEXTURE0_ARB,co,cz);
     glMultiTexCoord2fARB(GL_TEXTURE1_ARB,co,cz);
     glMultiTexCoord2fARB(GL_TEXTURE2_ARB,co,cz);
     glVertex3f          (x1,y1,z1);

     glNormal3f          (0,1,0   );
     glMultiTexCoord2fARB(GL_TEXTURE0_ARB,cz,cz);
     glMultiTexCoord2fARB(GL_TEXTURE1_ARB,cz,cz);
     glMultiTexCoord2fARB(GL_TEXTURE2_ARB,cz,cz);
     glVertex3f          (x2,y2,z2);

     glNormal3f          (0,1,0   );
     glMultiTexCoord2fARB(GL_TEXTURE0_ARB,co,co);
     glMultiTexCoord2fARB(GL_TEXTURE1_ARB,co,co);
     glMultiTexCoord2fARB(GL_TEXTURE2_ARB,co,co);
     glVertex3f          (x3,y3,z3);

     glNormal3f          (0,1,0   );
     glMultiTexCoord2fARB(GL_TEXTURE0_ARB,cz,co);
     glMultiTexCoord2fARB(GL_TEXTURE1_ARB,cz,co);
     glMultiTexCoord2fARB(GL_TEXTURE2_ARB,cz,co);
     glVertex3f          (x4,y4,z4);
   glEnd ;
 glPopAttrib ;
end ;


Еще раз, спасибо! :))


 
Trimp ©   (2006-07-25 19:16) [42]

Всё понял.  


> что маску легче сделать с альфой

Про это забыл написать.

Удачи! :))


 
имя   (2007-03-14 08:11) [43]

Удалено модератором


 
имя   (2007-03-21 20:25) [44]

Удалено модератором



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

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

Наверх




Память: 0.62 MB
Время: 0.042 c
2-1217300882
apic
2008-07-29 07:08
2008.09.14
иконки


2-1217895646
Abcdef123
2008-08-05 04:20
2008.09.14
Как проверить в программе существование поля по названию?


11-1193144413
Виктор007
2007-10-23 17:00
2008.09.14
Помогите создать кнопку


2-1217707354
demon
2008-08-03 00:02
2008.09.14
API и меню


3-1205998904
denmin
2008-03-20 10:41
2008.09.14
Не постятся данные в PostgreSQL.





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