Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 如果片段是多采样的,如何在glsl中检测?_Opengl_Glsl_Multisampling - Fatal编程技术网

Opengl 如果片段是多采样的,如何在glsl中检测?

Opengl 如果片段是多采样的,如何在glsl中检测?,opengl,glsl,multisampling,Opengl,Glsl,Multisampling,是否有任何快速(为了性能)的方法可以在glsl中检测片段是否已进行多采样,但在第二(光)遍中使用第一遍渲染的纹理。或者opengl是如何存储有关多重采样的信息的?在选择像素格式时,多重采样在contex创建时被激活。之后,你不能关闭或打开它。但是,当渲染到纹理时,无论上下文的设置是什么,OpenGL都不会使用多重采样 它们是几个。通常检查电流的坐标(gl_FragCoord)是否为(0.5,0.5)。如果是,那就意味着你在多边形的中间:它只被采样一次。 它不是,它可能是4个(对于4xMSAA)旋

是否有任何快速(为了性能)的方法可以在glsl中检测片段是否已进行多采样,但在第二(光)遍中使用第一遍渲染的纹理。或者opengl是如何存储有关多重采样的信息的?

在选择像素格式时,多重采样在contex创建时被激活。之后,你不能关闭或打开它。但是,当渲染到纹理时,无论上下文的设置是什么,OpenGL都不会使用多重采样


它们是几个。通常检查电流的坐标(gl_FragCoord)是否为(0.5,0.5)。如果是,那就意味着你在多边形的中间:它只被采样一次。 它不是,它可能是4个(对于4xMSAA)旋转方角之一:你在一条边上,openGL检测到仅仅一个样本是不够的

另见

但是,为了在第二次传递中获得此信息,您必须将其存储在g缓冲区中

编辑:这是我刚刚完成的代码片段。在gtx 470上测试,纹理为1024x1024xMSAA

顶点着色器:

    #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);
    }
}
片段着色器:

    #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);
    }
}
#版本400核心
输出vec4颜色;
vec2中的无透视质心posCentroid;
void main()
{
if(abs(fract(posCentroid.x)-0.5)<0.01和abs(fract(posCentroid.y)-0.5)<0.01){
颜色=vec4(1,0,0,0);
}否则{
颜色=vec4(0,1,0,0);
}
}
边是绿色的,多边形的中心是红色的


对于您最初的问题,我建议您阅读本文:

OpenGL支持对纹理进行多采样,有多采样纹理格式。chceck的最新版本:)哦,应该在一个单独的扩展中找到:)(GL_EXT_framebuffer_multisample)为什么要在GLSL fragment程序中检测它?使用两个不同的着色器会更容易,一个在启用多重采样时,另一个在禁用多重采样时,因此在渲染期间无需检查,也无需测试开销。以降低延迟渲染中的内存使用。当碎片为多采样时,则对所有采样进行照明,如果不是,则仅对一个样本进行照明。gl_FragCoord为位置[0,屏幕大小]。我试着用这个代码检测相对位置(vec2a=gl_FragCoord.xy-floor(gl_FragCoord.xy);if(a.x!=0.5&&a.y!=0.5)gl_FragColor=vec4(1,0,0,1);else{gl u FragColor=vec4(0,1,0,1);}),但它没有正常工作。必须使用质心变化(gl_FragCoord不是质心)。我必须检查一下,我知道怎么做后会给你回复的。@Miro所以像:VS->out centroid fragcoord;main()