[英]multisampling and fragment shaders in GLSL 330
我试图了解在多采样渲染期间如何调用片段着色器,我仔细阅读了规格,但是我有点困惑。
我用颜色和深度/模板渲染缓冲区设置了多采样FBO。
我设置了一个仅用于转换的简单1行顶点着色器,以及另一个仅返回黑色的1行片段着色器。
我画一条线-这条线显示得很平滑。
现在,如果在片段着色器中,我不是从暗淡地返回黑色,而是从多重采样纹理中texelFetch,始终读取样本编号0(即黑色),而是出现了锯齿线。
简单的myoutcolor=vec4(0.0)
和myoutcolor=texelFetch(mysampler2DMS,...,0)
之间有什么区别?
规范指出,仅当片段着色器静态使用gl_SampleID
, gl_Samplemask[]
或具有“样本”存储限定符时才在样本级别执行。(在所有这些情况下,这意味着GLSL #version 400
或更高版本),否则它在片段级别执行。
但是那怎么可能呢? 在上面的示例中,即使我总是返回相同的颜色,我也得到了一条平滑的线,因此,我坚决要始终在多采样帧缓冲区的采样级别执行片段着色器。如果不是,我即使从MS纹理返回始终相同的样本,也应该获得平滑的结果。
有人可以帮我解决这个问题吗?
PS:我当前正在使用#version 330,但是我发现,只有GLSL 400或更高版本才支持每个能够正确gl_SampleID
MS的多重采样感知语句ID( gl_SampleID
, gl_Samplemask[]
,sample ..)。是否支持GLSL 330提供的正确处理多重采样的功能? 如何在GLSL 330中处理MS纹理?
在上面的示例中,即使我总是返回相同的颜色,我也得到了一条平滑的线
因为这是多级采样是什么。
多重采样是关于每个像素调用一次FS,并将该值分布在图元覆盖的那个像素区域内的样本上。 因此,如果对图元边缘上的像素执行FS,则结果将仅分配给该像素的某些样本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.