Полупрозрачност
В триизмерната графика голяма част от добрите ефекти са реализирани благодарение на полупрозрачността. Може би си спомняте за четвъртия компонент от RGBA режима за който още преди казах че се използва от OpenGL за установяване на степен на прозрачност. За да активирате обаче т.н. Alpha Blending не е достатъчно само да зададете четвъртия аргумент във функцията glColor4f. Има някои важни особености.
Най-напред трябва да активирате полупрозрачността с функцията glEnable( ) с аргумент GL_BLEND. След това трябва да определите начина по който се смесват цветовете на предния и задния обект, в което всъщност се състои полупрозрачността. Но преди да ви покажа как се прави това искам да ви обясня формулата по която се изчислява полупрозрачността в OpenGL. А ето я и нея:

( Rs*Sr+Rd*Dr, Gs*Sg+Gd*Dg, Bs*Sb+Bd*Db, As*Sa+Ad*Da )

Rs,Gs,Bs и As са RGBA стойностите на предния обект, които задавате с glColor4f( )
Rd,Gd,Bd и Ad съответно RGBA стойностите на задния обект.

Останаха Sr,Sg,Sb,Sa, както и Dr,Dg,Db,Da. Това са т.н. фактори на полупрозрачността, от които зависи как ще се смесят цветовете на двата обекта, за да се постигне полупрозрачност. Благодарение на тях можете да възпроизведете, най-различни ефекти на полупрозрачност. Първата поредица от четири аргумента се отнася за предния обект, а втората за задния обект. И сега ще питате, а откъде се определят тези фактори?( Ако не ви ясно, не се притеснявайте, след малко ще разберете за какво става въпрос.) Това се извършва с функцията:

void glBlendFunc ( GLenum sfactor, GLenum dfactor ), която приема два аргумента, от които зависи какви стойности ще получат факторите на полупрозрачност съответно за предния и задния обект. Ето ги и възможните аргументи:

GL_ZERO - цвета на обекта не се взима предвид. За стойности на фактора на полупрозрачност на който и да е от двата обекта се предават стойностите ( 0, 0, 0, 0 ). Може да се използва както за преден, така и за заден обект.

GL_ONE - използва се цвета на обекта. За стойности на фактора на полупрозрачност на който и да е от двата обекта се предават стойностите ( 1, 1, 1, 1 ). Също няма значение за кой от двата обекта определяте фактор на полупрозрачност.

GL_DST_COLOR - цвета на обекта се умножава по този на задния обект. Може да се използва единствено за предния обект, т.е. само като първи аргумент на функцията. За фактор на полупрозрачност на предния обект се предават стойностите Rd,Gd,Bd и Ad т.е. RGBA цвета на задния обект.

GL_SRC_COLOR - цвета на обекта се умножава по този на предния обект. Може да се използва единствено за задния обект, т.е. само като втори аргумент на функцията. За фактор на полупрозрачност на задния обект се предават стойностите Rs,Gs,Bs и As т.е. RGBAцвета на предния обект.

GL_ONE_MINUS_DST_COLOR - цвета на обекта се умножава с ( 1, 1, 1, 1 минус цвета на задния обект ). Може да се използва само за предния обект ( sfactor ) и реално фактора за полупрозрачност на предния обект получава стойности ( 1, 1, 1, 1 ) - ( Rd, Gd, Bd, Ad ), където последните четири както виждате представляват цвета на задния обект.

GL_ONE_MINUS_SRC_ALPHA - цвета на обекта се умножава с ( 1, 1, 1, 1 минус цвета на предния обект ). Може да се използва само за аргумент на dfactor. Съответно тук за фактор на полупрозрачност задния обект получава стойностите ( 1, 1, 1, 1 ) - ( Rs, Gs, Bs, As ).

GL_SRC_ALPHA - цвета на който и да е от двата обекта( може да гo използвате както за sfactor така и за dfactor ) се умножава с четвъртата стойност ( Alpha ) на предния обект стойност т.е. за фактори на полупрозрачност обекта получава стойностите ( As, As, As, As ).

GL_DST_ALPHA - абсолютно същото с изключение на това, че за фактори на полупрозрачност обекта получава четвъртата RGBA стойност от цвета на задния обект - ( Ad, Ad, Ad, Ad ).

GL_ONE_MINUS_DST_ALPHA - цвета на обекта се умножава с ( 1, 1, 1, 1 минус четвъртата RGBA стойност на задния обект) т.е. за фактор на полупрозрачност се получават стойностите ( 1, 1, 1, 1 ) - ( Ad, Ad, Ad, Ad ) Този аргумент може да бъде използван във функцията glBlendFunc( ) както за предния, така и за задния обект.

GL_ONE_MINUS_SRC_ALPHA - същото като по горе с изключение на това че се използва alpha от предния обект т.е. за фоктор на полупрозрачност се приемат стойностите ( 1, 1, 1, 1 ) - ( Аs, As, As, As).

Може да изглежда малко сложно, но не е. Най-често използваните фактори за полупрозрачност са GL_SRC_ALPHA за предния обект и GL_ONE_MINUS_SRC_ALPHA за задния обект. Важно е да се отбележи че ако използвате полупрозрачност трябва да изрисувате първо задния обект и след това този отпред ( за който е разрешена полупрозрачността ). Ето тук можете да видите примерния сорс код използващ полупрозрачност, който ще ви помогне да разберете напълно нещата, не преди това ви съветвам да прочетете останалата част от темата.

Antialiasing

Както знаете при изобразяване на триизмерната графика, линиите и краищата на самите обекти не са съвсем гладки и при по-добро вглеждане няма как да не забележите чупки, особено по диагоналните линии, които изглеждат силно назъбени. Начупването има своето обяснение - както знаете екрана се състои от пиксели, които представляват миниатюрни квадратчета, и както може би се досещате няма как да изобразите гладка линия с помоща на квадрати, освен ако тя не е изцяло хоризонтална или вертикална. И сега на помощ идва технологията Antialiasing. Тя е изключително проста - при изобразяването на линия се използват по-голям брой пиксели като различното е че за крайните пикселни единици се задава полупрозрачност. Така окото ни не може да разграничи ясно чупките на линията и ефекта се получава - имаме гладка, ненащърбена линия. В тази тема ще ви покажа само как да изглаждате точки ( изглеждат "по-кръгли" ), прости линии или обекти изобразени с помоща на множество линии или точки. Изглаждането на краищата на запълнени обекти е доста по-трудно и няма да бъде разгледано, а и вместо него може да бъде използвано пълноекранно изглаждане на всичко по сцената, но за него има време....

За да изгладите линиите или да направите точките по-заоблени, е нужно да подадете на функцията glEnable( ) за аргумент GL_LINE_SMOOTH или GL_POINT_SMOOTH. След това е нужно да разрешите полупрозрачност, като подадете за аргумент на същата функция константата GL_BLEND и след това да определите режим на смесване на цветовете на обектите, като подадете на функцията glBlendFunc( ) аргументите GL_SRC_ALPHA и GL_ONE_MINUS_SRC_ALPHA, съответно за фактори на полупрозрачност на предния и задния обект. И всичко е готово. Вероятно не сте очаквали да е толкова лесно.

Автор: Иван Георгиев Иванов [ Nickname: tuschko ]
e-mail: tuschko@abv.bg


Този сайт е хостван от сървър на
Headoff Gaming Intranetwork