Основи на осветлување во OpenGL. Осветлување во opengl es - развој на игри за Android OS Како функционира осветлувањето

OpenGL го користи моделот на осветлување Phong, во кој бојата на точката се одредува од неколку фактори: својствата на материјалот и текстурата, големината на нормалата во таа точка и положбата на изворот на светлина и набљудувачот. За правилно пресметување на осветлувањето во точка, неопходно е да се користат единечни норми, меѓутоа, командите како glScale..() можат да ја променат должината на нормите. За да се земе предвид, се користи веќе споменатиот режим на нормализација, кој се овозможува со повикување на командата glEnable(GL_NORMALIZE).

OpenGL предвидува поставување на три параметри кои ги одредуваат општите закони за примена на моделот на осветлување. Овие параметри се пренесуваат на функцијата glLightModel() и некои нејзини модификации. За да поставите глобални параметри за осветлување, користете ги следните команди:

void glLightModel (Пиме на GLenum, парам на GLenum)

void glLightModelv (GLenum pname, const GLtype *params)

Аргументот pname одредува кој параметар на моделот на осветлување ќе се прилагоди и може да ги земе следните вредности:

GL_LIGHT_MODEL_LOCAL_VIEWER - дали гледната точка е локална или оддалечена. OpenGL пресметува спекуларни рефлексии користејќи го „средниот вектор“ h=s+v опишан претходно. Вистинските насоки s и v се различни за секое мрежно теме. Ако изворот на светлина е насочен, тогаш векторот со s-магнитуда е константен, но v сепак варира од теме до теме. Брзината на рендерирање се зголемува ако векторот v го направите константен за сите темиња. Стандардно, OpenGL користи v=(0,0,1), при што векторот е насочен кон позитивната z-оска во координатите на камерата. Во исто време, можете да го принудите графичкиот цевковод да ја пресмета вистинската вредност на векторот v за секое теме со извршување на изјавата:

GlLightModel(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);

Параметарот на параметарот мора да биде бул и ја одредува позицијата на набљудувачот. Ако е FALSE, тогаш насоката на гледање се смета за паралелна со оската z, без оглед на позицијата во координатите на погледот. Ако е ТОЧНО, тогаш набљудувачот е на почетокот на координатниот систем за преглед. Ова може да го подобри квалитетот на осветлувањето, но го отежнува пресметувањето. Стандардна вредност: FALSE.;

GL_LIGHT_MODEL_TWO_SIDE - дали двете страни на многуаголникот се правилно насликани. Параметарот на параметарот мора да биде бул и да го контролира режимот за пресметување на осветлувањето и за предните и задните страни. Ако е FALSE, тогаш осветлувањето се пресметува само за предните лица. Ако е ВИСТИНА, пресметката се врши и за задните страни. Стандардна вредност: FALSE. Секое полигонално лице на моделот има две страни. При моделирање, можете да ги земете предвид внатрешните и надворешните. Вообичаено е да се наведат овие темиња спротивно од стрелките на часовникот кога се гледаат однадвор на објектот. Повеќето објекти од жичана рамка претставуваат цврсти тела кои заградуваат одреден простор, така што концептите на надворешноста и внатрешноста се јасно дефинирани. За такви предмети, камерата може да ја набљудува само надворешната површина на секое лице (освен ако, се разбира, камерата не е внатре во објектот). Со правилно отстранување на невидливите површини, внатрешната површина на секое лице е скриена од поглед со некое поблиско лице.

OpenGL нема концепт за „внатре“ и „надвор“, може само да прави разлика помеѓу „предни лица“ и „лице без лице“. Лицето е предно лице ако неговите темиња се наведени спротивно од стрелките на часовникот, по редоследот по кој окото ги гледа. Можете да го промените овој редослед користејќи ја функцијата glFrontFace(GL_CW), која одредува дека лицето е напред само ако неговите темиња се наведени по редослед на стрелките на часовникот. За објект што затвора одреден простор, сите рабови што ги гледа окото се предни лица, а OpenGL правилно ги црта и засенува. Лицата без лица се цртаат и во OpenGL, но тие завршуваат сокриени зад поблиските лица. Може да го забрзате процесорот со оневозможување на OpenGL прикажување на лица без лица. Се користи следниов код:

