Íàðîäíûé ó÷åáíèê ïî OpenGL
de301fb4

ïî OpenGL. Ýôôåêò òóìàíà íà OpenGL


Cool Looking Fog

Ýòîò óðîê ïðåäñòàâëÿåò Êðèñ Àëèîòòà (Chris Aliotta)...

Èòàê, Âû õîòèòå äîáàâèòü òóìàí â Âàøó ïðîãðàììó íà OpenGL? ×òî æ, â ýòîì óðîêå ÿ ïîêàæó êàê ñäåëàòü èìåííî ýòî. ß ïåðâûé ðàç ïèøó óðîê, è îòíîñèòåëüíî íåäàâíî ïîçíàêîìèëñÿ ñ ïðîãðàììèðîâàíèåì íà OpenGL/C++, òàê ÷òî ïîæàëóéñòà, åñëè âû íàéäåòå çäåñü êàêèå-íèáóäü îøèáêè, òî ïîæàëóéñòà, ñîîáùèòå ìíå è íå íàêèäûâàéòåñü âñå ñðàçó. Ýòà ïðîãðàììà îñíîâàíà íà ïðèìåðå ñåäüìîãî óðîêà.

Ïîäãîòîâêà äàííûõ:

Íà÷íåì ñ òîãî, ÷òî ïîäãîòîâèì âñå íåîáõîäèìûå ïåðåìåííûå, ñîäåðæàùèå ïàðàìåòðû çàòóìàíèâàíèÿ. Ìàññèâ fogMode áóäåò õðàíèòü òðè çíà÷åíèÿ: GL_EXP, GL_EXP2 è GL_LINEAR, - ýòî òðè òèïà òóìàíà. Ïîçæå ÿ îáúÿñíþ ðàçëè÷èÿ ìåæäó íèìè. Îáúÿâèì ïåðåìåííûå â íà÷àëå êîäà, ïîñëå ñòðîêè GLuint texture[3].  ïåðåìåííîé fogfilter áóäåò õðàíèòüñÿ êàêîé òèï òóìàíà ìû áóäåì èñïîëüçîâàòü, fogColor áóäåò ñîäåðæàòü öâåò, êîòîðûé ìû õîòèì ïðèäàòü òóìàíó. Åùå ÿ äîáàâèë äâîè÷íóþ ïåðåìåííóþ gp â íà÷àëî êîäà, ÷òîáû ìîæíî áûëî óçíàòü íàæàòà ëè êëàâèøà 'g' âî âðåìÿ âûïîëíåíèÿ ïðîãðàììû-ïðèìåðà.

bool   gp;                              // G Íàæàòà? ( Íîâîå )

GLuint filter;                          // Èñïîëüçóåìûé ôèëüòð äëÿ òåêñòóð

GLuint fogMode[]= { GL_EXP, GL_EXP2, GL_LINEAR }; // Õðàíèò òðè òèïà òóìàíà

GLuint fogfilter= 0;                    // Òèï èñïîëüçóåìîãî òóìàíà

GLfloat fogColor[4]= {0.5f, 0.5f, 0.5f, 1.0f}; // Öâåò òóìàíà

Èçìåíåíèÿ â DrawGLScene

Òåïåðü, êîãäà ìû çàäàëè ïåðåìåííûå, ïåðåäâèíåìñÿ âíèç ê ôóíêöèè InitGL. Ñòðîêà glClearColor() èçìåíåíà òàê, ÷òîáû çàïîëíèòü ýêðàí öâåòîì òóìàíà äëÿ äîñòèæåíèÿ ëó÷øåãî ýôôåêòà. Òðåáóåòñÿ íå òàê óæ ìíîãî êîäà, ÷òîáû çàäåéñòâîâàòü òóìàí. Âîîáùåì, Âàì âñå ýòî ïîêàæåòñÿ î÷åíü ïðîñòûì.



 

glClearColor(0.5f,0.5f,0.5f,1.0f);      // Áóäåì î÷èùàòü ýêðàí, çàïîëíÿÿ åãî öâåòîì òóìàíà. ( Èçìåíåíî )

glEnable(GL_FOG);                       // Âêëþ÷àåò òóìàí (GL_FOG)

glFogi(GL_FOG_MODE, fogMode[fogfilter]);// Âûáèðàåì òèï òóìàíà


glFogfv(GL_FOG_COLOR, fogColor);        // Óñòàíàâëèâàåì öâåò òóìàíà
glFogf(GL_FOG_DENSITY, 0.35f);          // Íàñêîëüêî ãóñòûì áóäåò òóìàí
glHint(GL_FOG_HINT, GL_DONT_CARE);      // Âñïîìîãàòåëüíàÿ óñòàíîâêà òóìàíà
glFogf(GL_FOG_START, 1.0f);             // Ãëóáèíà, ñ êîòîðîé íà÷èíàåòñÿ òóìàí
glFogf(GL_FOG_END, 5.0f);               // Ãëóáèíà, ãäå òóìàí çàêàí÷èâàåòñÿ.
Âîçüìåì ñíà÷àëà ïåðâûå òðè ñòðî÷êè ýòîãî êîäà. Ïåðâàÿ ñòðîêà glEnable(GL_FOG) âî ìíîãîì ãîâîðèò ñàìà çà ñåáÿ. Åå çàäà÷à - èíèöèàëèçèðîâàòü òóìàí.
 
