繁体   English   中英

GLSL 330中的多采样和片段着色器

[英]multisampling and fragment shaders in GLSL 330

我试图了解在多采样渲染期间如何调用片段着色器,我仔细阅读了规格,但是我有点困惑。

我用颜色和深度/模板渲染缓冲区设置了多采样FBO。

我设置了一个仅用于转换的简单1行顶点着色器,以及另一个仅返回黑色的1行片段着色器。

我画一条线-这条线显示得很平滑。

现在,如果在片段着色器中,我不是从暗淡地返回黑色,而是从多重采样纹理中texelFetch,始终读取样本编号0(即黑色),而是出现了锯齿线。

简单的myoutcolor=vec4(0.0)myoutcolor=texelFetch(mysampler2DMS,...,0)之间有什么区别?

规范指出,仅当片段着色器静态使用gl_SampleIDgl_Samplemask[]或具有“样本”存储限定符时才在样本级别执行。(在所有这些情况下,这意味着GLSL #version 400或更高版本),否则它在片段级别执行。

但是那怎么可能呢? 在上面的示例中,即使我总是返回相同的颜色,我也得到了一条平滑的线,因此,我坚决要始终在多采样帧缓冲区的采样级别执行片段着色器。如果不是,我即使从MS纹理返回始终相同的样本,也应该获得平滑的结果。

有人可以帮我解决这个问题吗?

PS:我当前正在使用#version 330,但是我发现,只有GLSL 400或更高版本才支持每个能够正确gl_SampleID MS的多重采样感知语句ID( gl_SampleIDgl_Samplemask[] ,sample ..)。是否支持GLSL 330提供的正确处理多重采样的功能? 如何在GLSL 330中处理MS纹理?

在上面的示例中,即使我总是返回相同的颜色,我也得到了一条平滑的线

因为这是多级采样什么。

多重采样是关于每个像素调用一次FS,并将该值分布在图元覆盖的那个像素区域内的样本上。 因此,如果对图元边缘上的像素执行FS,则结果将仅分配给该像素的某些样本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM