2015-10-31 60 views
0

我正在实现渲染器,其中阴影需要从前到后的渲染。我在解决如何初始化混合函数时遇到问题。Opengl前后混合问题(黑屏)

这是我的尝试。

glEnable(GL_DEPTH_TEST); 
glDepthFunc(GL_LESS); 
glEnable(GL_BLEND); 
glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_ONE); 
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 

这会导致黑屏。

The blog post说要使用GL_ONE_MINUS_DST_ALPHA,GL_ONE并初始化背景为全黑的所有半透明,这是我认为我在做的事情。该帖子引用an nvidia whitepaper,所以我也研究了这一点。我查看了那里的代码,他们似乎和我一样。然而有些东西显然是错误的,因为它不起作用。如果我不使用混合或使用其他混合功能,事情似乎可行。

编辑:

glutInit(&argc, argv); 
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA); 
glutCreateWindow("Window"); 
+1

你是否要求你的帧缓冲器有一个alpha组件,并检查你是否真的得到了它? –

+0

嘿,我没有做任何更多的初始化比我放在那里的代码。我只是直接渲染到默认帧缓冲区 – Jens

+1

您使用什么框架/工具箱来设置您的上下文和窗口?默认帧缓冲区的格式是在初始设置过程中指定的。细节高度依赖平台/工具包/框架。 –

回答

1

你需要你的GLUT初始化期间专门请求α平面如果使用混合涉及目的地阿尔法。更改呼叫:你可能认为指定GL_RGBA就足够

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_ALPHA); 

。至少我做到了,直到我刚刚查了documentation,它说:

注意GLUT_RGBA选择RGBA颜色模型,但它不要求阿尔法任何位(有时称为阿尔法缓冲器或目的地阿尔法)是分配。要请求alpha,指定GLUT_ALPHA。

+0

感谢您的回复。我正在使用glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_ALPHA);现在,但不幸的是,当我使用glBlendFunc(GL_ONE_MINUS_DST_ALPHA,GL_ONE)而不是glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)时,屏幕仍然回来。 – Jens

+0

Ops,当我尝试时,clearcolor是0,0,0,1。它正在工作。 – Jens