本身我理解的是应该有一个源一个目标,但是看下面的程序运行的结果我有点不明白?
尤其是按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;
}
尤其是按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;
}
以按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),还是白色所以最终一个白色的正方形