解决方案 »

  1.   

    是这个方面吧:
    A-Buffer (A缓存) 
    采用超级采样方式来解决锯齿问题。具体方法是:使用多次渲染场景,并使每次渲染的图象位置轻微的移动,当整个渲染过程完结后,再把所有图象叠加起来,由于每个图象的位置不同,正好可以填补图象之间的间隙。该效果支持区域景深、柔光、运动模糊等特效。由于该方式对系统要求过高,因此只限于高端图形工作站。
      

  2.   

    #include <GL/gl.h>
    #include <GL/glut.h>
    enum {CONV_NONE, 
          CONV_BOX_3X3,
          CONV_BOX_5X5,
          CONV_SOBEL_X,
          CONV_LAPLACE
    };
    typedef struct {
      GLfloat scale;
      GLfloat bias; 
      int rows;
      int cols;
      GLfloat *array;
    } Filter;Filter *curmat;
    void
    identity(Filter *mat)
    {
      int n, size;
      size = mat->rows * mat->cols;
      mat->array[0] = 1.f;
      for(n = 1; n < size; n++)
        mat->array[n] = 0.f;  mat->scale = 1.f;
      mat->bias = 0.f;
    }
    Filter *
    newfilter(int rows, int cols)
    {
      Filter *mat;  mat = (Filter *)malloc(sizeof(Filter));
      mat->rows = rows;
      mat->cols = cols;
      mat->array = (GLfloat *)malloc(rows * cols * sizeof(GLfloat));
      identity(mat);
      
      return mat;
    }
    void
    resize(Filter *mat, int rows, int cols)
    {
      if(mat->rows != rows ||
         mat->cols != cols) {
        free(mat->array);
        mat->array = (GLfloat *)realloc(mat->array, rows * cols * sizeof(GLfloat));
      }
      mat->rows = rows;
      mat->cols = cols;
    }
    void
    box(Filter *mat)
    {
      int n, count;
      GLfloat blur;  count = mat->cols * mat->rows;
      blur = 1.f/count;
      for(n = 0; n < count; n++)
         mat->array[n] = blur;  mat->scale = 1.f;
      mat->bias = 0.f;
    }void
    sobel(Filter *mat)
    {
      static GLfloat sobel[] = {-.5f, 0.f, .5f,-1.f, 0.f, 1.f,-.5f, 0.f, .5f};
      resize(mat, 3, 3); 
      memcpy(mat->array, sobel, sizeof(sobel));
      mat->scale = 2.f;
      mat->bias = 0.f;
    }void
    laplace(Filter *mat)
    {
      int n, size;
      static GLfloat laplace[] = {  0.f, -.25f,   0.f,-.25f,   1.f, -.25f,0.f, -.25f,   0.f};
      resize(mat, 3, 3);
      memcpy(mat->array, laplace, sizeof(laplace));  mat->scale = 4.f;
      mat->bias = .125f;
    }void menu(int filter)
    {
      switch(filter) {
        case CONV_NONE:
          resize(curmat, 1,1);
          identity(curmat);
          break;
        case CONV_BOX_3X3:
          resize(curmat, 3, 3);
          box(curmat);
          break;
        case CONV_BOX_5X5:
          resize(curmat, 5, 5);
          box(curmat);
          break;
        case CONV_SOBEL_X:
          sobel(curmat);
          break;
        case CONV_LAPLACE:
          laplace(curmat);
          break;
      }
      glutPostRedisplay();
    }
    int winWidth = 0;
    int winHeight = 0;void
    reshape(int wid, int ht)
    {
      glViewport(0, 0, wid, ht);
      winWidth = wid;
      winHeight = ht;
    }void key(unsigned char key, int x, int y)
    {
        if(key == '\033')
    exit(0);
    }
    GLfloat *make_texture(int maxs, int maxt)
    {
        int s, t;
        static GLfloat *texture;    texture = (GLfloat *)malloc(maxs * maxt * sizeof(GLfloat));
        for(t = 0; t < maxt; t++) {
    for(s = 0; s < maxs; s++) {
        texture[s + maxs * t] = ((s >> 4) & 0x1) ^ ((t >> 4) & 0x1);
    }
        }
        return texture;
    }enum {SPHERE = 1, CONE};void
    render(void)
    {
       static GLfloat wall_mat[] = {1.f, 1.f, 1.f, 1.f};    glClear(GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT); 
        glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, wall_mat);
        glEnable(GL_TEXTURE_2D);    glBegin(GL_QUADS);
        glNormal3f(0.f, 1.f, 0.f);
        glTexCoord2i(0, 0);
        glVertex3f(-100.f, -100.f, -320.f);
        glTexCoord2i(1, 0);
        glVertex3f( 100.f, -100.f, -320.f);
        glTexCoord2i(1, 1);
        glVertex3f( 100.f, -100.f, -520.f);
        glTexCoord2i(0, 1);
        glVertex3f(-100.f, -100.f, -520.f);
        glEnd();    glDisable(GL_TEXTURE_2D);    glBegin(GL_QUADS);
        glNormal3f(1.f, 0.f, 0.f);
        glVertex3f(-100.f, -100.f, -320.f);
        glVertex3f(-100.f, -100.f, -520.f);
        glVertex3f(-100.f,  100.f, -520.f);
        glVertex3f(-100.f,  100.f, -320.f);    glNormal3f(-1.f, 0.f, 0.f);
        glVertex3f( 100.f, -100.f, -320.f);
        glVertex3f( 100.f,  100.f, -320.f);
        glVertex3f( 100.f,  100.f, -520.f);
        glVertex3f( 100.f, -100.f, -520.f);
        glNormal3f(0.f, -1.f, 0.f);
        glVertex3f(-100.f,  100.f, -320.f);
        glVertex3f(-100.f,  100.f, -520.f);
        glVertex3f( 100.f,  100.f, -520.f);
        glVertex3f( 100.f,  100.f, -320.f);    glNormal3f(0.f, 0.f, 1.f);
        glVertex3f(-100.f, -100.f, -520.f);
        glVertex3f( 100.f, -100.f, -520.f);
        glVertex3f( 100.f,  100.f, -520.f);
        glVertex3f(-100.f,  100.f, -520.f);
        glEnd();
        glPushMatrix();
        glTranslatef(-80.f, -60.f, -420.f);
        glCallList(SPHERE);
        glPopMatrix();
        glPushMatrix();
        glTranslatef(-20.f, -80.f, -500.f);
        glCallList(CONE);
        glPopMatrix();}void
    convolve(void (*draw)(void), Filter *mat)
    {
      int i, j;
      int imax, jmax;  imax = mat->cols;
      jmax = mat->rows;
      for(j = 0; j < jmax; j++) {
          for(i = 0; i < imax; i++) {
    glViewport(-i, -j, winWidth - i, winHeight - j);
    draw();
    glAccum(GL_ACCUM, mat->array[i + j * imax]);
          }
      }
    }void redraw()
    {
        glClearAccum(curmat->bias,
     curmat->bias,
     curmat->bias,
     1.0);    glClear(GL_ACCUM_BUFFER_BIT);    convolve(render, curmat);    glViewport(0, 0, winWidth, winHeight);    glAccum(GL_RETURN, curmat->scale);    glutSwapBuffers();    if(glGetError())
           printf("Oops! I screwed up my OpenGL calls somewhere\n");
    }
    const int TEXDIM = 256;main(int argc, char *argv[])
    {
        GLfloat *tex;
        static GLfloat lightpos[] = {50.f, 50.f, -320.f, 1.f};
        static GLfloat sphere_mat[] = {1.f, .5f, 0.f, 1.f};
        static GLfloat cone_mat[] = {0.f, .5f, 1.f, 1.f};
        GLUquadricObj *sphere, *cone, *base;    glutInit(&argc, argv);
        glutInitWindowSize(512, 512);
        glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_ACCUM|GLUT_DOUBLE);
        (void)glutCreateWindow("accumulation buffer convolve");
        glutDisplayFunc(redraw);
        glutKeyboardFunc(key);
        glutReshapeFunc(reshape);    glMatrixMode(GL_PROJECTION);
        glFrustum(-100., 100., -100., 100., 320., 640.); 
        glMatrixMode(GL_MODELVIEW);   glEnable(GL_DEPTH_TEST);
        glEnable(GL_LIGHTING);
        glEnable(GL_LIGHT0);    glLightfv(GL_LIGHT0, GL_POSITION, lightpos);    glCullFace(GL_BACK);    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);    glNewList(SPHERE, GL_COMPILE);
        sphere = gluNewQuadric();
        glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, sphere_mat);
        gluSphere(sphere, 20.f, 20, 20);
        gluDeleteQuadric(sphere);
        glEndList();    glNewList(CONE, GL_COMPILE);
        cone = gluNewQuadric();
        base = gluNewQuadric();
        glRotatef(-90.f, 1.f, 0.f, 0.f);
        glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, cone_mat);
        gluDisk(base, 0., 20., 20, 1);
        gluCylinder(cone, 20., 0., 60., 20, 20);
        gluDeleteQuadric(cone);
        gluDeleteQuadric(base);
        glEndList();    glutCreateMenu(menu);
        glutAddMenuEntry("none", CONV_NONE);
        glutAddMenuEntry("box filter (3x3 blur)", CONV_BOX_3X3);
        glutAddMenuEntry("box filter (5x5 blur)", CONV_BOX_5X5);
        glutAddMenuEntry("Sobel(x direction)", CONV_SOBEL_X);
        glutAddMenuEntry("Laplace", CONV_LAPLACE);
        glutAttachMenu(GLUT_RIGHT_BUTTON);    tex = make_texture(TEXDIM, TEXDIM);
        glTexImage2D(GL_TEXTURE_2D, 0, 1, TEXDIM, TEXDIM, 0, GL_RED, GL_FLOAT, tex);
        free(tex);    curmat = newfilter(1, 1);
        identity(curmat);    glutMainLoop();
    }
      

  3.   

    上面的代码就是从opengl.org上面找到的,你可以上去找有无适合你的代码
      

  4.   

    谢谢  happy__888([顾问团]寻开心) 您是在哪里高就?