2011-03-03 149 views
0

編輯:添加了一些錯誤檢查代碼,發現錯誤「1282」被拋出,當我做glAccum(..)OpenGL的:glAccum錯誤1282(無效操作)

EDIT2:我試過完全相同的代碼在另一臺電腦上,它完美的工作。

EDIT3:「解決方案」 ATI HD4xxx和高達卡不支持堆積緩衝了:*(

所以也沒有在64位Windows 7與HD4850的工作和最新的最新的驅動程序 它的工作(GL_ACCUM_RED_BITS = 16) 我也試過,在基於Linux的機器上真的很快,我不知道確切的規格,它也在那裏工作,所以我猜測它真的有待辦事項在我的電腦:(但我不知道什麼,所以任何提示,歡迎您。

這是原始的問題

我想使用glAccum生成一個DOF效果,但對glAccum的調用似乎沒有任何效果。我已經將問題簡化爲一個簡單的測試用例,其中在for循環中我沿着x軸翻譯了一些球體。正如您所看到的,當我嘗試將顏色緩衝區數據複製到累積緩衝區時會報告錯誤。

此外,當我檢查累積緩衝區中可用的紅色位數時,結果爲0.這意味着它未初始化?!

我設置的顯示模式是這樣的:

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_ACCUM | GLUT_DEPTH); 
glClearAccum(0.0, 0.0, 0.0, 0.0); 

所以積累緩衝器應該可用。

我的顯示方法是這樣的:

void display(void) 
{ 
    int i; 
    GLint test[1]; 
    float weigth = 1.0/(float)apertureSamples; 

    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0); 
    glEnable(GL_DEPTH_TEST); 

    HandleKeyboardInput(); 
    glLoadIdentity(); 
    UpdateCamera(); 

    glClear(GL_ACCUM_BUFFER_BIT); 
glGetIntegerv(GL_ACCUM_RED_BITS, test); 

    //No errors here but the number of red bits is 0!? 
    for(i = 0; i < apertureSamples; i++) 
    {  
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     glPushMatrix(); 
     glTranslatef(10*i, 0, 0); 
     DrawScene(); //draw a couple of spheres 
     glPopMatrix(); 
      //Still no errors here 
     glAccum(GL_ACCUM, weigth); 
      //If I check for errors here I get error 1282 
     glFlush(); 
    } 
    glAccum(GL_RETURN, 1.0); 

    glutSwapBuffers(); 
} 

我現在希望看到球的模糊線索,向右移動,但我不這樣做,而是我只看到的最後一次迭代forloop(所有球體在x軸上轉換10 * appertureSamples)。

爲了測試glAccum是否在做任何事情,我已經將weigth變量更改爲0.00001,這應該會影響到每個幀被繪製得非常「薄」(我的英語詞彙表留在這裏)。但是這似乎沒有任何影響。然後我將glAccum(GL_RETURN,1.0)改爲gl_Accum(GL_RETURN,0.0001); (但應該已經使整個輸出圖像更薄。)

我已經按照DOF和JITTER下的所有步驟從這裏:http://glprogramming.com/red/chapter10.html我找不到任何我失蹤。是否有任何人有任何東西祕訣?

(順便說一句,我在Windows 7計算機與Radeaon HD4850 GPU做這個)。

+0

該錯誤是GL_INVALID_OPERATION,如果您沒有累積緩衝區,或者您在glBegin和glEnd之間調用glAccum,則返回該錯誤。在glutInitDisplayMode或清除累積緩衝區後檢查錯誤嗎? – 2011-03-03 16:32:18

+0

嘿傑克遜教皇,我檢查了在多個位置的錯誤:glClear(GL_ACCUM_BUFFER_BIT)之後沒有錯誤, :沒有錯誤, glAccum(GL_ACCUM,weigth)後: glutInitDisplayMode後錯誤1282 我沒有在glBegin ()或glEnd()調用,所有DrawScene()都會調用glutSolidSphere(..)幾次。 – 2011-03-03 16:42:00

+0

您可以使用[Mesa](http://www.mesa3d.org/)軟件光柵器重現嗎? – genpfault 2011-03-03 17:16:10

回答

0

如果GL_ACCUM_RED_BITS是零,這意味着你沒有accumlation緩衝區,你GL實現應至少在軟件中支持它,glAccum的錯誤提示也表明不存在累積緩衝區。爲什麼您首先使用累積緩衝區?您可以使用着色器,幀緩衝區對象和浮點紋理來實現相同的效果,並且它也與現代OpenGL實現兼容。

+0

我將如何獲得累積緩衝區?我不應該做比glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_ACCUM | GLUT_DEPTH)多;對?我正在使用純粹學術上用於學校項目的積累緩衝區,對於真實世界的程序,我確實會使用浮點紋理。 – 2011-03-03 17:16:52

+0

@Roy你應該如何使用GLUT來實現它,但是你的GL實現可能不會提供一個帶緩衝區的像素緩衝區,這意味着它不支持它們。 – 2011-03-03 17:20:56

+0

當我們說話時,我更新了驅動程序,但是它是ATI/AMD HD4850,所以如果ATI驅動程序是實現的,那麼它應該存在(我猜)。 – 2011-03-03 17:46:49

0

您可能沒有累積緩衝區。但是你不需要一個。景深效果現在使用着色器完成。累積緩衝區方法需要多次渲染相同的圖片;效率不高。 「着色器深度」是一個後處理效果,它使用Z緩衝區值來選擇模糊內核的大小。我們的想法是收集當前片段周圍的值,並根據由Z值確定的模糊內核大小添加每個鄰居片段。爲了保持內部循環較小,通常將整個圖像模糊爲幾個內核大小,並將它們放入3D紋理的圖層中。然後,此3D紋理用於快速獲取所需的模糊強度。

+0

嘿datenwolf,感謝您對着色器自由度的很好的解釋我知道這種方法,不幸的是這是一個小練習中我必須使用累積緩衝區 – 2011-03-03 19:41:29

+0

當前的驅動程序只能很好地支持Te累積緩衝區如何使用幀緩衝區對象並使用添加混合函數或者在添加着色器中對渲染通道進行梳理?例如在我的系統上在驅動程序中具有累積緩衝區功能的最後一款消費類GPU是GeForce3,只有professi onal級GPU仍然具有廣泛的累積緩衝區支持。順便說一句:glClear不會錯誤,如果ACCUM_BUFFER_BITS設置,因爲位掩碼定義哪個_available_平面應該清除;如果這架飛機不存在,那麼這是一個noop。 – datenwolf 2011-03-03 19:58:45

相關問題