glCullFace (GL_BACK);

glEnable(GL_CULL_FACE);.

Ситуацијата е различна во Грешка: Не е пронајден референтен извор, b, каде што е прикажан паралелепипед со отстрането едно лице. Како и досега, стрелките го покажуваат редоследот по кој темињата на секое лице се испраќаат до графичкиот цевковод. Три од видливите лица не се свртени. Стандардно, OpenGL не може правилно да ги засенува рабовите. За правилно да сликате лица без лица, треба да му дадете инструкции на OpenGL користејќи ја изјавата glLightModel (GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE). Кога ќе се изврши оваа команда, OpenGL ја менува насоката на нормалните вредности на сите лица без лице, така што тие се насочени кон набљудувачот, по што засенчувањето се случува правилно. Промената на вредноста GL_TRUE во GL_FALSE ја оневозможува оваа опција. Рабовите нацртани со OpenGL не даваат сенки, така што сите лица што не се лица ја добиваат истата светлина од изворот, дури и ако има друго лице меѓу нив и изворот на светлина;

GL_LIGHT_MODEL_AMBIENT - светла боја на глобална позадина. Параметарот на параметри мора да содржи четири цели броеви или реални броеви кои ја одредуваат бојата на осветлувањето на позадината дури и во отсуство на одредени извори на светлина. За секоја дадена сцена, можете да поставите глобално светло за заднина кое е независно од кој било специфичен извор. За да создадете такво осветлување, поставете ја нејзината боја користејќи ги следните команди:

GLfloat amb = (0,2, 0,3, 0,1, 1,0);

glLightModelfv(GL_LIGHT_MODEL_AMBIENT, amb);

Овој код му дава на изворот на светлина во заднина боја од (0,2, 0,3, 0,1). Стандардната вредност е (0.2, 0.2, 0.2, 0.1), така што светлото на позадината е секогаш присутно освен ако намерно не го промените. Поставувањето на изворот на заднина на вредност што не е нула гарантира дека објектите во сцената се видливи дури и ако не сте активирале никакви функции за осветлување;

GL_LIGHT_MODEL_COLOR_CONTROL одвојување на спекуларната компонента на бојата. За конвенционалните пресметки на осветлувањето, заднината, дифузните, спекуларните и емисивните компоненти се пресметуваат и едноставно се собираат заедно. Стандардно, мапирањето на текстурата се применува по осветлувањето, така што спекуларните нагласувања може да изгледаат исклучени или текстурата ќе изгледа поинаку. Следниот повик до glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL,GL_SEPARATE_SPECULAR_COLOR) OpenGL ја одвојува спекуларната пресметка на бојата од апликацијата. Осветлувањето потоа генерира две бои за секое теме: почетна боја која се состои од компонентите на нерефлектираното осветлување и втора боја која е збир на спекуларните компоненти на осветлувањето. При рендерирање на текстури, само првата боја се комбинира со боите на текстурата. По завршувањето на операцијата за текстурирање, втората боја се додава во финалната комбинација на првата и компонентите на бојата на текстурата. Објектите што се осветлени и текстурирани со спекуларно раздвојување на боите обично се повидливи и имаат позабележителни спекуларни нагласувања. За да се вратите на стандардните поставки, треба да повикате glLightModeli (GL_LIGHT_MODEL_COLOR_CONTROL, GL_SINGLE_COLOR). По ова, повторно оригиналната боја ќе се состои од сите компоненти на бојата: дифузна, дифузна, емисивна и спекуларна. Компонентите за осветлување не се додаваат по текстурата.

Осветлувањето на просторот е процес преку кој овој простор се полни со светлина и сите предмети во него стануваат видливи.
Осветлувањето на кој било предмет зависи од два фактори:

  • Првиот е материјалот од кој е направен предметот.
  • Втората е светлината со која е осветлена.

Во зависност од имплементацијата на OpenGL, може да има осум или повеќе светла на сцената. Осветлувањето е стандардно оневозможено. Можете да го овозможите нула изворот на светлина со командата:

  • glEnable(GL_LIGHT0);