Âòîðàÿ ñòðîêà, glFogi(GL_FOG_MODE, fogMode[fogfilter]) óñòàíàâëèâàåò ðåæèì ôèëüòðàöèè òóìàíà. Ðàíåå ìû îáúÿâèëè ìàññèâ fogMode. Îí ñîäåðæàë GL_EXP, GL_EXP2 è GL_LINEAR. Èìåííî çäåñü ýòè ïåðåìåííûå âõîäÿò â èãðó. Âîò ÷òî êàæäàÿ èç íèõ çíà÷èò:
 
  • GL_EXP - Îáû÷íûé òóìàí, çàïîëíÿþùèé âåñü ýêðàí. Âî ìíîãîì îí íàïîìèíàåò òóìàí îòäàëåííî, íî ëåãêî ñïðàâëÿåòñÿ ñî ñâîåé ðàáîòîé äàæå íà ñòàðûõ PC.

  • GL_EXP2 - Ýòî ñëåäóþùèé øàã ïîñëå GL_EXP. Çàòóìàíèò âåñü ýêðàí, çà òî ïðèäàåò áîëüøå ãëóáèíû âñåé ñöåíå.

  • GL_LINEAR - Ýòî ëó÷øèé ðåæèì ïðîðèñîâêè òóìàíà. Îáúåêòû âûõîäÿò èç òóìàíà è èñ÷åçàþò â íåì ãîðàçäî ëó÷øå.

  •  
    Òðåòüÿ, glFogfv(GL_FOG_COLOR, fogcolor) çàäàåò öâåò òóìàíà. Ðàíüøå ìû çàäàëè åãî êàê (0.5f,0.5f,0.5f,1.0f) ÷åðåç ïåðåìåííóþ fogcolor - ïîëó÷èëñÿ ïðèÿòíûé ñåðûé öâåò.
     
    Äàëüøå, ïîñìîòðèì íà ÷åòûðå ïîñëåäíèõ ñòðîêè. Ñòðîêà glFogf(GL_FOG_DENSITY, 0.35f) óñòàíàâëèâàåò, íàñêîëüêî ãóñòûì áóäåò òóìàí. Óâåëè÷üòå ÷èñëî, è òóìàí ñòàíåò áîëåå ãóñòûì, óìåíüøèòå - ìåíåå ãóñòûì.
     
    Eric Desrosiers äîáàâëÿåò íåáîëüøîå îáúÿñíåíèå glHint(GL_FOG_HINT, hintval):
     
    hintval ìîæåò áûòü: GL_DONT_CARE, GL_NICEST èëè GL_FASTEST

    • GL_DONT_CARE - ïîçâîëÿåò OpenGL âûáðàòü ôîðìóëó äëÿ ðàñ÷åòà òóìàíà (ïî âåðøèíàì èëè ïî ïèêñåëÿì).

    • GL_NICEST - Ñîçäàåò òóìàí ïî ïèêñåëÿì (õîðîøî ñìîòðèòñÿ).

    • GL_FASTEST - Âû÷èñëÿåò òóìàí ïî âåðøèíàì (áûñòðåå, íî íå òàê êðàñèâî)) .

    •  
      Ñëåäóþùàÿ ñòðîêà glFogf(GL_FOG_START, 1.0f) óñòàíàâëèâàåò íàñêîëüêî áëèçêî ê ýêðàíó íà÷èíàåòñÿ çàòóìàíèâàíèå. Âû ìîæåòå èçìåíèòü ýòî ÷èñëî íà ÷òî óãîäíî, â çàâèñèìîñòè îò òîãî, ãäå áû Âû õîòåëè, ÷òîáû íà÷àëñÿ òóìàí. Ñëåäóþùàÿ, ïîõîæàÿ, ñòðîêà glFogf(GL_FOG_END, 5.0f) ñîîáùàåò ïðîãðàììå OpenGL íàñêîëüêî ãëóáîêî â ýêðàí äîëæåí óõîäèòü òóìàí.


       
      Ñîáûòèÿ ïðè íàæàòèè êëàâèø
       
      Ñåé÷àñ, êîãäà êîä ïðîðèñîâêè óæå ãîòîâ, ìû äîáàâèì êîìàíäû äëÿ êëàâèàòóðû, ÷òîáû ïåðåêëþ÷àòüñÿ ìåæäó ðàçíûìè ñïîñîáàìè çàòóìàíèâàíèÿ. Ýòîò êîä èäåò â êîíöå ïðîãðàììû, âìåñòå ñ îáðàáîòêîé íàæàòèÿ êëàâèø.
       
      if (keys['G'] && !gp)                   // Íàæàòà ëè êëàâèøà "G"?
      {
             gp=TRUE;                         // gp óñòàíàâëèâàåì â TRUE
             fogfilter+=1;                    // Óâåëè÷èíèå fogfilter íà 1
             if (fogfilter>2)                 // fogfilter áîëüøå 2 ... ?
             {
                    fogfilter=0;              // Åñëè òàê, óñòàíîâèòü fogfilter â íîëü
             }
             glFogi (GL_FOG_MODE, fogMode[fogfilter]); // Ðåæèì òóìàíà
      }
      if (!keys['G'])                         // Êëàâèøà "G" îòïóùåíà?
      {
             gp=FALSE;                        // Åñëè äà, gp óñòàíîâèòü â FALSE
      }
       
      Âîò è âñå! Ìû çàêîí÷èëè.  Âàøèõ ïðîãðàììàõ ñ OpenGL åñòü òóìàí. ß áû äàæå ñêàçàë, ÷òî ýòî áûëî äîñòàòî÷íî áåçáîëåçíåííî. Åñëè åñòü êàêèå âîïðîñû èëè êîììåíòàðèè, ëåãêî ìîæåòå ñî ìíîé ñâÿçàòüñÿ: chris@incinerated.com. Òàê æå çàõîäèòå êî ìíå íà ñàéò: http://www.incinerated.com/ è http://www.incinerated.com/precursor.
      Ñîäåðæàíèå ðàçäåëà