Android OpenGL ES 2中的重叠透明度

Android OpenGL ES 2中的重叠透明度,android,opengl-es,Android,Opengl Es,我正在尝试在OpenGL ES 2中制作具有漂亮光晕/阴影的贝塞尔曲线。一切都很好:我有一条由许多立方贝塞尔组成的路径,每一个贝塞尔都是由许多三角形组成的。三角形,而不是直线,因为直线可以重叠,而我的三角形是根据曲线的导数放在那里的。(我无法更好地解释。。我不是母语人士,但我想你能理解。)每个三角形的顶点都有值(0或1,取决于某个顶点所在的直线的边:右或左)。该值被插入,在片段着色器中,中间的值为0.5。根据这些值,在片段着色器中,我决定某个像素是在线条上还是在光晕上,并相应地对其进行着色。一切

我正在尝试在OpenGL ES 2中制作具有漂亮光晕/阴影的贝塞尔曲线。一切都很好:我有一条由许多立方贝塞尔组成的路径,每一个贝塞尔都是由许多三角形组成的。三角形,而不是直线,因为直线可以重叠,而我的三角形是根据曲线的导数放在那里的。(我无法更好地解释。。我不是母语人士,但我想你能理解。)每个三角形的顶点都有值(0或1,取决于某个顶点所在的直线的边:右或左)。该值被插入,在片段着色器中,中间的值为0.5。根据这些值,在片段着色器中,我决定某个像素是在线条上还是在光晕上,并相应地对其进行着色。一切正常,但我想将路径拆分为2




如您所见,两条线的光晕重叠,使其看起来很难看。我怎样才能修好它?顺便说一句,不要介意糟糕的质量(这是一个放大的屏幕截图)或背景。

我可以想出两种可能的方法

  • 模具缓冲区(不确定这在ES so中是否可行)

    • 绘制不透明对象
    • 重置模具缓冲区
    • 仅当模具缓冲区==0且绘制时增加模具缓冲区时,才绘制透明对象
  • 分选深度

    • 为所有透明对象指定不同的深度值
    • 在启用深度测试的情况下,从前到后绘制透明对象

  • 我想你最好的办法可能是隐藏这件文物。由于已经在为插值添加自定义逐顶点数据,请使用另一个表示该顶点t值的组件。然后,在片段着色器中,可以对这些分割的线使用该值执行某些操作

    例如,由于您似乎正在使用加法混合,对于t=0到1,如果要将片段着色器中的输出颜色乘以t,则会得到一条在整个长度上淡入的线


    很明显,你不需要在整条直线上持续淡入淡出,直到t=0.15或其他。将您的值映射到0..1,这将有效地隐藏双发光工件

    您是否严格限制使用ES 2.0?我有一个想法,但不幸的是它需要一个只在ES 3.0或扩展版中可用的功能。不幸的是,是的..ES 3.0可从Android 4.3获得。。。我认为这个下限太高了。一半的市场没有ES 3.0约2。好主意!但我同时画出辉光和实际曲线,就像你说的,我必须分开画。我认为在性能方面这不会是一个问题,但我仍然会尝试找到一个可能更好的解决方案。但即使有了这个解决方案,我认为工件也会出现。想想看。不过如果更好的话,我还是会试试看。我将调查模具缓冲区,看看我发现了什么。谢谢是的,这是可能的,但是我没有任何关于曲线分裂与否的信息。我只知道定义每条曲线的4个点。不管怎么说,这都没什么大不了的,但对于如此小和罕见的东西,碎片着色器上可能会有太多不必要的负载(我忘了提一下,但线条最多会像每10条曲线那样分裂)。不管怎样,你说得对。我会考虑的。谢谢它应该只是片段程序中的一条附加指令——一条使颜色变暗的乘法。如果在顶点程序中计算值,只需将变暗因子作为变量传递。即使值通常为1.0,也不应总是禁止这样做,因为您误解了某些内容。我使用的自定义变量不是曲线的t,它更像曲线的宽度。所以,首先,我需要另一个变量,它将保持t,并把你说的指令。其次,我需要知道是否应该对某条曲线应用淡入淡出(否则所有曲线都会有淡入淡出,这很糟糕。请记住,一条长的曲线路径是由许多贝塞尔曲线组成的)。为了做到这一点,我需要知道一条曲线是否有一个孪晶(曲线是拼接)。继续(超出角色限制)我需要考虑的其他事情是曲线的长度和曲线的“曲线度”。长曲线上的淡入度应为0到0.05(例如),短曲线上的淡入度应为0到0.1。别忘了,这仍然会产生人工制品,但希望有一些更难看到。总之,通过gpu的一些工作,这可能会解决问题。:)谢谢酷,我很想看看你是如何修复它的!更多想法:1)假设您决定在CPU上分割曲线,如果是这样,您可以修改现有顶点数据以传入此颜色值。事实上,如果你把它作为一个通用的颜色值,把alpha作为你的渐变因子,你可以得到一些很好的效果,顶点着色器也几乎不起作用。2) 如果要添加另一个变量,请将其打包到现有的变量中(即使用浮点2而不是浮点)3)您可以对现有宽度执行类似的操作,方法是在分割曲线时使曲线的起点非常窄。