Останатите се овозможени на сличен начин, каде што е наведен GL_LIGHTi наместо GL_LIGHT0. Откако изворот е овозможен, треба да ги поставите неговите параметри. Ако вашето монотоно тело е рамномерно осветлено, тогаш не можете да го видите неговото олеснување. Затоа треба да користиме извори на светлина.
Постојат три типа на извори на светлина во OpenGL:

  • насочен извор на светлина: се наоѓа на бесконечност и има посветен правец на осветлување.
  • точкаст извор на светлина: се наоѓа на одредена точка во просторот и сјае рамномерно во сите правци. Можете да го поставите ефектот на избледување на светлината со растојанието
  • рефлектор: е посебен случај на точкаст извор, но светлината од него се шири само во рамките на граничниот конус, а не во сите правци.

За да ги контролирате својствата на изворот на светлина, користете ги командите glLight*:

  • glLightf(GLenum светло, GLenum pname, GLfloat парам);
    glLightfv(GLenum светло, GLenum pname, const GLfloat *param);

Параметарот на светлината му кажува на OpenGL за кој извор на светлина да ги постави параметрите. Командата glLightf се користи за поставување скаларни параметри, а glLightfv се користи за поставување на векторските карактеристики на изворите на светлина.

Прво, да ја погледнеме функцијата што ги поставува основните поставки. Откако ќе го овозможите осветлувањето, веќе можете да го поставите осветлувањето на позадината. Стандардно, вредноста на заднинското светло е (0,2, 0,2, 0,2, 1). Креирај нов проект, копирајте ја датотеката со шаблон таму и исклучете го осветлувањето. Ќе имате потешкотии да ја разликувате сферата на екранот. Со функцијата glLightModel можете да го поставите осветлувањето на позадината. Ако го подигнете на (1,1,1,1), т.е. до максимум, тогаш не треба да ги вклучувате изворите на светлина. Едноставно нема да ги забележите нивните постапки, бидејќи ... објектот е веќе максимално осветлен. И излегува дека некако си го исклучил осветлувањето. Во основа, додајте повик на следнава функција во главно:

  • плови амбиент = (0,5, 0,5, 0,5, 1);
    ...
    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, амбиент);

Обидете се да ги промените поставките и видете го резултатот.

Материјал
Материјалот може да се расејува, рефлектира и емитува светлина. Својствата на материјалот се поставуваат со помош на функцијата

  • glMaterialfv (лице GLenum, GLenum pname, GLtype* параметри)

Првиот параметар го одредува лицето за кое се поставени својствата. Може да земе една од следниве вредности:

  • GL_BACK задно лице
    GL_FONT предно лице
    GL_FRONT_AND_BACK двете лица

Вториот параметар на функцијата glMaterialfv го одредува својствата на материјалот што треба да се постави и може да ги земе следните вредности.

  • GL_AMBIENT амбиентално светло
    GL_DIFFUSE е исто така дифузна светлина
    GL_SPECULAR рефлектирана светлина
    GL_EMISSION емитуваше светлина
    GL_SHININESS степен на рефлектирана светлина
    GL_AMBIENT_AND_DIFFUSE двете амбиентални светла

Бојата е наведена како низа од четири елементи - RGBA. Во случај на GL_SHININESS, парамите укажуваат на пловечки број, кој мора да биде во опсег од 0 до 128.
Треба само да ја измените функцијата за прикажување.

  • неважечки екран за ПОВРАЌАЊЕ ПОВИК (празен)
    {
    GLUquadricObj *quadObj;
    GLfloat front_color = (0,1,0,1);
    GLfloat back_color = (0,0,1,1);
    quadObj = gluNewQuadric();
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, front_color);
    glMaterialfv(GL_BACK, GL_DIFFUSE, back_color);
    glPushMatrix();
    glRotated(110, -1,1,0);
    gluCylinder(quadObj, 1, 0,5, 2, 10, 10);
    glPopMatrix();
    gluDeleteQuadric(quadObj);
    auxSwapBuffers();
    }

И мора да го овозможите режимот на осветлување за две лица. Стандардно е оневозможено. Додадете ја следнава линија во главната функција.

  • glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);

