2015-06-08 73 views
3

我有兩個2D紋理。第一個是MSAA紋理,使用GL_TEXTURE_2D_MULTISAMPLE的目標。第二個非MSAA紋理使用GL_TEXTURE_2D的目標。線性過濾可以用於MSAA紋理到非MSAA紋理的FBO blit?

根據OpenGL的spec on ARB_texture_multisample,當繪製MSAA紋理時,只有GL_NEAREST是有效的過濾選項。

在這種情況下,這兩種紋理的通過它們的單獨的幀緩衝器的對象附加到GL_COLOR_ATTACHMENT0。他們的決議也是相同的大小(據我所知,這是必要的,當一個MSAA非MSAA)。因此,考慮到目前的限制,如果我將MSAA持有的FBO閃爍到非MSAA持有的FBO,是否仍然需要使用GL_NEAREST作爲過濾選項,或者是GL_LINEAR有效,因爲兩個紋理都已經呈現至?

回答

5

的過濾選項纔開始發揮作用,當你從紋理樣品。他們不起任何作用,而你渲染質感。

當從多重採樣紋理採樣,GL_NEAREST確實是唯一支持的過濾選項。您還需要在GLSL代碼中使用特殊採樣器類型(sampler2DMS)以及相應的採樣指令。

我居然找不到規範說,過濾器設置爲GL_LINEAR的多重採樣紋理是錯誤的東西。但是根本不使用過濾器。從OpenGL的4.5規範(強調):

當多重採樣紋理在着色器訪問時,訪問需要說明抓取哪些紋理像素整數中的一個矢量和對應於在部分14.3中描述的樣本數的整數.1確定紋素中的哪個樣本要讀取。沒有標準的採樣指令被允許在多重採樣紋理的目標,和沒有濾波由所述提取進行

對於glBlitFramebuffer()多重採樣和非多重採樣紋理之間的blitting,所述濾波器參數可以是GL_LINEARGL_NEAREST,但在這種情況下被忽略。從4.5規格:

如果讀取幀緩衝器被多重採樣(其SAMPLE_BUFFERS的有效值是其中之一)和拉伸幀緩衝器不是(其SAMPLE_BUFFERS的值爲零),對應於每個像素位置處的所述樣品源代碼在寫入目標之前會被轉換爲單個樣本。 過濾器被忽略

這是有意義的,因爲在這種情況下,源和目的矩形需要具有相同的尺寸的限制:

如果讀取或繪製幀緩衝區是多采樣,將產生一個INVALID_OPERATION錯誤,並且提供給BlitFramebufferare的源矩形和目標矩形的尺寸不相同。

由於當圖像被拉伸的過濾器僅施加,它不會在這種情況下重要。

+0

我認爲,因爲你可以採樣多重採樣紋理的唯一方法是使用'texelFetch(...)',這或多或少地暗示大多數採樣器狀態是無意義的(例如,換行模式,濾波器,LOD偏差)。就像你說的那樣,根據規範,這不是一個錯誤。設置這些狀態,但是如果您必須使用過濾器來描述行爲,那麼點/最近將是唯一的候選者。 –

+1

@ AndonM.Coleman是的,我認爲這正是第一個規範引用描述的內容,其中我突出顯示了「不執行過濾」。 –

+0

是的,我只是想指出你可以設置這些採樣器狀態,他們只是不做任何事情:p Sampler對象將這些狀態從紋理對象狀態中分離出來,並且很可能會使這個問題不成問題。但由於GL的傳統設計,多重採樣紋理對象具有與它們相關的採樣器狀態,因此它們不會執行任何操作(因爲它們未被採樣)。 –