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

3

是否可以基于像素着色器(Pixel Shader)为JavaFX创建自定义效果?我发现了这篇文章,但Decora是什么?我找不到任何相关信息。

谢谢!


1
我认为最好的方法是尝试并找出答案。我知道JavaFX源代码包含着色器,因此我的猜测是,这篇文章并没有过时。我认为Decora可能是作者用作灵感的某个库或应用程序。 - M. le Rutte
3个回答

5

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

Decora项目在这里讨论:http://labonnesoupe.org/static/code/。大约6个月前,我曾询问过是否开放JSL,在OpenJFX开发者线程中建立某种公共API,但被告知“不,没有计划将此API开放给公众”。

正如您所知,OpenJFX正在考虑新的提交者,我相信这是基于签署Oracle贡献者协议,并通过惯例懒惰投票选出的前提条件。也许这会使这个非常需要的领域焕发生机。

在我的2D游戏中,我使用Guassian模糊和Blooms来突出法术打击,我相信Decora被用于开发这些特效。然而,它们的速度非常慢。在10系列NVidia卡上,我的FPS从大约250下降到大约30。我希望在这方面看到改进。

我给Labonnesoupe的作者Chris Campbell发送了电子邮件,询问他在JavaFX着色器方面的工作,但他回复我说那是8年前的事了,他不了解最新情况。在网上搜索发现,所有有关Decora的参考都已经过时。


1
理论上说,在JavaFx中创建自定义效果是可能的,但使用的方式可能不会受到您的喜爱。抽象类javafx.scene.effect.Effect内部有一些方法,没错。但基于“内部”意味着“包私有”,我们可以这样做。在您的项目中创建一个名为“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;
    }
}




0
使用libgdx。它是免费的,并且可以在Web HTML 5 webgl、iOS、Android、所有桌面平台上运行,并具有完整的着色器支持。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接