Насочни извори на светлина
Изворот на светлина од овој тип се наоѓа во бесконечност и светлината од него се шири во дадена насока. Идеален за создавање на еднообразно осветлување. Добар пример за насочен извор на светлина е Сонцето. За насочен извор на светлина, покрај компонентите на зрачење, можете само да ја поставите насоката.

  • GL_POSITION (0.0, 0.0, 1.0, 0.0) //(x, y, z, w) насока на насочен извор на светлина

Првите три компоненти (x, y, z) го дефинираат векторот на насоката, а w компонентата е секогаш еднаква на нула (во спротивно изворот ќе се претвори во точкаст извор).

Функции на распаѓање
Ова е функција на менување на интензитетот на осветлувањето (интензитетот на светлината не се намалува со растојанието), што се користи заедно со осветлување на место

  • GL_POSITION(0,0, 0,0, 1,0, 0,0)//положба на изворот на светлина (по дифолт изворот на светлина е насочен)
  • GL_CONSTANT_ATTENUATION 1.0 //константа k_const во функцијата за слабеење f(d)
  • GL_LINEAR_ATTENUATION 0,0 //коефициент k_linear за линеарниот член во функцијата за слабеење f(d)
  • GL_QUADRATIC_ATTENUATION 0,0 //коефициент k_квадратичен со квадратот на растојанието во функцијата за слабеење f(d)

Рефлектори
Еден тип на точка извор е рефлектор. Сите параметри се применливи за него како за точка извор, но покрај тоа, рефлекторот ви овозможува да го ограничите ширењето на светлината на конус. За овој конус, можете да го поставите коефициентот за намалување на интензитетот, во зависност од аголот помеѓу оската на конусот и зракот за ширење на светлината.

  • GL_SPOT_DIRECTION (0,0, 0,0, -1,0) //(x, y, z) - насока на рефлектор (оска на граничен конус)
  • GL_SPOT_CUTOFF 180,0 //агол помеѓу оската и страната на конусот (познато како половина од аголот на темето)
  • GL_SPOT_EXPONENT 0,0 //интензитет на распаѓање експоненцијално

Сенки
Сенките не се директно поддржани од библиотеката OpenGL, па затоа треба да се ракуваат посебно.

Без извор на светлина, сликата не е видлива. За да го иницијализирате изворот и да му овозможите на процесорот да го пресметува влијанието на изворот врз објектите, едноставно извршете ги командите: glEnable(gl_lighting); // овозможете го режимот за анализа на осветлувањето

GlEnable(gl_light0); // вклучи специфичен (нула) извор во сцената, со неговите карактеристики

За да оневозможите извор, користете ја функцијата Disable(). Стандардно, изворот на светлина се наоѓа во просторот со координати (0,0,∞). Можете да креирате извор на светлина каде било во просторот на сликата.

Библиотеката OpenGl поддржува четири типа извори на светлина:

  • позадинско осветлување (амбиентално осветлување),
  • точки извори,
  • рефлектори,
  • далечни извори на светлина (далечна светлина).
Секој извор на светлина има свој сет на карактеристики.
Карактеристиките на изворот на светлина одговараат на параметрите на моделот Phong.
За да поставите векторски параметри, користете ја функцијата glLightfv(), која го има следниов формат:

glLightfv (извор, параметар, покажувач_на_низа);

Постојат четири векторски параметри кои ја одредуваат положбата и насоката на изворните зраци и составот на бојата на неговите компоненти - позадина, дифузна и спекуларна.
За да поставите скаларни параметри во OpenGL, користете ја функцијата glLightf():

glLightf (извор, параметар, вредност);

Нека, на пример, сакате да го вклучите во сцената изворот GL_LIGHT0, кој треба да се наоѓа на точката (1.0, 2.0, 3.0). Изворната позиција е зачувана во програмата како точка во униформни координати:

GLfloat light0_pos=(1.0, 2.0, 3.0, 1.0);

Ако четвртата компонента на оваа точка е нула, тогаш точниот извор се претвора во оддалечен извор, за кој е значајна само насоката на зраците:

GLfloat light0_dir=(1.0, 2.0, 3.0, 0.0);

