我在glColor4f中测试alpha,但使用glColor4f(1.0, 1.0, 0, 0);
的结果与使用glColor4f(1.0, 1.0, 0, 1);
相同。
我已尝试将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();
}
我想知道透明度是如何运作的。谢谢〜
答案 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。“