ïî 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 - Ýòî ëó÷øèé ðåæèì ïðîðèñîâêè òóìàíà. Îáúåêòû âûõîäÿò èç òóìàíà è èñ÷åçàþò â íåì ãîðàçäî ëó÷øå.
- GL_DONT_CARE - ïîçâîëÿåò OpenGL âûáðàòü ôîðìóëó äëÿ ðàñ÷åòà òóìàíà (ïî âåðøèíàì èëè ïî ïèêñåëÿì).
- GL_NICEST - Ñîçäàåò òóìàí ïî ïèêñåëÿì (õîðîøî ñìîòðèòñÿ).
- GL_FASTEST - Âû÷èñëÿåò òóìàí ïî âåðøèíàì (áûñòðåå, íî íå òàê êðàñèâî)) .
Òðåòüÿ, 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
Ñëåäóþùàÿ ñòðîêà 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.