Следно, се одредува составот на бојата на позадината, дифузијата и спекуларните компоненти на изворот. Ако во примерот што се разгледува изворот има спекуларна компонента од бела боја, а заднината и компонентите за дифузија треба да бидат црвени, тогаш програмскиот фрагмент што го формира изворот изгледа вака:

GLfloat diffise0= (1.0, 0.0, 0.0, 1.0);

GLfloat ambient0=(1.0, 0.0, 0.0, 1.0);

GLfloat specular0=(1.0, 1.0, 1.0, 1.0);

GlEnable (GL_LIGHTING);

GlEnable (GL_LIGHT0);

GlLightfv(GL_LIGHT0, GL_POSITION, светло0_pos);

GlLightfv(GL_LIGHT0, GL_AMBIENT, ambient0);

GlLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse0);

GlLightfv(GL_LIGHT0, GL_SPECULAR, specular0);

Може да вклучите и глобално осветлување на заднината во вашата сцена, кое не е поврзано со некој поединечен извор на светлина. Ако, на пример, сакате слабо да ги означите сите објекти во сцената со бело, треба да го вклучите следниов дел од кодот во програмата:

GLfloat global_ambient=(0.1, 0.1, 0.1, 1.0);

GlLightModelfv(GL_LIGHT_MODEL_AMBIENT, global_ambient);

Во моделот на осветлување, терминот што го зема предвид растојанието до изворот има форма:

K= 1/(a+ b*d+ c*d^2)

И константни, линеарни и квадратни компоненти. Соодветните коефициенти за секој извор се поставуваат поединечно со помош на функцијата за поставување на скаларен параметар, на пример:

GlLightf(GL_LIGHT0, GL_CONSTANT_ATTENATION, a);

За да конвертирате точкаст извор во рефлектор, треба да го наведете правецот на зракот на рефлекторот (GL_SPOT_DIRECTION), индикаторот за функцијата за дистрибуција на интензитет (GL_SPOT_EXPONENT) и аголот на расејување на зракот (GL_SPOT_CUTTOF). Овие параметри се поставени со помош на функциите glLightf() и glLightfv().

Стандардните параметри за изворите на светлина се прикажани во Табела 3.

Стандардни поставки за светла

Табела 3

Име на параметарот Стандардна вредност содржина
GL_AMBIENT (0.0, 0.0, 0.0, 1.0) амбиентален RGBA интензитет на светлина
GL_DIFFUSE (1.0, 1.0, 1.0, 1.0) дифузен RGBA интензитет на светлина
GL_SPECULAR (1.0, 1.0, 1.0, 1.0) спекуларен RGBA интензитет на светлина
GL_POSITION (0.0, 0.0, 1.0, 0.0) (x, y, z, w) положба на светлината
GL_SPOT_DIRECTION (0.0, 0.0, -1.0) (x, y, z) насока на рефлектор
GL_SPOT_EXPONENT 0.0 експонент на рефлектор
GL_SPOT_CUTOFF 180.0 агол на пресек на рефлектор
GL_CONSTANT_ATTENUATION 1.0 постојан фактор на слабеење
GL_LINEAR_ATTENUATION 0.0 линеарен фактор на слабеење
GL_QUADRATIC_ATTENUATION 0.0 квадратен фактор на слабеење

За да се создадат реални слики, неопходно е да се одредат и својствата на самиот објект и својствата на околината во која се наоѓа. Првата група својства ги вклучува параметрите на материјалот од кој е направен предметот, методите за нанесување текстура на неговата површина и степенот на транспарентност на објектот. Втората група ги вклучува бројот и својствата на изворите на светлина, нивото на транспарентност на околината. Сите овие својства може да се постават со помош на соодветните команди OpenGL.

Карактеристики на материјалот

За да ги поставите параметрите на тековниот материјал, користете ги командите

празнина glМатеријал(Лице GLenum, GLenum pname, GLtype param)
празнина glMaterialv(GLenum лице, GLenum pname, GLtype *params)

Со нивна помош можете да ги одредите расфрланите, дифузните и спекуларните бои на материјалот, како и бојата, степенот на спекуларна рефлексија и интензитетот на емисијата на светлина доколку предметот треба да свети. Кој параметар ќе биде одреден со вредноста на параметарот зависи од вредноста на pname:

