2012-02-01 27 views
2

我只是將我的OpenGL繪圖代碼從繪圖切換到顯示,直接使用帶有渲染緩衝區的離屏FBO。當我分配正常的渲染緩衝存儲器時,屏幕外的FBO正確地位於屏幕上。但是,當我在渲染緩衝區上啓用多重採樣(通過glRenderbufferStorageMultisample)時,場景中的每種顏色看上去都變亮了(因此會給出與非多重採樣部分不同的顏色)。爲什麼OpenGL在使用FBO進行多重採樣時會減輕我的場景?

我懷疑有一些glEnable選項,我需要設置保持相同的顏色,但我似乎無法在其他地方發現任何此問題。

任何想法?

+0

您能提供問題的快照和預期的正確結果嗎? – rotoglup 2012-02-03 21:13:47

回答

3

由於樣本位置不匹配,導致缺乏正確的降採樣,我偶然發現了同樣的問題。什麼工作對我來說是:

  • 單獨的「單樣品」 FBO具有相同的附件,格式和尺寸(用紋理或渲染附接)到的blit到用於下采樣,然後繪製/ blit的這對窗口緩衝區
  • 通過使用GLSL片段着色器爲每個片段傳遞所有相應樣本,將多樣本紋理渲染到具有與輸入相同樣本數的多樣本紋理的多樣本窗口緩衝區中。這可以在啓用示例着色的情況下起作用,並且可以計算每個樣本的光照,陰影,AO等,這是延遲着色的矯正方法。
  • 我也對使用GLSL的單個樣本幀緩衝區進行了拙劣的手動降採樣,我必須使用texelFetch()分別獲取每個樣本。

事情真的很慢,多抽樣。雖然CSAA表現比MSAA更好,但我建議在性能問題或需要新擴展名的情況下(例如ARB_texture_multisample)不可用,請考慮FXAA着色器作爲後處理。

在GLSL訪問樣本:

vec4 texelDownsampleAvg(sampler2DMS sampler,ivec2 texelCoord,const int sampleCount) 
{ 
    vec4 accum = texelFetch(sampler,texelCoord,0); 
    for(int sample = 1; sample < sampleCount; ++sample) { 
     accum += texelFetch(sampler,texelCoord,sample); 
    } 
    return accum/sampleCount; 
} 

11)應的blit不同位大小的緩衝器之間被允許?

Resolved: Yes, for color buffers only. Attempting to blit 
between depth or stencil buffers of different size generates 
INVALID_OPERATION. 

13)應如何BlitFramebuffer色彩空間轉換來 規定?我們是否允許上下文鉗位狀態影響 blit?

Resolved: Blitting to a fixed point buffer always clamps, 
blitting to a floating point buffer never clamps. The context 
state is ignored. 
1

這工作對我來說是改變渲染色彩格式的解決方案。我選擇了GL_RGBA32FGL_DEPTH_COMPONENT32F(我想要最高精度),而NVIDIA驅動程序的解釋不同(我懷疑sRGB補償,但我可能是錯的)。

我發現工作的渲染緩衝器圖像格式是GL_RGBA8GL_DEPTH_COMPONENT24

+0

聲音,就好像這種格式等於您窗口的像素格式一樣,其中顏色格式轉換可能是您所述的原因。我已經使用該GLSL片段將RGB16F轉換爲RGB8,其中轉換可能是隱含的。儘管如此,我還是無法在sRGB中看到原因,因爲這必須是驅動程序優化錯誤,因爲sRGB具有專用擴展。 – Sam 2012-02-08 17:04:02

+0

那就是那時我不理解的部分。您的解決方案比我需要的更普遍地解決了這個問題,但這是更正確的答案。 – 2012-02-08 17:07:26

+0

我不認爲我的回答是正確的,只要我自己不知道確切原因。使用GLSL進行下采樣是一種相當低效的解決方法,而不是我認爲是「最先進的」技術。 – Sam 2012-02-08 17:09:08

相關問題