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


           

    两个图形重叠时

    image

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

    颜色混合

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

    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    如下效果

    image

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

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

    在OpenGL中使用颜色混合

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

    混合选项

    image

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

    这个选项用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;
    }

  • 相关阅读:
    何为受控组件(controlled component)
    (组件的)状态(state)和属性(props)之间有何不同
    类组件(Class component)和函数式组件(Functional component)之间有何不同
    [翻译] FSLineChart
    [翻译] DXPopover
    [翻译] LTInfiniteScrollView
    设计模式
    [翻译] LLSimpleCamera
    [翻译] VLDContextSheet
    将Model对象转换成json文本或者json二进制文件
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/1861261.html
Copyright © 2020-2023  润新知