GL_AMBIENTПараметарот на параметри мора да содржи четири цели броеви или реални RGBA вредности на боја кои ја дефинираат дифузната боја на материјалот (бојата на материјалот во сенка).

Стандардна вредност: (0,2, 0,2, 0,2, 1,0).

GL_DIFFUSEПараметарот на параметри мора да содржи четири цели броеви или реални RGBA вредности на боја кои ја специфицираат бојата на дифузната рефлексија на материјалот.

Стандардна вредност: (0,8, 0,8, 0,8, 1,0).

GL_SPECULARПараметарот на параметри мора да содржи четири цели броеви или реални RGBA вредности на боја кои ја одредуваат спекуларната боја на материјалот.

GL_SHININESSПараметарот на параметри мора да содржи единечен цел број или реална вредност во опсег од 0 до 128, што го одредува степенот на спекуларна рефлексија на материјалот.

Стандардна вредност: 0.

GL_EMISSIONПараметарот на параметри мора да содржи четири цели броеви или реални RGBA вредности на боја кои го дефинираат интензитетот на емитирана светлина од материјалот.

Стандардна вредност: (0,0, 0,0, 0,0, 1,0).

GL_AMBIENT_AND_DIFFUSEе еквивалентно на два повици на командата glMaterial...() со pname GL_AMBIENT и GL_DIFFUSE и исти вредности на параметри.

Следи дека командата glMaterial() може да се повика само за да се постави степенот на спекуларна рефлексија на материјалот. Повеќето модели ја земаат предвид дифузната и спекуларната рефлектирана светлина; првиот ја одредува природната боја на објектот, а вториот ја одредува големината и обликот на нагласувањата на неговата површина.

Параметарот лице го одредува типот на лица за кои е наведен овој материјал и може да ги земе вредностите GL_FRONT, GL_BACK или GL_FRONT_AND_BACK.

Ако предметните материјали во сцената се разликуваат само во еден параметар, се препорачува прво да го поставите саканиот режим со повикување glEnable() со параметарот GL_COLOR_MATERIAL, а потоа да ја користите командата

празнина glColorMaterial(GLenum лице, GLenum pname)

каде параметарот лице има слично значење, а параметарот pname може да ги земе сите наведени вредности. Вредноста на материјалното својство избрано со pname за одреден објект (или теме) потоа се поставува со повикување glColor...(), избегнувајќи повици до командата glMaterial...() со поинтензивни ресурси и зголемување на ефикасноста на програмата.

Можете да додадете извор на светлина на сцената користејќи ги командите

празнина Светлина(GLenum светло, GLenum pname, GLfloat парам)
празнина Светлина(GLenum светло, GLenum pname, GLfloat *params)

Параметарот на светлината уникатно го идентификува изворот и се избира од збир на специјални симболични имиња како GL_LIGHTi, каде што мора да се наоѓам во опсег од 0 до GL_MAX_LIGHT, што не надминува осум.

Преостанатите два параметри го имаат истото значење како во командата glMaterial...(). Ајде да ја погледнеме нивната цел (прво се опишани параметрите за првата команда, а потоа за втората):

GL_SPOT_EXPONENTпараметарот на параметарот мора да содржи цел број или реален број од 0 до 128 што ја одредува дистрибуцијата на интензитетот на светлината. Овој параметар го опишува нивото на фокус на изворот на светлина.

Стандардна вредност: 0 (дифузно светло).

GL_SPOT_CUTOFFпарамата мора да содржи цел број или реален број помеѓу 0 и 90 или еднаков на 180, што го дефинира максималниот агол на ширење на светлината. Вредноста на овој параметар е половина од аголот на темето на светлосниот флукс во облик на конус создаден од изворот.

Стандардна вредност: 180 (дифузна светлина).

GL_AMBIENTПараметарот на параметри мора да содржи четири цели броеви или реални RGBA вредности на боја кои ја одредуваат бојата на осветлувањето на позадината.

Стандардна вредност: (0,0, 0,0, 0,0, 1,0).

GL_DIFFUSEПараметарот на параметри мора да содржи четири цели броеви или реални RGBA вредности на боја кои ја одредуваат бојата на дифузното осветлување.

