OpenGL中的体积雾问题

Posted

技术标签:

【中文标题】OpenGL中的体积雾问题【英文标题】:Problem with a volumetric fog in OpenGL 【发布时间】:2009-11-29 13:13:22 【问题描述】:

美好的一天。 我正在尝试使用 glFogCoordfEXT 在 OpenGL 中制作体积雾。 为什么雾会影响我场景的所有对象,即使它们不在雾的体积中?这些物体变得像雾一样均匀地变灰。这是一张照片 alt text 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);

【问题讨论】:

【参考方案1】:

您似乎不清楚 GL_fog_coord_EXT 的工作原理。

您是说一个对象“在雾体积之外”,但 OpenGL 没有任何雾体积的概念。在任何时候,雾要么完全关闭,要么打开,在这种情况下,雾方程将应用一个取决于雾模式(在您的情况下为线性)和雾坐标的雾系数。

关于雾坐标。使用时

    glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT);

您是在告诉 OpenGL,每次您提供顶点时,您还将通过 glFogCoordfEXT 提供要使用的雾坐标

那么,在你的情况下是什么意思?假设你没有在你的茶壶绘图代码中调用 glFogCoordfEXT,你最终会得到你最后一次调用 glFogCoordfEXT 的值,它看起来像一个glFogCoordf(one)。因此,在这种情况下绘制的所有内容都将完全处于迷雾之中,这就是您所观察到的。

现在,我不确定您到底想要实现什么,所以我不知道如何帮助您解决问题。但是,如果目标是使用四边形来模拟雾,则只需在绘制场景时关闭雾,并仅在绘制立方体时将其打开(但我很确定它看起来不会像漂亮的雾)。

【讨论】:

谢谢你,巴巴尔!!这个:“你最终会得到你最后一次调用glFogCoordfEXT的值,它看起来像一个glFogCoordf(one)。”帮助!我刚改了一个绘图顺序,一切都好了:))【参考方案2】:

也许场景中没有灯光? 如果禁用所有光源,所有对象都将以平坦的环境颜色显示。 检查如果完全禁用雾会发生什么。这种情况还会发生吗?

【讨论】:

不,有光照,如果我在场景渲染函数中注释雾绘制和初始化,一切都很好

以上是关于OpenGL中的体积雾问题的主要内容,如果未能解决你的问题,请参考以下文章

当我移动或旋转相机时,OpenGL 雾效果会发生变化

opengl雾开启

基于Qt的OpenGL可编程管线学习(19)- 雾

使用 OpenGL 函数的非常基本的体积渲染(用于教学目的)[关闭]

✠OpenGL-14-其他技术

OpenGL 雾不出现