2

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

4

2 回答 2

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

于 2010-09-08T18:22:02.393 回答
-1

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

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

于 2010-09-07T17:03:29.987 回答