GL_SPECULARПараметарот на параметри мора да содржи четири цели броеви или реални RGBA вредности на боја кои ја одредуваат бојата на спекуларната рефлексија.

Стандардна вредност: (1.0, 1.0, 1.0, 1.0) за LIGHT0 и (0.0, 0.0, 0.0, 1.0) за други.

GL_POSITIONпараметарот на параметри мора да содржи четири цели броеви или реални кои ја дефинираат положбата на изворот на светлина. Ако вредноста на w компонентата е 0,0, тогаш изворот се смета за бесконечно оддалечен и при пресметување на осветлувањето се зема предвид само насоката кон точката (x,y,z), во спротивно изворот се смета за лоцирана во точката (x,y,z,w).

Стандардна вредност: (0,0, 0,0, 1,0, 0,0).

GL_SPOT_DIRECTIONПараметарот на параметри мора да содржи четири цели броеви или реални броеви кои ја одредуваат насоката на светлината.

Стандардна вредност: (0,0, 0,0, -1,0, 1,0).

При промена на положбата на изворот на светлина треба да се земат предвид следните факти: ако положбата е наведена со командата glLight...() пред да се одреди ориентацијата на погледот (со командата glLookAt()), тогаш изворот ќе се смета дека е на точката на набљудување. Ако позицијата е поставена помеѓу одредување на ориентацијата и трансформациите на матрицата на погледот, тогаш таа е фиксна и не зависи од трансформациите на погледот. Во вториот случај, кога позицијата е наведена по ориентацијата и матрицата за преглед, нејзината позиција може да се смени со поставување и нова ориентација на набљудувачот и менување на матрицата за преглед.

За да користите осветлување, прво треба да го поставите соодветниот режим со повикување на командата glEnable (GL_LIGHTNING), а потоа да го овозможите саканиот извор со командата glEnable(GL_LIGHTn).

Модел на осветлување

OpenGL го користи моделот на осветлување Phong, во кој бојата на точката се одредува од неколку фактори: својствата на материјалот и текстурата, големината на нормалата во таа точка и положбата на изворот на светлина и набљудувачот. За правилно пресметување на осветлувањето во точка, неопходно е да се користат единечни нормални, но командите како glScale...() можат да ја променат должината на нормалните. За да се земе предвид, се користи веќе споменатиот режим на нормализација, кој се овозможува со повикување на командата glEnable(GL_NORMALIZE).

За да поставите глобални параметри за осветлување, користете ги командите

празнина glLightModel(Пиме на GLenum, парам на GLenum)
празнина glLightModelv(GLenum pname, const GLtype *params)

Аргументот pname одредува кој параметар на моделот на осветлување ќе се прилагоди и може да ги земе следните вредности:

GL_LIGHT_MODEL_LOCAL_VIEWERпарам мора да биде бул и ја одредува позицијата на набљудувачот. Ако е FALSE, тогаш насоката на гледање се смета за паралелна со оската -z, без оглед на позицијата во координатите на погледот. Ако е ТОЧНО, тогаш набљудувачот е на почетокот на координатниот систем за преглед. Ова може да го подобри квалитетот на осветлувањето, но го отежнува пресметувањето.

Стандардна вредност: FALSE.

GL_LIGHT_MODEL_TWO_SIDEПараметарот на параметарот мора да биде бул и да го контролира режимот за пресметување на осветлувањето и за предните и задните страни. Ако е FALSE, тогаш осветлувањето се пресметува само за предните лица. Ако е ВИСТИНА, пресметката се врши и за задните страни. Стандардна вредност: FALSE.

GL_LIGHT_MODEL_AMBIENTПараметарот на параметри мора да содржи четири цели броеви или реални броеви кои ја одредуваат бојата на осветлувањето на позадината дури и во отсуство на одредени извори на светлина.

Стандардна вредност: (0,2, 0,2, 0,2, 1,0).

Како што можете да видите, воведовме дополнителна нормална матрица, неопходна е за да се пренесат нормалните вредности на објектот од локалниот координатен систем на објектот во светскиот, ова е неопходно за да се пресмета осветлувањето во светскиот координатен систем.

