OpenGL color4 alpha如何工作?

时间:2014-03-08 05:10:47

标签: opengl

我在glColor4f中测试alpha,但使用glColor4f(1.0, 1.0, 0, 0);的结果与使用glColor4f(1.0, 1.0, 0, 1);相同。

enter image description here

我已尝试将glClearColor(0.0, 0.0, 0.0, 0.0);更改为glClearColor(0.0, 0.0, 0.0, 1.0);,但它不会改变任何内容。

这是我的代码:

#include <GL/glut.h>

void init();
void display();

int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowPosition(0, 0);
    glutInitWindowSize(300, 300);

    glutCreateWindow("OpenGL 3D View");

    init();
    glutDisplayFunc(display);

    glutMainLoop();
    return 0;
}

void init()
{
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    glOrtho(-5, 5, -5, 5, 5, 15);
    glMatrixMode(GL_MODELVIEW);
    gluLookAt(0, 0, 10, 0, 0, 0, 0, 1, 0);
}

void display()
{
    glClear(GL_COLOR_BUFFER_BIT);

    glColor4f(1.0, 1.0, 0, 0.01);
    glutWireTeapot(3);

    glFlush();
}

我想知道透明度是如何运作的。谢谢〜

2 个答案:

答案 0 :(得分:1)

我想在glClearColor()中将alpha设置为零的结果你应该是具有透明背景的窗口吗?不,它不会发生。窗口透明度由操作系统控制。参见this回答。那么为什么glClearColor()有你想要的alpha通道清除选项呢?这在多个屏幕外帧缓冲区之间渲染时确实很有用,有时也很关键。有时,当你将一个FBO的内容blit(或混合)到另一个FBO中时你必须清除目标FBO附件alpha以及零以防止边缘出血(实际用于透明图形)和其他令人讨厌的工件。但是,在你做的情况下改变默认FBO上的那个值会没有效果。希望现在很清楚。

此外,您不能忘记,在管道中稍后使用此类FBO纹理附件(其中包含alpha信息)时,您必须使用硬件Alpha混合(由OGL API混合函数表示)。否则,alpha信息将丢失在最后的结果中。

答案 1 :(得分:1)

所以我看到的第一件事是你没有初始化你的显示器来使用混合。这是通过:

完成的
glEnable(GL_BLEND);

默认情况下,禁用GL混合。请参阅此处的说明: http://lmb.informatik.uni-freiburg.de/people/reisert/opengl/doc/glBlendFunc.html

接下来是设置混合模式。上面的链接显示了设置混合功能的例程。

另外,如果您在此处查看glutInitDisplayMode例行说明: https://www.opengl.org/resources/libraries/glut/spec3/node12.html

它显示“请注意,GLUT_RGBA选择RGBA颜色模型,但它不会请求任何alpha位(有时称为alpha缓冲区或目标alpha)。要请求alpha,请指定GLUT_ALPHA。同样适用于GLUT_LUMINANCE。“