您的位置:首页 > 运维架构

OpenGL学习笔记(9)颜色混合

2010-10-26 10:50 225 查看
       

两个图形重叠时





红色三角形在下,绿色三角形在上

颜色混合

比如玻璃,假设玻璃是绿色的,那么我们还可以看到下面的一层.即将两种颜色混合了

glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

如下效果





绿色三角形可以看到红色部分.

这里称底下的红色三角形的颜色为目标颜色(下层),绿色为源颜色(上层)

在OpenGL中使用颜色混合

调用glEnable(GL_BLEND)开始混合功能,glDisable(GL_BLEND)关闭混合功能
之后使用glBlendFunc 函数,选择混合选项

混合选项





好比画家将两种颜色混合了,但并非是透明的

这个选项用glBlendFunc函数来完成
glBlendFunc(GL_ONE, GL_ONE);

完整的示例,来自红宝石书
#include <GL/glut.h>
#include <stdlib.h>

static int leftFirst = GL_TRUE;

/*  Initialize alpha blending function.
*/
static void init(void)
{
glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
//glBlendFunc(GL_ONE, GL_ONE);
glShadeModel (GL_FLAT);
glClearColor (0.0, 0.0, 0.0, 0.0);
}

static void drawLeftTriangle(void)
{
/* draw yellow triangle on LHS of screen */

glBegin (GL_TRIANGLES);
glColor4f(1.0, 0.0, 0.0, 0.55);
glVertex3f(0.1, 0.9, 0.0);
glVertex3f(0.1, 0.1, 0.0);
glVertex3f(0.7, 0.5, 0.0);
glEnd();
}

static void drawRightTriangle(void)
{
/* draw cyan triangle on RHS of screen */

glBegin (GL_TRIANGLES);
glColor4f(0.0, 1.0, 0.0, 0.55);
glVertex3f(0.9, 0.9, 0.0);
glVertex3f(0.3, 0.5, 0.0);
glVertex3f(0.9, 0.1, 0.0);
glEnd();
}

void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);

if (leftFirst) {
drawLeftTriangle();
drawRightTriangle();
}
else {
drawRightTriangle();
drawLeftTriangle();
}

glFlush();
}

void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
gluOrtho2D (0.0, 1.0, 0.0, 1.0*(GLfloat)h/(GLfloat)w);
else
gluOrtho2D (0.0, 1.0*(GLfloat)w/(GLfloat)h, 0.0, 1.0);
}

void keyboard(unsigned char key, int x, int y)
{
switch (key) {
case 't':
case 'T':
leftFirst = !leftFirst;
glutPostRedisplay();
break;
case 27:  /*  Escape key  */
exit(0);
break;
default:
break;
}
}

/*  Main Loop
*  Open window with initial window size, title bar,
*  RGBA display mode, and handle input events.
*/
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize (200, 200);
glutCreateWindow (argv[0]);
init();
glutReshapeFunc (reshape);
glutKeyboardFunc (keyboard);
glutDisplayFunc (display);
glutMainLoop();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: