使用像素着色器的JavaFX自定义效果

时间:2018-03-02 13:50:13

标签: javafx effects pixel-shader

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

THX

3 个答案:

答案 0 :(得分:1)

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

这里讨论了Decora项目:http://labonnesoupe.org/static/code/。我问过打开JSL,在6个月前开发者OpenJFX线程中制作某种公共API,并被告知,“不,没有计划向公众开放这个api"。” p>

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

在我自己的2D游戏中,我使用Guassian Blurs和Blooms来强调法术攻击,我相信Decora用于开发这些效果。然而,它们可怜的慢。在10系列NVidia显卡上将我的FPS从大约250降至大约30。我很乐意看到改进。

我通过电子邮件向Chris Campbell(Labonnesoupe的作者)询问了他关于JavaFX着色器的工作,但他通过电子邮件回复说我是在8年多前,并且他没有了解最新版本。对网络的搜索显示,所有对Decora的引用现在都很古老。

答案 1 :(得分:0)

使用libgdx。它免费且可在Web HTML 5 webgl,ios,android,所有桌面上运行,并具有完整的着色器支持

答案 2 :(得分:0)

从理论上讲,可以在JavaFx中创建自定义效果,但是使用u可能不喜欢的方式...抽象类javafx.scene.effect.Effect内部有内部方法,没错!但是基于内部意味着“打包私有”这一事实,我们可以执行以下操作!在您的项目中,创建一个与Effect类相同的名为“ javafx.scene.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。影响没有JavaFx版本/实现的孩子,因此从理论上讲,您应该可以使用我的解决方案自行将这些孩子添加到JavaFx中!但是,这又是一个好主意,这是一个问题,因为我认为com.sun.scenario.effect是常规JavaFx程序员甚至不应该知道的东西。但我会让你决定!