是否可以基于像素着色器(Pixel Shader)为JavaFX创建自定义效果?我发现了这篇文章,但Decora是什么?我找不到任何相关信息。
谢谢!
是否可以基于像素着色器(Pixel Shader)为JavaFX创建自定义效果?我发现了这篇文章,但Decora是什么?我找不到任何相关信息。
谢谢!
目前没有 - 在抽象基类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的参考都已经过时。
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;
}
}