本身我理解的是应该有一个源一个目标,但是看下面的程序运行的结果我有点不明白?
尤其是按x键的时候怎么还出现第一个画的正方形,是白颜色的,这证明第一个画的正方形被作为源了。我就是不明白他的源和目标都是什么?
有明白的回答下问题,并以下面代码为例子,说一下按每个键的时候的源和目标。
#include <GL/glut.h>
#include <GL/glext.h>
#include <stdlib.h>void init(void)
{
   glClearColor(1.0, 1.0, 0.0, 0.0);   glBlendFunc(GL_ONE, GL_ZERO);
   glEnable(GL_BLEND);
}void display(void)
{
   glClear(GL_COLOR_BUFFER_BIT);   glColor3f(0.0, 0.0, 1.0);
   glRectf(-0.75, -0.75, 0.25,0.25);
   
   glColor3f(0.75, 0.0, 0.0);
   glRectf(0.75, 0.75, -0.25, -0.25);   glFlush();
}void reshape(int w, int h)
{
   GLdouble aspect = (GLdouble) w / h;   glViewport(0, 0, (GLsizei) w, (GLsizei) h);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   if (aspect < 1.0)
   {
     aspect = 1.0 / aspect;
     glOrtho(-aspect, aspect, -1.0, 1.0, -1.0, 1.0);
   }
   else
   {
     glOrtho(-1.0, 1.0, -aspect, aspect, -1.0, 1.0);
   }
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
}void keyboard(unsigned char key, int x, int y)
{
    PFNGLBLENDEQUATIONPROC glBlendEquation = (PFNGLBLENDEQUATIONPROC)wglGetProcAddress("glBlendEquation");    switch (key)
    {
        case 'a':
        case 'A':
            glBlendEquation(GL_FUNC_ADD);
            break;
        case 's':
        case 'S':
            glBlendEquation(GL_FUNC_SUBTRACT);
            break;
        case 'r':
        case 'R':
            glBlendEquation(GL_FUNC_REVERSE_SUBTRACT);
            break;
        case 'm':
        case 'M':
            glBlendEquation(GL_MIN);
            break;
        case 'x':
        case 'X':
            glBlendEquation(GL_MAX);
            break;
        case 27:
           exit(0);
   }
   glutPostRedisplay();
}
int main(int argc, char** argv)
{
   glutInit(&argc, argv);
   glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
   glutInitWindowSize(256,256);
   glutInitWindowPosition(100, 100);
   glutCreateWindow("blend");
   init();
   glutReshapeFunc(reshape);
   glutKeyboardFunc(keyboard);
   glutDisplayFunc(display);
   glutMainLoop();
   return 0;
}

解决方案 »

  1.   

    目标就是已经画到缓冲区中了的图象,源就是后来要画的
    以按X为例子讲一下吧
    glClear(GL_COLOR_BUFFER_BIT);使目标变成了黄色(1.0, 1.0, 0.0, 0.0);
    glColor3f(0.0, 0.0, 1.0);
       glRectf(-0.75, -0.75, 0.25,0.25);
    两个取最大颜色值,(1.0, 1.0, 0.0, 0.0)和(0.0, 0.0, 1.0)比,color就是(1.0,1.0,1.0),所以左下那个变成了白色
    =============
    glColor3f(0.75, 0.0, 0.0);
       glRectf(0.75, 0.75, -0.25, -0.25);
    两个取最大颜色值,,(1.0, 1.0, 0.0, 0.0)和(0.75, 0.0, 0.0)比,color就是(1.0,1.0,0.0),注意这里左边的比右边都大,实际上得到的就是原来的颜色,所以右边那个没画出来对了,上面那个没画出来说的是没有和左边那个重叠的,重叠的部分就是(1.0,1.0,1.0)和(0.75, 0.0, 0.0)比,还是(1.0,1.0,1.0),还是白色所以最终一个白色的正方形