OpenGL Alpha 通道无效

OpenGL Alpha Channel not affective

尝试在 openGL 中制作随时间淡出的对象。

我通过降低我用来绘制对象的颜色的 Alpha 值来实现这一点。但是这个好像对物体没有任何影响,还是画成实心的。

我已将代码简化为简单地绘制三个矩形。每个矩形都使用相同的颜色但不同的 alpha 值绘制。

#include <GLUT/glut.h>
#include <stdlib.h>


void display(void)
{
    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

    // Set the color to red, with alpha at 100%
    float   f1[] = {1.0, 0, 0, 1.0};
    glColor4fv(f1);
    glRecti(10, 10, 110, 110);

    // Set the color to red, with alpha at 50%
    float   f2[] = {1.0, 0, 0, 0.5};
    glColor4fv(f2);
    glRecti(120, 10, 220, 110);

    // Set the color to red, with alpha at 20%
    float   f3[] = {1.0, 0, 0, 0.2};
    glColor4fv(f3);
    glRecti(230, 10, 330, 110);

    glFlush();
}

void reshape(int w, int h)
{
    glViewport(0, 0, w, h);␣
    glFrustum(-1.0, 1.0, -1.0, 1.0, 1.5, 5000.0);
    gluLookAt(0, 0, 500, 0, 0, 0, 0, 100, 0);
}

void keyboard(unsigned char key, int x, int y)
{
   switch (key) {
      case 27:
         exit(0);
         break;
   }
}

int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_ALPHA);

    glutInitWindowPosition(100, 100);
    glutInitWindowSize(1200, 1200);
    int id = glutCreateWindow(argv[0]);

    // Set up call back
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutKeyboardFunc(keyboard);

    glutMainLoop();

    glutDestroyWindow(id);
}

显示的代码都在display()中。我已经包含了我使用的所有其他函数 openGL 函数,因为我可能没有正确设置某些东西。

您需要启用混合并设置适当的混合函数(参见 Blending). To run an OpenGL instruction, you need an OpenGL Context。上下文是在使用 glutCreateWindow 创建 OpenGL window 时创建的。因此您必须添加glutCreateWindow.

后的说明
int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_ALPHA);

    glutInitWindowPosition(100, 100);
    glutInitWindowSize(1200, 1200);
    int id = glutCreateWindow(argv[0]);


    //
    // After the window has been created set the window
    // To enable the alpha part of the color.
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glEnable(GL_BLEND);
    // DONE    



    // Set up call back
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutKeyboardFunc(keyboard);

    glutMainLoop();

    glutDestroyWindow(id);
}