是否有任何快速(用于性能)的方式来检测glsl中是否多段采样碎片,但是在第二遍(浅)通过使用第一遍渲染后的纹理。或者opengl如何存储关于多重采样的信息?如何在glsl中检测片段是否被多重采样?
回答
他们是几个。通常的做法是检查当前的坐标(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
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
这是正常的。你必须使用不同的质心(gl_FragCoord不是质心)。我必须检查一下,当我知道如何去做时,我会尽快回复你。 – Calvin1602 2010-09-09 19:57:22
@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
选择像素格式时,在创建景时会激活多重采样。之后,您无法关闭或打开。但是,当渲染到纹理时,无论Symx的设置如何,OpenGL都不会使用多重采样。
- 1. 在GLSL 4.1片段着色器使用“取消”与多重采样
- 2. GLSL检查片段是否在几何体上
- 3. 如何检查片段是否存在?
- 4. GLSL纹理多个片段
- 5. 多重采样和片段着色器330
- 6. 如何检测照片是否被拍摄(照相机意图)
- 7. 多重采样纹理采样
- 8. 在iPad上多重采样
- 9. 如何知道片段是否被重新创建
- 10. 如何检测ViewController是否被激活?
- 11. 如何检测字段是否被触摸或点击?
- 12. 在数码照片中,如何检测一座山是否被云遮挡?
- 13. 如何检测Console.In(stdin)是否已被重定向?
- 14. 如何通过重定向检测页面是否被请求?
- 15. 如何检测URL是否被重定向到另一个?
- 16. 如何检测您是否已被mod_rewrite重定向?
- 17. Turnserver是否被检测到?
- 18. 检测Javascript是否被禁用,如果是,则重定向
- 19. 如何检测密钥是否在一次性密钥加密中被重用?
- 20. 如何检测按钮在源中是否被禁用
- 21. 如何在我的.vimrc中检测“&t_Co”是否被“定义”?
- 22. 如何检测一行是否被锁定在sql server表中?
- 23. OpenGL多重采样启用
- 24. 如何在iPhone上的OpenGL ES中激活多重采样?
- 25. 如何检查照片是否在尝试上传照片时被选中
- 26. 抗锯齿/多重采样在D3D9
- 27. 在OpenGL Win32上激活多重采样
- 28. OpenGL ES 2.0。 GLSL - 不能在片段着色器中同时使用两种采样颜色
- 29. 如何检查动画片段是否在掩码下可见
- 30. 将非多重采样的FBO复制到多重采样的FBO
你为什么要检测你的GLSL片段程序?使用两个不同的着色器会更容易,一个是多点采样,另一个是关闭时,因此在渲染过程中不需要检查它,也不需要测试开销。 – tibur 2010-09-07 20:52:42
用于延迟渲染中较低的内存使用量。什么时候片段多重采样,然后做所有采样的光照,如果不是那么只有一个采样。 – kravemir 2010-09-08 14:17:33