Вреди да се напомене дека при користење на FFP OpenGL, осветлувањето не се пресметуваше во светскиот координатен систем, туку во координатен систем за поглед. Според мене, ова не е многу погодно, бидејќи ... Системот за координати за преглед е поврзан со камерата и погодно е да се постават изворите на осветлување во светскиот координатен систем и таму се врши целата пресметка.

Пресметка на осветлување

Пресметките на осветлувањето во ова упатство го користат моделот за засенчување Phong. Главната идеја на моделот е дека конечното осветлување на објектот се состои од три компоненти:

  • Светло во заднина (амбиентална)
  • Распрскана светлина (дифузна)
  • Спекуларна светлина

Покрај овие параметри, ќе додадеме сопствен сјај на материјалот (емисија), овој параметар ви овозможува да истакнете објект дури и ако не е осветлен од никаков извор на светлина.

Соодветно на тоа, секоја од компонентите се пресметува земајќи ги предвид параметрите на изворот на светлина и материјалот на објектот. Можете да добиете подетални информации за овој модел на осветлување во оваа статија.

Пресметките на осветлувањето може да бидат или осветлување по теме или осветлување по пиксел. Во оваа лекција ќе го разгледаме осветлувањето пиксел по пиксел; тоа ви овозможува да ги измазнете недоволните детали на полигоналните модели и попрецизно да го пресметате осветлувањето во секоја точка од објектот. Главната пресметка на осветлувањето по пиксел се случува во засенчувачот на фрагменти.

Пред да започнете со пресметување на осветлувањето, треба да пресметате и префрлите некои параметри на теме од засенувачот на теме во засенувачот на фрагменти:

  • Нормално на површината на објект на теме (нормално)
  • Насока на упадната светлина, од теме до извор на светлина (правец на светлината)
  • Прикажи ја насоката, од теме до набљудувач (правец на гледање)
  • Растојание од точкаст извор на светлина до темето (растојание)

Нормалата на површината на објектот и насоката на упадната светлина се користат за пресметување на дифузна и спекуларна светлина, меѓутоа, за да се пресмета рефлектираната светлина, треба дополнително да се знае и насоката на погледот на набљудувачот. Растојанието од темето до изворот на светлина е неопходно за да се пресмета вкупниот коефициент на слабеење. Засенчувачот на темето ќе изгледа вака:

#верзија 330 јадро #дефинирај VERT_POSITION 0 #define VERT_TEXCOORD 1 #define VERT_NORMAL 2 распоред (локација = VERT_POSITION) во позиција vec3; распоред (локација = VERT_TEXCOORD) во vec2 texcoord; распоред (локација = VERT_NORMAL) во vec3 нормално; // параметри на трансформацијауниформа структура Transform ( mat4 модел; mat4 viewProjection; mat3 normal; vec3 viewPosition; ) transform; // параметри на точка извор на светлинауниформа структура PointLight ( vec4 позиција; vec4 амбиент; vec4 дифузна; vec4 спекуларна; vec3 слабеење; ) светлина; // параметри за шејдерот на фрагментинадвор Теме ( vec2 texcoord; vec3 нормално; vec3 lightDir; vec3 viewDir; плови растојание; ) Vert; празнина главна (празнина) ( // конвертирај ги координатите на темето во светскиот координатен систем vec4 теме = transform.model * vec4(позиција, 1 .0 ); // насока од темето до изворот на светлина во светскиот координатен систем vec4 lightDir = светло.позиција - теме; // пренесе некои параметри на засенчувачот на фрагменти // помине текстура координати Vert.texcoord = texcoord; // помине нормалата во светскиот координатен систем Vert.normal = transform.normal * normal; // поминете ја насоката до изворот на светлина Vert.lightDir = vec3(lightDir) ; // ја пренесува насоката од темето до набљудувачот во светскиот координатен систем Vert.viewDir = transform.viewPosition - vec3(теме) ; // го пренесува растојанието од темето до изворот на светлина Vert.distance = должина(lightDir) ; // конвертирај ги координатите на темето во хомогени gl_Position = transform.viewПроекција * теме; )

Споделете со пријателите или заштедете за себе:

Се вчитува...