2015-10-31 57 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