2010-09-07 31 views
2

是否有任何快速(用於性能)的方式來檢測glsl中是否多段採樣碎片,但是在第二遍(淺)通過使用第一遍渲染後的紋理。或者opengl如何存儲關於多重採樣的信息?如何在glsl中檢測片段是否被多重採樣?

+1

你爲什麼要檢測你的GLSL片段程序?使用兩個不同的着色器會更容易,一個是多點採樣,另一個是關閉時,因此在渲染過程中不需要檢查它,也不需要測試開銷。 – tibur 2010-09-07 20:52:42

+0

用於延遲渲染中較低的內存使用量。什麼時候片段多重採樣,然後做所有采樣的光照,如果不是那麼只有一個採樣。 – kravemir 2010-09-08 14:17:33

回答

2

他們是幾個。通常的做法是檢查當前的座標(gl_FragCoord)是(0.5,0.5)。如果是,則意味着您處於多邊形的中間:僅採樣一次。

它不是,它可能是4(對於4xMSAA)旋轉方角的其中一個:你處於邊緣,而openGL檢測到只有一個樣本是不夠的。

http://www.opengl.org/pipeline/article/vol003_6/

見爲了在第二遍這個信息,你必須將其存儲在G緩衝區,雖然。

編輯:這是我剛剛完成的代碼片段。使用1024x1024 4xMSAA紋理測試GTX 470。

頂點着色器:

#version 400 core 

uniform mat4 MVP; 
noperspective centroid out vec2 posCentroid; 

layout(location = 0) in vec4 Position; 

void main(){  
    gl_Position = MVP * Position; 
    posCentroid = (gl_Position.xy/gl_Position.w)*512; // there is a factor two compared to 1024 because normalized coordinates have range [-1,1], not [0,1] 
} 

片段着色器:

#version 400 core 

out vec4 color; 
noperspective centroid in vec2 posCentroid; 

void main() 
{ 
    if (abs(fract(posCentroid.x) - 0.5) < 0.01 && abs(fract(posCentroid.y) - 0.5) < 0.01){ 
     color = vec4(1,0,0,0); 
    }else{ 
     color = vec4(0,1,0,0); 
    } 
} 

邊緣綠色,多邊形的中心是紅色的。

對於你原來的問題,我建議你這篇文章:http://www.gamasutra.com/view/feature/3591/resolve_your_resolves.php

+0

gl_FragCoord是位置[0,screen_size]。我嘗試通過此代碼檢測相對位置(vec2 a = gl_FragCoord.xy - floor(gl_FragCoord.xy); \t if(ax!= 0.5 && ay!= 0.5) \t \t gl_FragColor = vec4(1,0 ,0,1); \t其他{ \t \t gl_FragColor = vec4(0,1,0,1); \t}),但它並沒有工作 – kravemir 2010-09-09 16:07:38

+0

這是正常的。你必須使用不同的質心(gl_FragCoord不是質心)。我必須檢查一下,當我知道如何去做時,我會盡快回復你。 – Calvin1602 2010-09-09 19:57:22

+0

@Miro http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=277450所以像這樣:VS - > out centroid fragcoord; main(){fragcoord = MVP * in_Position; fragcoord.xy/= fragcoord.w;}和FS - >你做了什麼,但與fragcoord – Calvin1602 2010-09-09 20:14:06

-1

選擇像素格式時,在創建景時會激活多重採樣。之後,您無法關閉或打開。但是,當渲染到紋理時,無論Symx的設置如何,OpenGL都不會使用多重採樣。

http://www.opengl.org/wiki/Multisampling

+0

OpenGL支持對紋理進行多重採樣,有多重採樣紋理格式。 chceck最新版本:) – kravemir 2010-09-07 17:07:46

+0

哦,應該算出這是在一個單獨的擴展:)(GL_EXT_framebuffer_multisample) – Daniel 2010-09-07 19:57:59