2010-09-07 51 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

相关问题