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; }
相关文章推荐
- OpenGL学习笔记(9)颜色混合
- Direct-X学习笔记--Alpha颜色混合
- OpenGL学习笔记2:绘制和混合
- OpenGL学习笔记——颜色
- OpenGL学习笔记:混合
- 8.OpenGL学习之颜色混合
- openCV学习笔记-颜色通道的分离和混合
- openGL学习笔记四 : 关于颜色, 大小, 虚线, 多边形反转, 镂空, 使用位图
- OpenGL学习笔记:颜色
- openGL之光照2(材料、颜色追踪、光源)---openGL学习笔记(十)
- OpenGL学习笔记(三)---FreeImage颜色显示错乱的解决方法
- OpenGL学习笔记2:绘制和混合
- 【计算机视觉】EmguCV学习笔记(4)分离颜色通道以及多通道图像混合
- OpenGL学习笔记2:绘制和混合
- openGL学习笔记2(颜色)
- 《OpenGL游戏程序设计》学习笔记---第六章添加颜色、混合与光照
- 《OpenGL游戏程序设计》学习笔记---第六章添加颜色、混合与光照
- openGL之混合、抗锯齿---openGL学习笔记(十一)
- openGL之正交投影、颜色立方体---openGL学习笔记(八)
- OpenGL学习笔记(三):颜色与光照