Проблема с объемным туманом в OpenGL - PullRequest
2 голосов
/ 29 ноября 2009

Добрый день. Я пытаюсь сделать объемный туман в OpenGL, используя glFogCoordfEXT. Почему туман влияет на все объекты моей сцены, даже если они не в объеме тумана? И эти объекты становятся равномерно серыми, как сам туман. Вот картинка альтернативный текст http://img248.imageshack.us/img248/9281/fogp.jpg

Код:

void CFog::init()
    {           

        glEnable(GL_FOG);                
        glFogi(GL_FOG_MODE, GL_LINEAR); 
        glFogfv(GL_FOG_COLOR, this->color); 
        glFogf(GL_FOG_START,  0.0f); 
        glFogf(GL_FOG_END,    1.0f);   
        glHint(GL_FOG_HINT, GL_NICEST); 

        glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT);
    }

void CFog::draw()
{
    glBlendFunc(GL_SRC_ALPHA, GL_SRC_ALPHA);
    glEnable(GL_BLEND);
    glPushMatrix();
    glTranslatef(this->coords[0], this->coords[1], this->coords[2]);
    if(this->angle[0] != 0.0f)
        glRotatef(this->angle[0], 1.0f, 0.0f, 0.0f);
    if(this->angle[1] != 0.0f)
        glRotatef(this->angle[1], 0.0f, 1.0f, 0.0f);
    if(this->angle[2] != 0.0f)
        glRotatef(this->angle[2], 0.0f, 0.0f, 1.0f);
    glScalef(this->size, this->size, this->size);
    GLfloat one = 1.0f;
    GLfloat zero = 0.0f;
    glColor4f(0.0, 0.0, 0.0, 0.5);
    glBegin(GL_QUADS);                                                                                                  // Back Wall
        glFogCoordfEXT( one);           glVertex3f(-2.5f,-2.5f,-15.0f);
        glFogCoordfEXT( one);           glVertex3f( 2.5f,-2.5f,-15.0f);
        glFogCoordfEXT( one);           glVertex3f( 2.5f, 2.5f,-15.0f);
        glFogCoordfEXT( one);           glVertex3f(-2.5f, 2.5f,-15.0f);
    glEnd();
    GLenum err;
    if((err = glGetError()) != GL_NO_ERROR)
        {
                char * str = (char *)glGetString(err);
        }
    glBegin(GL_QUADS);                                                                                                  // Floor
        glFogCoordfEXT( one);           glVertex3f(-2.5f,-2.5f,-15.0f);
        glFogCoordfEXT( one);           glVertex3f( 2.5f,-2.5f,-15.0f);
        glFogCoordfEXT( zero);          glVertex3f( 2.5f,-2.5f, 15.0f);
        glFogCoordfEXT( zero);          glVertex3f(-2.5f,-2.5f, 15.0f);
    glEnd();

    glBegin(GL_QUADS);                                                                                                  // Roof
        glFogCoordfEXT( one);           glVertex3f(-2.5f, 2.5f,-15.0f);
        glFogCoordfEXT( one);           glVertex3f( 2.5f, 2.5f,-15.0f);
        glFogCoordfEXT( zero);          glVertex3f( 2.5f, 2.5f, 15.0f);
        glFogCoordfEXT( zero);  glVertex3f(-2.5f, 2.5f, 15.0f);
    glEnd();

    glBegin(GL_QUADS);                                                                                                  // Right Wall
        glFogCoordfEXT( zero);  glVertex3f( 2.5f,-2.5f, 15.0f);
        glFogCoordfEXT( zero);          glVertex3f( 2.5f, 2.5f, 15.0f);
        glFogCoordfEXT( one);           glVertex3f( 2.5f, 2.5f,-15.0f);
        glFogCoordfEXT( one);           glVertex3f( 2.5f,-2.5f,-15.0f);
    glEnd();

    glBegin(GL_QUADS);                                                                                                  // Left Wall
        glFogCoordfEXT( zero);          glVertex3f(-2.5f,-2.5f, 15.0f);
        glFogCoordfEXT( zero);  glVertex3f(-2.5f, 2.5f, 15.0f);
        glFogCoordfEXT( one);   glVertex3f(-2.5f, 2.5f,-15.0f);
        glFogCoordfEXT( one);           glVertex3f(-2.5f,-2.5f,-15.0f);
    glEnd();
    glPopMatrix();
    glDisable(GL_BLEND);
    //glDisable(GL_FOG);
}

Ответы [ 2 ]

3 голосов
/ 29 ноября 2009

Вы, похоже, не совсем понимаете, как работает GL_fog_coord_EXT.

Вы говорите, что объект находится "вне объема тумана", но OpenGL не имеет никакого представления о объеме тумана. В любой момент либо туман полностью выключен, либо включен, и в этом случае уравнение тумана будет применено с коэффициентом тумана, который зависит как от режима тумана (LINEAR в вашем случае), так и от координаты тумана.

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

    glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT);

Вы говорите OpenGL, что каждый раз, когда вы будете предоставлять вершину, вы также будете указывать, какую координату тумана использовать через glFogCoordfEXT

Итак, что это значит в вашем случае? Предполагая, что вы не вызываете glFogCoordfEXT в своем коде рисования чайника, в итоге вы получите значение вашего последнего вызова glFogCoordfEXT, который выглядит как glFogCoordf(one). Так что все нарисованное в этом случае будет полностью в тумане, что вы и наблюдаете.

Теперь я не совсем уверен, чего вы пытаетесь достичь, поэтому я не знаю, как именно помочь вам решить проблему. Однако, если цель состоит в том, чтобы использовать ваши четырехугольники для имитации тумана, просто выключите туман при рисовании сцены и включайте его только при рисовании куба (хотя я уверен, что он не будет выглядеть как хороший туман).

0 голосов
/ 29 ноября 2009

Может быть, в сцене нет освещения?
Если все источники света отключены, все объекты будут отображаться в плоском окружающем цвете.
Проверьте, что произойдет, если вы вообще отключите туман.Это все еще происходит?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...