美好的一天。 我试图使用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);
}
答案 0 :(得分:3)
您似乎不清楚GL_fog_coord_EXT的工作原理。
你说的是一个物体“在雾量之外”,但是OpenGL没有任何雾量概念。在任何一点上,无论是雾完全关闭,还是开启,在这种情况下,雾方程将应用雾系数,该系数取决于雾模式(在您的情况下为LINEAR)和雾坐标。
关于雾坐标。使用时
glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT);
你告诉OpenGL每次你提供一个顶点时,你还会提供通过glFogCoordfEXT
使用的雾坐标
那么,你的情况意味着什么?假设你没有在你的茶壶绘图代码中调用glFogCoordfEXT,你最终会得到你最后一次调用glFogCoordfEXT的值,它看起来像glFogCoordf(one)
。因此,在这种情况下绘制的所有东西都将完全处于雾中,这就是你所观察到的。
现在,我不确定你到底想要实现什么,所以我不知道如何帮助你解决这个问题。但是,如果目标是使用你的四边形来模仿雾,只需在绘制场景时关闭雾,并在绘制立方体时将其打开(我很确定它看起来不会像雾一样)。 / p>
答案 1 :(得分:0)
也许场景中没有灯光?
如果禁用所有光源,则所有对象将以平坦的环境颜色显示
检查一下如果完全禁用雾会发生什么。这还会发生吗?