【发布时间】:2023-02-23 00:33:41
【问题描述】:
是否有可能在 GLSL 像素着色器中从 0 到 1 计算一个像素被它绘制的几何图形填充的程度?
简单示例:空间中的立方体将在 2d 屏幕空间中大部分 100% 填充在立方体 2d 投影的内部,但从技术上讲,边界周围的这些像素可以由几何体本身部分填充(在 0.0 和 1.0 之间)
我知道多重采样和抗锯齿处理这个问题,但这是一个特定的计算应用程序,我们无法承受太多额外的处理。我需要确定实际的小数填充值。
在实际用例中,几何形状并不简单,不能可靠地假设为特定形状。
研究多重采样,因为这是我知道的唯一可能有帮助的内置方法。
【问题讨论】:
-
GL_POLYGON_SMOOTH将计算三角形的分析覆盖率;但它对复杂的形状根本没有用。如果您想要一个快速简单的解决方案,多重采样是您最好的选择。 -
谢谢,您能否详细说明 GL_POLYGON_SMOOTH 方法?
-
您只需执行
glEnable(GL_POLYGON_SMOOTH),OpenGL 会将片段 alpha 乘以分析覆盖率。你无法控制它。没什么可细说的。我告诉过你这没有用。您真的应该更好地描述您要解决的问题。例如。你说的是在太空中画一个立方体。但是 OpenGL 不知道如何绘制立方体;相反,它一次光栅化一个三角形。因此,如果您确实需要覆盖立方体而不是单个图元,OpenGL 无法为您完成。还要解释为什么多重采样不能降低成本;它很便宜。 -
感谢您的信息。听起来多重采样是唯一可行的选择。我们在一个复杂的不一致模型上获取纹理中的状态值,并根据角度和光照将它们绘制到屏幕上。轮廓别名正在降低准确性。如果 MS 便宜,我们会尝试。理想情况是在片段着色器内部,我们可以访问一个从 0 到 1 的分析覆盖值,这样我们就可以在数学中使用它来计算状态输出,它用于状态计算本身。
-
这是什么意思? “状态值”、“不一致的模型”?您应该知道,即使您在片段着色器中获得的 MS 覆盖率也在深度测试之前。
标签: opengl glsl fragment-shader