【发布时间】:2018-03-02 13:50:12
【问题描述】:
是否可以基于 Pixle 着色器为 JavaFX 创建自定义效果?我找到了this 文章,但 Decora 是什么?我找不到任何关于它的信息。
谢谢
【问题讨论】:
-
我认为最好的方法是尝试找出答案。我知道 JavaFX 源代码包含着色器,所以我猜这篇文章并没有过时。我认为 Decora 是作者用作灵感的某个库或应用程序。
标签: javafx effects pixel-shader
是否可以基于 Pixle 着色器为 JavaFX 创建自定义效果?我找到了this 文章,但 Decora 是什么?我找不到任何关于它的信息。
谢谢
【问题讨论】:
标签: javafx effects pixel-shader
目前没有 - 在抽象基类 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 的引用现在都是古老的。
【讨论】:
理论上,在 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;
}
}
【讨论】:
使用 libgdx。它是免费的,适用于 Web HTML 5 webgl、ios、android、所有桌面并具有完整的着色器支持
【讨论】: