Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用硬件加速工具包(如Qt&;JavaFX是否支持高质量字体渲染?_Qt_Opengl_Javafx_3d_Direct3d - Fatal编程技术网

如何使用硬件加速工具包(如Qt&;JavaFX是否支持高质量字体渲染?

如何使用硬件加速工具包(如Qt&;JavaFX是否支持高质量字体渲染?,qt,opengl,javafx,3d,direct3d,Qt,Opengl,Javafx,3d,Direct3d,鉴于OpenGL和Direct3D都不支持高质量字体渲染(如LCD渲染),使用这些硬件图形API之一渲染UI的工具包如何在3D或2D“场景”中集成此类质量的文本 他们是否调用特定于平台的API(如Windows上的DirectWrite)将文本渲染到某种图像缓冲区中,然后在场景中显示(可能是纹理或其他可用的形式)?通常,他们使用在CPU上运行的字形光栅化器和文本布局库将整个文本段落渲染成图片。然后将该图片加载到GPU,并在所需位置绘制 很多人(包括我)都在研究GPU加速的通用字形渲染,这不需要太

鉴于OpenGL和Direct3D都不支持高质量字体渲染(如LCD渲染),使用这些硬件图形API之一渲染UI的工具包如何在3D或2D“场景”中集成此类质量的文本


他们是否调用特定于平台的API(如Windows上的DirectWrite)将文本渲染到某种图像缓冲区中,然后在场景中显示(可能是纹理或其他可用的形式)?

通常,他们使用在CPU上运行的字形光栅化器和文本布局库将整个文本段落渲染成图片。然后将该图片加载到GPU,并在所需位置绘制


很多人(包括我)都在研究GPU加速的通用字形渲染,这不需要太多的预处理。在过去的几年里,有许多有趣的方法被发表,但到目前为止还没有金标准解决方案。

到目前为止,Qt5中的所有文本渲染都是从基于CPU的光栅后端开始的

在Qt 5中,有三种文本呈现模式:

  • QWidget
    -直接使用光栅后端输出,没有硬件加速

  • QOpenGLWidget
    -光栅后端渲染为纹理(可能是a),然后纹理显示在三角形上。放大会导致明显的像素化

  • Qt Quick(在QML中)使用Valve的文本渲染,并基于预先计算的距离场纹理在GPU上完成。纹理来自光栅后端,但并不直接表示您看到的文本

    SDF表示允许廉价的文本样式-轮廓、发光和阴影也由GPU基于相同的纹理计算

    有关Qt实现的详细信息,请参阅

  • 看看这三者之间

    现在有更好的方法,光栅化完全在GPU上完成,使用一系列二次样条线的轮廓字体表示。与所有好东西一样,问题在于,其中一些方法受到专利的限制:(它们确实允许轻松添加效果,如轮廓

    请参阅在GPU光栅化(字形大小超过十几个像素左右)和字体图集(大小较小)之间自适应切换的实现,以实时帧速率呈现1300页文本


    请参阅,不仅可以实时渲染文本,还可以实时渲染数学方程,即使没有封闭式公式。事实证明,您不需要封闭式公式来绘制,就像有封闭式公式一样:)

    所有通用文本渲染都是在CPU上完成的。感谢您确认我的基本想法。但它听起来效率很低,我仍然不明白为什么OpenGL没有内置的对清晰字体渲染的支持。其他人告诉我,API和驱动程序主要针对很少需要高质量文本的游戏进行了优化。你与你所参考的研究类型有任何联系吗?这是距离域字体吗?我知道有一个名为freetype gl的库,但它基本上使用freetype进行光栅化,然后渲染到场景中。我对基于GPU的字体处理非常感兴趣。@ClancyMerrick:归根结底,字形轮廓的扫描线转换是一个问题,它不能很好地适应GPU的工作方式。当然,可以将曲线细分为三角形网格。但您只能在特定分辨率下执行此操作,直到降到某个最小面积阈值以下,低于该阈值,GPU无法完全并行化基本体渲染。这就是为什么你想要一个扫描线范围的列表,但是这些不能很好地并行化;基本上,你必须逐段迭代地跟踪曲线,每一步都要调整增量。@ClancyMerrick:这就是为什么像我这样的人都在研究将字形的轮廓表示投影到不同的空间和表示方式的方案,这更适合GPU渲染。我的方法对于“非装饰性”拉丁字符来说已经足够好了,但对于装饰性字体或东亚脚本来说仍然有很多问题。@ClancyMerrick:说实话:我不在乎……只要我不在欧盟之外将我的工作商业化,对我来说就没有什么问题,因为纯软件专利在这里是不可执行的(请参阅)就计算机图形学而言,一切几乎都可以立即归结为纯数学。在libre软件中使用这些东西可以吗。EFF会说“不!”;我说“可以!”。你只需等几年,它就可以自由使用。例如,上周的MP3。@datenwolf:“从数学上证明,三阶曲线的根不存在广义闭合解”——这实际上是5阶或更高阶多项式的情况。虽然有3阶和4阶的广义公式,但它们可能相当麻烦,比高中代数中教授的二次公式麻烦得多。