/* display() draws a triangle at an angle. */ void display(void) { glClear(GL_COLOR_BUFFER_BIT); glColor3f (1.0f, 0.75f, 0.0f); glBegin (GL_TRIANGLES); glFogCoordfEXT (f1); glVertex3f (2.0f, -2.0f, 0.0f); glFogCoordfEXT (f2); glVertex3f (-2.0f, 0.0f, -5.0f); glFogCoordfEXT (f3); glVertex3f (0.0f, 2.0f, -10.0f); glEnd(); glutSwapBuffers(); }
void GLWidget::VolumeFog() { glLoadIdentity(); setRotate(); glEnable(GL_FOG); glBegin(GL_QUADS); //后墙 glFogCoordfEXT(0.0f); glVertex3f(-2.5f,-2.5f,-6.0f); glFogCoordfEXT(0.0f); glVertex3f( 2.5f,-2.5f,-6.0f); glFogCoordfEXT(0.0f); glVertex3f( 2.5f, 2.5f,-6.0f); glFogCoordfEXT(0.0f); glVertex3f(-2.5f, 2.5f,-6.0f); glEnd(); glBegin(GL_QUADS); // 地面 glFogCoordfEXT(0.0f); glVertex3f(-2.5f,-2.5f,-6.0f); glFogCoordfEXT(0.0f); glVertex3f( 2.5f,-2.5f,-6.0f); glFogCoordfEXT(1.0f); glVertex3f( 2.5f,-2.5f, 6.0f); glFogCoordfEXT(1.0f); glVertex3f(-2.5f,-2.5f, 6.0f); glEnd(); glBegin(GL_QUADS); // 天花板 glFogCoordfEXT(0.0f); glVertex3f(-2.5f, 2.5f,-6.0f); glFogCoordfEXT(0.0f); glVertex3f( 2.5f, 2.5f,-6.0f); glFogCoordfEXT(1.0f); glVertex3f( 2.5f, 2.5f, 6.0f); glFogCoordfEXT(1.0f); glVertex3f(-2.5f, 2.5f, 6.0f); glEnd(); glBegin(GL_QUADS); // 右墙 glFogCoordfEXT(1.0f); glVertex3f( 2.5f,-2.5f, 6.0f); glFogCoordfEXT(1.0f); glVertex3f( 2.5f, 2.5f, 6.0f); glFogCoordfEXT(0.0f); glVertex3f( 2.5f, 2.5f,-6.0f); glFogCoordfEXT(0.0f); glVertex3f( 2.5f,-2.5f,-6.0f); glEnd(); glBegin(GL_QUADS); // 左墙 glFogCoordfEXT(1.0f); glVertex3f(-2.5f,-2.5f, 6.0f); glFogCoordfEXT(1.0f); glVertex3f(-2.5f, 2.5f, 6.0f); glFogCoordfEXT(0.0f); glVertex3f(-2.5f, 2.5f,-6.0f); glFogCoordfEXT(0.0f); glVertex3f(-2.5f,-2.5f,-6.0f); glEnd(); glBegin(GL_QUADS); //前墙 glFogCoordfEXT(1.0f); glVertex3f(-2.5f,-2.5f, 6.0f); glFogCoordfEXT(1.0f); glVertex3f( 2.5f,-2.5f, 6.0f); glFogCoordfEXT(1.0f); glVertex3f( 2.5f, 2.5f, 6.0f); glFogCoordfEXT(1.0f); glVertex3f(-2.5f, 2.5f, 6.0f); glEnd(); glDisable(GL_FOG); }
static void glFogCoordf_ext (GLfloat f) { if (fogCoord) glFogCoordfEXT(f); }
int GLDriver::drawFog(GeometryList* l) { int count = 0; for(int j = 0; j < l->faceCount; ++j) { int i = l->faces[j]; //qmap->pMapShader[qmap->pFace[i].texture].pShader; //if(qmap->pFace[i].effect != NULL) //if(shader->getSurfaceParam() & Fog) { if(qmap->pFace[i].effect != NULL) { Q3Shader* shader = qmap->pFace[i].effect->shader; if(!(shader->getSurfaceParam() & Fog)) continue; float x1, x2, y1, y2, z1, z2; Q3Brush* brush = qmap->pFace[i].effect->brush; if(brush == NULL) continue; for(int m = brush->brushSideIndex; m < brush->brushSideIndex + brush->numBrushSides; ++m) { Q3BrushSide* brushSide = &qmap->pBrushSide[m]; Q3Plane* plane = &qmap->pPlane[brushSide->planeIndex]; for(int n = brush->brushSideIndex; n < brush->brushSideIndex + brush->numBrushSides; ++n) { Q3BrushSide* otherBrushSide = &qmap->pBrushSide[n]; if(otherBrushSide != brushSide) { Q3Plane* otherPlane = &qmap->pPlane[otherBrushSide->planeIndex]; if(otherPlane->normal.isOpposite(plane->normal)) { if(plane->normal.x > 0) { x1 = plane->distance; x2 = otherPlane->distance; } else if(plane->normal.x < 0) { x2 = plane->distance; x1 = otherPlane->distance; } else if(plane->normal.y > 0) { y1 = plane->distance; y2 = otherPlane->distance; } else if(plane->normal.y < 0) { y2 = plane->distance; y1 = otherPlane->distance; } else if(plane->normal.z > 0) { z1 = plane->distance; z2 = otherPlane->distance; } else if(plane->normal.z < 0) { z2 = plane->distance; z1 = otherPlane->distance; } } } } } glDisable(GL_BLEND); glEnable(GL_ALPHA_TEST); glDepthFunc (GL_LEQUAL); // The Type Of Depth Testing glEnable (GL_DEPTH_TEST); // Enable Depth Testing glShadeModel (GL_SMOOTH); // Select Smooth Shading glHint (GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); float fogColor[4] = {shader->fogParms.r, shader->fogParms.g, shader->fogParms.b, 0.5}; glEnable(GL_FOG); // Enable Fog glFogi(GL_FOG_MODE, GL_LINEAR); // Fog Fade Is Linear glFogfv(GL_FOG_COLOR, fogColor); // Set The Fog Color glFogf(GL_FOG_START, 0.2f); // Set The Fog Start (Least Dense) glFogf(GL_FOG_END, 1.0f); // Set The Fog End (Most Dense) glHint(GL_FOG_HINT, GL_NICEST); // Per-Pixel Fog Calculation glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT); // Set Fog Based On Vertice Coordinates // Now build a list of points std::vector<Vec3> points; points.push_back(Vec3(x1, y1, z1)); points.push_back(Vec3(x2, y1, z1)); points.push_back(Vec3(x2, y2, z1)); points.push_back(Vec3(x1, y2, z1)); points.push_back(Vec3(x1, y2, z2)); points.push_back(Vec3(x2, y2, z2)); points.push_back(Vec3(x2, y1, z2)); points.push_back(Vec3(x1, y1, z2)); glDisable(GL_TEXTURE_2D); /*glPointSize(20); glBegin(GL_POINTS); for(int q = 0; q < points.size(); ++q) glVertex3f(points[q].x, points[q].y, points[q].z); glEnd(); continue;*/ glBegin(GL_QUADS); // Back Wall glFogCoordfEXT( 1.0f); glVertex3f(x1,y1,z1); glFogCoordfEXT( 1.3f); glVertex3f(x2,y1,z1); glFogCoordfEXT( 0.2f); glVertex3f( x2, y2,z1); glFogCoordfEXT( 0.3f); glVertex3f(x1, y2,z1); glEnd(); glBegin(GL_QUADS); // Floor glFogCoordfEXT( 1.0f); glVertex3f(x1,y1,z1); glFogCoordfEXT( 1.0f); glVertex3f( x2,y1,z1); glFogCoordfEXT( 1.2f); glVertex3f( x2,y1, z2); glFogCoordfEXT( 1.2f); glVertex3f(x1,y1, z2); glEnd(); glBegin(GL_QUADS); // Roof glFogCoordfEXT( 1.0f); glVertex3f(x1, y2,z1); glFogCoordfEXT( 1.4f); glVertex3f( x2, y2,z1); glFogCoordfEXT( 1.0f); glVertex3f( x2, y2, z2); glFogCoordfEXT( 1.2f); glVertex3f(x1, y2, z2); glEnd(); glBegin(GL_QUADS); // Right Wall glFogCoordfEXT( 0.2f); glVertex3f( x2,y1, z2); glFogCoordfEXT( 1.0f); glVertex3f( x2, y2, z2); glFogCoordfEXT( 1.8f); glVertex3f( x2, y2,z1); glFogCoordfEXT( 1.6f); glVertex3f( x2,y1,z1); glEnd(); glBegin(GL_QUADS); // Left Wall glFogCoordfEXT( 1.0f); glVertex3f(x1,y1, z2); glFogCoordfEXT( 1.0f); glVertex3f(x1, y2, z2); glFogCoordfEXT( 1.4f); glVertex3f(x1, y2,z1); glFogCoordfEXT( .3f); glVertex3f(x1,y1,z1); glEnd(); } } } glDisable(GL_FOG); return 0; }