是否有任何快速(性能)方式在glsl中检测片段是否已经过多重采样,但是在第二次(光)传递中使用纹理进行了第一次渲染。或者opengl如何存储有关多重采样的信息?
答案 0 :(得分:2)
他们有几个。通常的一个是检查当前的坐标(gl_FragCoord)是否为(0.5,0.5)。如果是,则表示您位于多边形的中间:它只采样一次。
它不是,它可能是4个(对于4xMSAA)旋转方角中的一个:你处于边缘,而openGL已经检测到只有一个样本是不够的。
另见http://www.opengl.org/pipeline/article/vol003_6/
为了在第二遍中获得此信息,您必须将其存储在g-buffer中。
编辑:这是我刚刚完成的代码片段。在gtx 470上测试,具有1024x1024 4xMSAA纹理。
顶点着色器:
#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
答案 1 :(得分:-1)
在选择像素格式时,在创建上下文时激活多重采样。之后,您无法将其关闭或打开。但是当渲染到纹理时,无论上下文的设置是什么,OpenGL都不会使用多重采样。