【问题标题】:JavaFX Custom Effects with Pixel Shader带有像素着色器的 JavaFX 自定义效果
【发布时间】:2018-03-02 13:50:12
【问题描述】:

是否可以基于 Pixle 着色器为 JavaFX 创建自定义效果?我找到了this 文章,但 Decora 是什么?我找不到任何关于它的信息。

谢谢

【问题讨论】:

  • 我认为最好的方法是尝试找出答案。我知道 JavaFX 源代码包含着色器,所以我猜这篇文章并没有过时。我认为 Decora 是作者用作灵感的某个库或应用程序。

标签: javafx effects pixel-shader


【解决方案1】:

目前没有 - 在抽象基类 Effect.java 中,有抽象的包私有方法,如 copy()、sync()、update() 等。

这里讨论了 Decora 项目:http://labonnesoupe.org/static/code/。大约 6 个月前,我询问了关于开放 JSL,以便在开发人员 OpenJFX 线程中制作某种公共 API,并被告知,“不,没有计划向公众开放这个 api”。

您可能知道,OpenJFX 正在考虑新的提交者,我相信前提是您签署了 Oracle 贡献者协议,并通过惰性共识投票。也许这会将这个急需的领域分流到生活中。

在我自己的 2D 游戏中,我使用高斯模糊和花朵来突出法术打击,我相信在开发这些效果时使用了 Decora。但是,它们的速度慢得令人遗憾。在 10 系列 NVidia 卡上将我的 FPS 从大约 250 降低到大约 30。我希望在这里看到改进。

我给 Chris Campbell(Labonnesoupe 的作者)发了电子邮件,询问他在 JavaFX 着色器方面的工作,但他给我回邮件说那是 8 多年前的事了,而且他还没有最新消息。网络搜索显示,所有对 Decora 的引用现在都是古老的。

【讨论】:

    【解决方案2】:

    理论上,在 JavaFx 中创建自定义效果是可能的,但是使用您可能不喜欢的方式... 抽象类 javafx.scene.effect.Effect 内部有内部方法,没错!但是基于 internal 意味着“包私有”的事实,我们可以执行以下操作!在您的项目中创建一个名为“javafx.scene.effect”的新包,与 Effect 类所在的相同,并在这个新创建的包中创建扩展 javafx.scene.effect.Effect 的自定义效果类,这就是您的自定义 JavaFx 效果! !!
    自定义效果类示例:

    package javafx.scene.effect;
    
    import com.sun.javafx.geom.BaseBounds;
    import com.sun.javafx.geom.Rectangle;
    import com.sun.javafx.geom.transform.BaseTransform;
    import com.sun.javafx.scene.BoundsAccessor;
    import com.sun.scenario.effect.FilterContext;
    import com.sun.scenario.effect.ImageData;
    
    import javafx.scene.Node;
    
    public class MyEffect extends javafx.scene.effect.Effect
    {
        public MyEffect()
        {
            
        }
    
        @Override
        com.sun.scenario.effect.Effect impl_createImpl()
        {
            return new com.sun.scenario.effect.Effect()
            {
                
                @Override
                public boolean reducesOpaquePixels()
                {
                    // TODO Auto-generated method stub
                    return false;
                }
                
                @Override
                public BaseBounds getBounds(BaseTransform transform, com.sun.scenario.effect.Effect defaultInput)
                {
                    // TODO Auto-generated method stub
                    return null;
                }
                
                @Override
                public AccelType getAccelType(FilterContext fctx)
                {
                    // TODO Auto-generated method stub
                    return null;
                }
                
                @Override
                public ImageData filter(FilterContext fctx, BaseTransform transform, Rectangle outputClip, Object renderHelper, com.sun.scenario.effect.Effect defaultInput)
                {
                    // TODO Auto-generated method stub
                    return null;
                }
            };
        }
    
        @Override
        void impl_update()
        {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public BaseBounds impl_getBounds(BaseBounds bounds, BaseTransform tx, Node node, BoundsAccessor boundsAccessor)
        {
            // TODO Auto-generated method stub
            return null;
        }
    
        @Override
        boolean impl_checkChainContains(javafx.scene.effect.Effect e)
        {
            // TODO Auto-generated method stub
            return false;
        }
    
        @Override
        public javafx.scene.effect.Effect impl_copy()
        {
            // TODO Auto-generated method stub
            return null;
        }
    }
    

    但是我真的不知道 javafx.scene.effect.Effect 中的那些继承方法应该做什么,所以你需要弄清楚:) 另外,请记住,内部/私人的东西出于某种原因是私人的(尽管在这种情况下我也看不到那个原因)!
    附加:
    我目前所知道的是,JavaFx 效果只是来自 `com.sun.scenario.effect` 的效果的某种“掩码”或“提供者”,并且有许多 com.sun.scenario.effect 子类没有直接的 JavaFx 版本/实现,所以理论上你应该能够使用我的解决方案自行将这些添加到 JavaFx 中!但同样有一个问题,这是否是一个好主意,因为我认为 `com.sun.scenario.effect` 是常规 JavaFx 程序员甚至不应该知道的东西。但我会让你决定!

    【讨论】:

      【解决方案3】:

      使用 libgdx。它是免费的,适用于 Web HTML 5 webgl、ios、android、所有桌面并具有完整的着色器支持

      【讨论】:

        猜你喜欢
        • 2010-12-28
        • 2017-01-17
        • 2011-02-26
        • 1970-01-01
        • 1970-01-01
        • 2016-11-30
        • 2012-11-29
        • 1970-01-01
        • 2018-01-09
        相关资源
        最近更新 更多