是否有任何快速(用于性能)方法可以在 glsl 中检测片段是否已被多重采样,但在第二(轻)通道中使用第一通道渲染的纹理。或者opengl如何存储有关多重采样的信息?
问问题
2073 次
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 都不会使用多重采样。
于 2010-09-07T17:03:29.987 回答