美好的一天。
我正在尝试使用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);
}

最佳答案

您似乎还不清楚GL_fog_coord_EXT的工作方式。

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

关于雾坐标。使用时

    glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT);

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

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

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

10-08 08:33