18c0693f

ïî 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. Èìåííî çäåñü ýòè ïåðåìåííûå âõîäÿò â èãðó. Âîò ÷òî êàæäàÿ èç íèõ çíà÷èò: