国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
目錄
WebGL之外的文字快速注釋
字體幾何
如何從字體文件創(chuàng)建字體幾何形狀
方法1:自動且容易
方法2:手動和痛苦
在三j中使用文本幾何形狀
優(yōu)勢
缺點
演示:褪色的信件
文本(和畫布)紋理
如何創(chuàng)建和使用文本紋理
演示:帆布紋理
位圖字體
如何創(chuàng)建位圖字體
如何使用位圖字體
互動演示:閃亮的積分
簽名的距離字段
多通道簽名的距離字段
如何創(chuàng)建MSDF字體
如何使用SDF和MSDF字體
演示:星球大戰(zhàn)介紹
獎勵提示:生成帶有高度圖的3D文本
進(jìn)一步閱讀
首頁 web前端 css教程 使用WebGL渲染文本的技術(shù)

使用WebGL渲染文本的技術(shù)

Apr 13, 2025 am 09:54 AM

使用WebGL渲染文本的技術(shù)

正如WebGL中的規(guī)則一樣,看起來應(yīng)該很簡單的任何東西實際上都非常復(fù)雜。繪圖線,調(diào)試著色器,文本渲染……它們在WebGL中都很難以做到。

那不是很奇怪嗎? WebGL沒有用于渲染文本的內(nèi)置功能。盡管文本似乎是最基本的功能。當(dāng)涉及到實際渲染時,事情變得復(fù)雜。您如何解釋每種語言的巨大字形?您如何使用固定寬度或比例寬度字體工作?當(dāng)需要將文本渲染到上下,從左到右或向右右轉(zhuǎn)時,您該怎么辦?數(shù)學(xué)方程式,圖表,樂譜?

突然間,為什么文本渲染在像WebGL這樣的低級圖形API中沒有位置。文本渲染是許多細(xì)微差別的復(fù)雜問題。如果我們想渲染文本,我們需要發(fā)揮創(chuàng)造力。幸運的是,許多聰明的人已經(jīng)為我們所有的WebGL文本需求提出了廣泛的技術(shù)。

我們將在本文中學(xué)習(xí)其中的一些技術(shù),包括如何生成所需的資產(chǎn)以及如何與其中包括WebGL渲染器的JavaScript 3D庫一起使用。作為獎勵,每種技術(shù)都將具有演示顯示用例。

目錄

  • WebGL之外的文字快速注釋
  • 字體幾何
  • 文本(和畫布)紋理
  • 位圖字體
  • 簽名的距離字段
  • 多通道簽名的距離字段
  • 生成帶有高度圖的3D文本
  • 進(jìn)一步閱讀

WebGL之外的文字快速注釋

盡管本文全部與WebGL中的文本有關(guān),但您應(yīng)該考慮的第一件事是您是否可以使用覆蓋在WebGL帆布頂部的HMTL文本或畫布。 3D幾何形狀不能用作覆蓋層的覆蓋,但是您可以從開箱即用。在很多情況下,這就是您所需要的。

字體幾何

渲染文本的常見方法之一是用一系列三角形構(gòu)建字形,就像常規(guī)模型一樣。畢竟,渲染點,線條和三角形是WebGL的優(yōu)勢。

創(chuàng)建字符串時,每個字形都是通過從三角形點的字體文件中讀取三角形來制作的。從那里,您可以擠出字形以使其3D或通過矩陣操作擴展字形。

字體幾何最適合少量文本。那是因為每個字形都包含許多三角形,這會導(dǎo)致繪畫變得有問題。

通過字體幾何形狀創(chuàng)建185,084個三角形和555,252個頂點,您現(xiàn)在正在閱讀此精確段落。這只是259個字母。使用字體幾何形狀編寫整個文章,您的計算機風(fēng)扇可能會成為飛機渦輪機。

盡管三角形的數(shù)量因三角測量的精度和使用的字體而變化,但在使用字體幾何時,渲染大量文本可能總是是一個瓶頸。

如何從字體文件創(chuàng)建字體幾何形狀

如果它像選擇想要的字體和渲染文本一樣容易。我不會寫這篇文章。常規(guī)字體格式用曲線定義字形。另一方面,在CPU上繪制WebGL的繪制非常昂貴,并且也很復(fù)雜。如果我們想渲染文本,我們需要從bezier曲線中創(chuàng)建三角形(三角剖分)。

我找到了一些三角剖分方法,但是絕不是完美的,它們可能無法與每種字體一起使用。但是,至少他們會讓您開始進(jìn)行三角剖分的字體。

方法1:自動且容易

如果您使用的是三j,則通過faceType.js傳遞字體,以從字體文件中讀取參數(shù)曲線并將其放入.json文件中。三j中的字體幾何特征會為您提供三角測量:

 const幾何= new Trix.fontgeometry(“ Hello wance”,{font:font,size:80})

另外,如果您不使用三j,則不需要實時三角剖分。您可以通過使用三角剖分為您的字體來節(jié)省手動過程的痛苦。然后,您可以從幾何形狀中提取頂點和索引,然后將它們加載到您選擇的WebGL應(yīng)用程序中。

方法2:手動和痛苦

至少在最初,三角形文件的手動選項非常復(fù)雜且令人費解。這將需要整篇文章以詳細(xì)解釋。也就是說,我們將迅速介紹我從Stackoverflow獲取的基本實現(xiàn)的步驟。

實施基本上是這樣分解的:

  1. 將Opentype.js和Earcut.js添加到您的項目中。
  2. 使用opentype.js從.tff字體文件中獲取更偏見的曲線。
  3. 將Bezier曲線轉(zhuǎn)換為封閉形狀,然后通過降序區(qū)域?qū)ζ溥M(jìn)行排序。
  4. 通過找出其他形狀內(nèi)部的形狀來確定孔的指標(biāo)。
  5. 將所有點作為第二個參數(shù)將所有點帶到耳塞。
  6. 使用耳塞的結(jié)果作為幾何索引。
  7. 呼吸。

是的,很多。此實現(xiàn)可能對所有字體都不起作用。盡管如此,它仍然會讓您入門。

在三j中使用文本幾何形狀

值得慶幸的是,三臺j支持開箱即用的文本幾何形狀。給它一個.json,介紹了您最喜歡的字體的Bezzier曲線,而TrixJ則可以在運行時為您提供三角剖分。

 var loader = new Trix.fontloader();
var font;
var text =“ Hello World”
var loader = new Trix.fontloader();
loader.load('fonts/helvetiker_regular.typeface.json',function(helvetiker){
  字體= helvetiker;
  var幾何= new Trix.textgeemetry(文本,{
    字體:字體,
    尺寸:80,
    身高:5,
  });
}

優(yōu)勢

  • 創(chuàng)建3D字符串很容易擠出。
  • 矩陣操作使縮放更加容易。
  • 根據(jù)所使用的三角形數(shù)量,它提供了良好的質(zhì)量。

缺點

  • 由于高三角計數(shù),這與大量文本相比并不能很好地擴展。由于每個角色都由許多三角形定義,甚至像“ Hello World”一樣簡短的東西會導(dǎo)致7,396個三角形和22,188個頂點。
  • 這不適合常見的文本效果。
  • 反縮減取決于您的后處理混溶或瀏覽器默認(rèn)值。
  • 擴大太大的縮放可能會顯示三角形。

演示:褪色的信件

在以下演示中,我利用了使用字體幾何形狀創(chuàng)建3D文本的容易。在頂點著色器內(nèi)部,隨著時間的推移,擠出量增加并減少。將其與霧和標(biāo)準(zhǔn)材料搭配,您會得到這些幽靈般的字母進(jìn)出空白。

請注意,用較低的字母量如何,三角形的數(shù)量已經(jīng)存在數(shù)萬個!

文本(和畫布)紋理

制作文本紋理可能是在WebGL中繪制文本的最簡單和最古老的方法。打開Photoshop或其他一些柵格圖形編輯器,繪制帶有一些文本的圖像,然后將這些紋理渲染到四邊形上,然后完成!

另外,您可以使用畫布在運行時創(chuàng)建按需創(chuàng)建紋理。您也可以將畫布作為質(zhì)地渲染到四輪上。

除了是最不復(fù)雜的技術(shù)。文本紋理和帆布紋理具有每個紋理或給出的文本只需要一個四輪軸的好處。如果您真的愿意,可以用單個質(zhì)地編寫整個英國百科全書。這樣,您只需渲染一個四Quad,六個頂點和兩個面。當(dāng)然,您會以一個規(guī)模進(jìn)行操作,但仍然存在這個想法:您可以將多個字形批量地插入同一四邊形。文本和畫布紋理都有縮放問題的問題,尤其是在使用大量文本時。

對于文本紋理,用戶必須下載構(gòu)成文本的所有紋理,然后將其保存在內(nèi)存中。對于帆布紋理,用戶不必下載任何內(nèi)容 - 但是現(xiàn)在,用戶的計算機必須在運行時進(jìn)行所有柵格化,并且您需要跟蹤每個單詞在畫布中的位置。另外,更新大畫布可能真的很慢。

如何創(chuàng)建和使用文本紋理

文本紋理對他們沒有任何奇特的態(tài)度。打開您喜歡的柵格圖形編輯器,在畫布上繪制一些文本,然后將其導(dǎo)出為圖像。然后,您可以將其作為紋理加載,然后將其映射到飛機上:

 //加載紋理
令紋理=;
const幾何=新的三。
const材料新的三。
this.scene.add(新網(wǎng)格(幾何,材料));

如果您的WebGL應(yīng)用程序有很多文本,則下載龐大的文本表可能不是理想的,尤其是對于慢速連接的用戶而言。為了避免下載時間,您可以使用屏幕外帆布將其按需柵格化,然后對畫布作為質(zhì)地進(jìn)行采樣。

讓我們交易下載時間以進(jìn)行性能,因為將大量文本柵格化的時間不止一刻。

函數(shù)createTextCanvas(String,parameters = {}){
    
    const canvas = document.createelement(“ canvas”);
    const ctx = canvas.getContext(“ 2d”);
    
    //準(zhǔn)備可以測量的字體
    令fontsize = parameters.fontsize || 56;
    ctx.font =`$ {fontsize} px monospace`;
    
    const textmetrics = ctx.measuretext(text);
    
    令width = textmetrics.width;
    讓高度= fontsize;
    
    //調(diào)整帆布大小以匹配文本大小 
    canvas.width = width;
    canvas.height =高度;
    canvas.style.width =寬度“ px”;
    canvas.style.height =高度“ px”;
    
    //重新涂抹字體,因為調(diào)整了帆布的大小。
    ctx.font =`$ {fontsize} px monospace`;
    ctx.textalign = parameters.align || “中心” ;
    ctx.textbaseline = parameters.baseline || “中間”;
    
    //使畫布透明以簡單
    ctx.fillstyle =“透明”;
    ctx.fillect(0,0,ctx.canvas.width,ctx.canvas.height);
    
    ctx.fillstyle = parameters.color || “白色的”;
    ctx.filltext(文本,寬度 / 2,高度 / 2);
    
    返回畫布;
}

令紋理= new three.texture(createTextCanvas(“ this is text”));

現(xiàn)在,您可以像以前的摘要一樣使用飛機上的紋理?;蛘吣梢詣?chuàng)建一個精靈。

作為替代方案,您可以使用更有效的庫來創(chuàng)建紋理或精靈,例如三text2d或三秒表。而且,如果您想要文本多行文本,則應(yīng)查看此驚人的教程。

優(yōu)勢

  • 這提供了具有靜態(tài)文本的優(yōu)質(zhì)1比1質(zhì)量。
  • 頂點/臉部計數(shù)低。每個字符串只能使用六個頂點和兩個面。
  • 在四邊形上實現(xiàn)紋理很容易。
  • 使用畫布或圖形編輯器添加效果,例如邊界和發(fā)光,這是相當(dāng)微不足道的。
  • 畫布使創(chuàng)建多行文本變得容易。

缺點

  • 如果射手化后縮放,旋轉(zhuǎn)或轉(zhuǎn)換,則看起來模糊。
  • 在非視網(wǎng)膜上,文字看起來松脆。
  • 您必須將所有使用的字符串柵格化。許多字符串意味著要下載很多數(shù)據(jù)。
  • 如果您不斷不斷更新畫布,則用畫布進(jìn)行按需柵格化可能會很慢。

演示:帆布紋理

帆布紋理可與有限數(shù)量的文本不經(jīng)常變化的有限文本運作良好。因此,我用四邊形構(gòu)建了一個簡單的文本墻,重復(fù)使用相同的紋理。

位圖字體

字體幾何形狀和文本紋理都經(jīng)歷了處理大量文本的相同問題。每片文本具有100萬個頂點是超級效率的,并且每片文本創(chuàng)建一個紋理并不能真正擴展。

Bitmap字體通過將所有唯一的字形將所有獨特的字形(稱為紋理地圖集)柵式化來解決此問題。這意味著您可以在運行時組裝任何給定的字符串,從而為每個字形創(chuàng)建四邊形并對紋理地圖集的部分進(jìn)行采樣。

這意味著用戶只需要為所有文本下載并使用單個紋理。這也意味著您只需要每個字形渲染一個四四分之一:

整個文章的渲染約為117,272個頂點和58,636個三角形。與僅一段段落的字體幾何形狀相比,這是高效的3.1倍。這是一個巨大的進(jìn)步!

由于位圖字體將字形柵格化成紋理,因此它們與常規(guī)圖像相同的問題。放大或擴展,您開始看到像素化和模糊的混亂。如果您想以不同的尺寸的文本,則應(yīng)在該特定尺寸上發(fā)送帶有字形的輔助位圖?;蛘?,您可以使用簽名的距離字段(SDF),我們將在下一節(jié)中介紹。

如何創(chuàng)建位圖字體

有很多可以生成位圖的工具。以下是一些更相關(guān)的選項:

  • Angel Code的BMFont - 這是由位圖格式的創(chuàng)建者組成的。
  • Hiero - 這是Java開源工具。它與Anglecode的BMFont非常相似,但是它允許您添加文本效果。
  • 字形設(shè)計師 - 這是一個付費MacOS應(yīng)用程序。
  • 鞋盒 - 這是用于處理精靈(包括位圖字體)的工具。

我們將使用AngleCode的BMFont來示例,因為我認(rèn)為這是最簡單的開始。在本節(jié)的底部,如果您認(rèn)為它缺乏所需的功能,則可以找到其他工具。

打開應(yīng)用程序時,您會看到一個屏幕上充滿了可以選擇的字母,這是您只能抓住所需的字形而不是發(fā)送希臘符號的好處。

該應(yīng)用程序的側(cè)邊欄使您可以選擇并選擇一組字形。

準(zhǔn)備出口了嗎?轉(zhuǎn)到選項將位圖保存為。并完成了!

但是我們要領(lǐng)先一些。在導(dǎo)出之前,您應(yīng)該檢查一些重要的設(shè)置。

  • 字體設(shè)置:這讓您選擇要使用的字體和大小。這里最重要的項目是“匹配的Char Height”。默認(rèn)情況下,應(yīng)用程序的“大小”選項使用像素而不是點。您會看到圖形編輯器的字體大小與生成的字體大小之間存在實質(zhì)性差異。如果您希望字形有意義,請選擇“匹配的Char Height”選項。
  • 導(dǎo)出設(shè)置:對于導(dǎo)出,請確保紋理大小為兩個功率(例如16×16、32×32、64×64等)。然后,如果需要,您就可以利用“線性MIPMAP線性”過濾。

在設(shè)置的底部,您將看到“文件格式”部分。只要您可以讀取文件并創(chuàng)建字形,選擇這兩個選項就可以了。

如果您正在尋找最小的文件大小。我進(jìn)行了一個超級非科學(xué)測試,在其中創(chuàng)建了所有l(wèi)owcase和大寫拉丁字符的位圖,并比較了每個選項。對于字體描述符,最有效的格式是二進(jìn)制的。

字體描述符格式 文件大小
二進(jìn)制 3 kb
原始文字 11 kb
XML 12 kb
紋理格式 文件大小
PNG 7 KB
塔加 64 KB
DirectDraw表面 65 KB

PNG是文本紋理的最小文件大小。

當(dāng)然,它比文件大小要復(fù)雜一些。為了更好地了解要使用哪種選項,您應(yīng)該研究解析時間和運行時間性能。如果您想了解每種格式的優(yōu)缺點,請查看此討論。

如何使用位圖字體

創(chuàng)建位圖字體幾何形狀比僅使用紋理要多一些,因為我們必須自己構(gòu)造字符串。每個字形都有其自身的高度和寬度,并采樣了紋理的不同部分。我們必須為字符串上的每個雕文創(chuàng)建一個四邊形,以便我們可以給他們正確的紫外線以采樣其雕文。

您可以在三js中使用三個bmfont-text使用位圖,SDFS和MSDF創(chuàng)建字符串。它需要多行文本,并將所有字形批量劃分到單個幾何形狀上。請注意,它需要從NPM安裝在項目中。

 var createGeementry = require('trix-bmfont-text')
var loadfont = require('load-bmfont')

loadFont('fonts/arial.fnt',function(err,font){
  //創(chuàng)建一個包裝的位圖字形的幾何形狀, 
  //包裝到300px并右對齊的單詞
  var幾何=創(chuàng)建地理計({{
    字體:字體,
    文字:“我的文字”
  }))
    
  var textureloader = new trix trix.textureloader();
  textureloader.load('fonts/arial.png',函數(shù)(紋理){
    //我們可以使用簡單的三j材料
    var Material = new Trix.meshbasicmaterial({
      地圖:紋理,
      透明:是的,
      顏色:0xaaffff
    }))

    //現(xiàn)在用我們的網(wǎng)眼做一些事情!
    var網(wǎng)格=新的三。網(wǎng)格(幾何,材料)
  }))
}))

無論何時將文本繪制為全白色或全白色,請使用倒置選項。

優(yōu)勢

  • 快速而簡單地渲染。
  • 這是獨立于1:1的比率和分辨率。
  • 給定字形,它可以渲染任何字符串。
  • 對于需要經(jīng)常更改的許多文本來說,這是一件好事。
  • 它與數(shù)量有限的字形非常好。
  • 它包括對kerning,行高和撰寫文字包裝等事物的支持。

缺點

  • 它僅接受有限的字符和樣式。
  • 它需要預(yù)先儲存的字形和額外的垃圾箱包裝才能進(jìn)行最佳使用。
  • 它是模糊的,在大尺度上像素化,也可以旋轉(zhuǎn)或轉(zhuǎn)換。
  • 每個渲染的字形只有一個四四核。

互動演示:閃亮的積分

柵格位圖字體非常適合電影信用,因為我們只需要幾種尺寸和樣式。缺點是文本在響應(yīng)式設(shè)計中并不大,因為它看起來會模糊和像素化的大小更大。

對于鼠標(biāo)效果,我要通過將鼠標(biāo)位置映射到視圖的大小,然后計算從鼠標(biāo)到文本位置的距離進(jìn)行計算。當(dāng)文本達(dá)到Z軸和Y軸上的特定點時,我也在旋轉(zhuǎn)。

簽名的距離字段

就像位圖字體一樣,簽名的距離字段(SDF)字體也是紋理地圖集。唯一的字形分批成單個“紋理地圖集”,可以在運行時創(chuàng)建任何字符串。

但是,與位圖字體這樣做的方式并沒有將柵格化的字形存儲在紋理上,而是生成并存儲了字形的SDF,而不是從低分辨率圖像中產(chǎn)生高分辨率的形狀。

像多邊形網(wǎng)格(字體幾何)一樣,SDF代表形狀。 SDF上的每個像素都存儲到最接近表面的距離。符號指示像素在形狀內(nèi)部或外部。如果符號為負(fù),則像素在內(nèi)部;如果是積極的,那么像素就在外面。該視頻很好地說明了這個概念。

SDF S也通常用于射線縮放和體積渲染。

由于SDF在每個像素中存儲距離,因此原始結(jié)果看起來像是原始形狀的模糊版本。要輸出用α在0.5測試的硬形狀,這是字形的邊界??纯醋帜浮?A”的SDF與常規(guī)光柵圖像相比:

正如我之前提到的,SDF S的??最大好處是能夠從低分辨率SDF中呈現(xiàn)高分辨率的形狀。這意味著您可以創(chuàng)建16pt字體SDF,并將文本擴展到100分或更多,而不會丟失太多。

SDF S擅長縮放,因為您幾乎可以通過雙線性插值完美地重建距離,這是一種奇特的方式,說我們可以在兩個點之間獲得值。在這種情況下,在常規(guī)位圖字體上兩個像素之間的雙線性插值使我們具有內(nèi)在的顏色,從而導(dǎo)致線性模糊。

在SDF上,兩個像素之間的雙線性插值提供了與最近邊緣的內(nèi)在距離之間的距離。由于這兩個像素距離與一開始相似,因此結(jié)果值不會丟失有關(guān)字形的太多信息。這也意味著SDF越大,丟失的信息就越準(zhǔn)確和較少。

但是,此過程帶來了警告。如果像素之間的速率變化不是線性的(例如在尖角的情況下),雙線性插值會產(chǎn)生不準(zhǔn)確的值,從而在縮放SDF縮放量比其原始大小時會導(dǎo)致彎曲或圓角。

除了撞擊紋理方面,唯一真正的解決方案是使用多通道SDF S,這是我們將在下一節(jié)中介紹的。

如果您想深入了解SDF S背后的科學(xué),請查看Chris Green的主人論文(PDF)。

優(yōu)勢

  • 即使旋轉(zhuǎn),縮放或轉(zhuǎn)換時,它們也保持酥脆。
  • 它們是動態(tài)文本的理想選擇。
  • 它們提供了良好的尺寸比率。單個紋理可用于渲染微小和巨大的字體尺寸,而不會失去太多質(zhì)量。
  • 他們的頂點計數(shù)低,每個字形僅四個頂點。
  • 抗質(zhì)量很便宜,就像在alpha測試中制作邊界,掉落陰影和各種效果一樣。
  • 它們比MSDF S?。ㄎ覀儠晕⒖吹剑?/li>

缺點

  • 當(dāng)對紋理進(jìn)行采樣時,可以導(dǎo)致圓角或碎裂的角落。 (同樣,我們將看到MSDF S可以預(yù)防這一點。)
  • 它們的小字體大小無效。
  • 它們只能與單色字形一起使用。

多通道簽名的距離字段

多通道簽名的距離字段(MSDF)字體有點像SDF S上有點張開,并且是一種相當(dāng)最近的變化,它能夠使用所有三個顏色通道,能夠產(chǎn)生接近完美的尖角。一開始,他們確實看起來很震驚,但不要讓您脫穎而出,因為它們易于使用,而不是看起來。

使用所有三個顏色通道確實會導(dǎo)致較重的圖像,但這就是使MSDF的質(zhì)量與空間比的比例要比常規(guī)SDF s好得多。以下圖像顯示了已擴展到50px的字體的SDF和MSDF之間的差異。

像普通的SDF一樣,MSDF將距離與最近的邊緣保持距離,但只要發(fā)現(xiàn)一個尖銳的角落就會更改顏色通道。我們通過繪制兩個顏色通道或更多同意的位置來獲得形狀。盡管涉及更多的技術(shù)。查看此MSDF發(fā)電機的讀書文件,以進(jìn)行更徹底的解釋。

優(yōu)勢

  • 它們比SDF S支持更高的質(zhì)量和空間比。通常是更好的選擇。
  • 他們在縮放時保持鋒利的角落。

缺點

  • 它們可能包含小文物,但可以通過增加字形的質(zhì)地大小來避免這種偽像。
  • 他們需要在運行時過濾三個值的中位數(shù),這有點貴。
  • 它們僅與單色字形兼容。

如何創(chuàng)建MSDF字體

創(chuàng)建MSDF字體的最快方法是使用MSDF-BMFONT-WEB工具。它具有大多數(shù)相關(guān)的自定義選項,并且可以在幾秒鐘內(nèi)完成工作。另外,有許多Google字體已經(jīng)由A-Frame的人們轉(zhuǎn)換為MSDF。

如果您還希望生成SDF S或您的字體,則需要一些有問題的字形,需要進(jìn)行一些特殊的調(diào)整。 MSDF-BMFONT-XML CLI為您提供了多種選擇,而不會使事情過于混亂。讓我們看一下如何使用它。

首先,您需要從NPM全球安裝它:

 NPM安裝MSDF-BMFONT-XML -G

接下來,給它一個.ttf字體文件,其中包括您的選項:

 msdf-bmfont ./open-sans-black.ttf-輸出型json-font-size 76- texture-size 512,512

這些選項值得一提。雖然MSDF-BMFONT-XML提供了很多選擇來調(diào)整字體的選項,但實際上,您可能只需要正確地生成MSDF:

  • -t - field-type <msdf>:MSDF-BMFONT-XML默認(rèn)情況下生成MSDFS Glyph Atlases。如果要生成SDF,則需要使用-t SDF來指定它。</msdf>
  • -f 或-ASTPUT-TYPE :MSDF-BMFONT-XML生成一個XML字體文件,您必須在運行時將其解析為JSON。您可以通過立即導(dǎo)出JSON來避免這種解析步驟。
  • -s, - font-size :如果字體大小超過,可能會出現(xiàn)某些文物和瑕疵。大部分時間都會碰到字體尺寸。此示例顯示了字母“ M”中的一個小缺陷。
  • -m 或-Texture-size :如果您的所有角色都不適合相同的紋理,則創(chuàng)建了第二個紋理以適合它們。除非您試圖利用多頁面的Glyph Atlas,我建議您增加紋理大小,以避免使用一個文本以避免額外的工作。

還有其他工具可以幫助生成MSDF和SDF字體:

  • MSDF-BMFONT-WEB:一種可以快速而輕松地創(chuàng)建MSDFS(但不是SDF S)的網(wǎng)絡(luò)工具
  • MSDF-BMFONT:使用開羅和節(jié)點canvas的節(jié)點工具
  • MSDFGEN:所有其他MSDF工具均基于的原始命令行工具
  • Hiero:一種生成位圖和SDF字體的工具

如何使用SDF和MSDF字體

由于SDF和MSDF字體也是字形圖譜,因此我們可以像位圖字體一樣使用三個BMFONT-TEXT。唯一的區(qū)別是,我們必須用碎片著色器來獲取距離字段的雕文。

這是對SDF字體的工作方式。由于我們的距離字段的值大于字形以外的0.5,而在字形內(nèi)的值小于0.5,因此我們需要在每個像素上的碎片著色器中測試alpha,以確保我們只渲染距離小于0.5的像素,僅渲染Glyphs的內(nèi)部。

 const fragmentshader =`

  均勻的VEC3顏色;
  均勻的采樣器2D地圖;
  變化的vec2 vuv;
  
  void main(){
    vec4 texcolor = texture2d(Map,vuv);
    //僅渲染字形的內(nèi)部。
    float alpha =步驟(0.5,texcolor.a);

    gl_fragcolor = vec4(顏色,alpha);
    如果(gl_fragcolor.a <p>同樣,我們可以從三個bmfont-text中導(dǎo)入字體,該字體帶有抗精神經(jīng)氣。然后,我們可以將其直接在生皮材料上使用:</p><pre rel="JavaScript">令SDFSHADER = require('三bmfont-Text/Shaders/sdf');
令材料=新的三。
  地圖:紋理,
  透明:是的,
  顏色:0x000000
}));

MSDF字體有些不同。他們通過兩個顏色通道的交集重新創(chuàng)建尖角。兩個或兩個以上的顏色渠道必須同意。在進(jìn)行任何Alpha發(fā)短信之前,我們需要獲得三個顏色頻道的中位數(shù),以查看他們同意的位置:

 const fragmentshader =`

  均勻的VEC3顏色;
  均勻的采樣器2D地圖;
  變化的vec2 vuv;

  浮點中位數(shù)(浮動R,浮子G,float b){
    返回最大(最?。≧,G),Min(Max(R,G),B));
  }
  
  void main(){
    vec4 texcolor = texture2d(Map,vuv);
    //僅渲染字形的內(nèi)部。
    float sigdist =中值(Texcolor.r,texcolor.g,texcolor.b)-0.5;
    float alpha =步驟(0.5,sigdist);
    gl_fragcolor = vec4(顏色,alpha);
    如果(gl_fragcolor.a <p>同樣,我們還可以使用其MSDFSHADER從三個BMFONT-TEXT導(dǎo)入,該文本還帶有抗逆轉(zhuǎn)錄和開箱即用。然后,我們可以將其直接在生皮材料上使用:</p><pre rel="JavaScript">令MSDFSHADER = require('trix-bmfont-text/Shaders/msdf');
令材料=新的三。
  地圖:紋理,
  透明:是的,
  顏色:0x000000
}));

演示:星球大戰(zhàn)介紹

星球大戰(zhàn)繪制介紹是MSDF和SDF字體很好地工作的一個很好的例子,因為效果需要多種尺寸。我們可以使用一個MSDF,文字總是看起來很清晰!雖然,可悲的是,三bm-font尚未支持合理的文本。應(yīng)用左派辯護(hù)將使表現(xiàn)更加平衡。

對于淺劍效果,我正在將平面大小的無形平面播放到相同大小的帆布上,并通過將場景位置映射到紋理坐標(biāo)來通過畫布進(jìn)行采樣。

獎勵提示:生成帶有高度圖的3D文本

除了字體幾何形狀外,我們涵蓋的所有技術(shù)都會在單個四邊形上生成字符串或字形。如果您想從平坦的紋理中構(gòu)建3D幾何形狀,則最好的選擇是使用高度圖。

高度圖是一種使用紋理撞擊幾何高度的技術(shù)。這通常用于在游戲中生成山脈,但事實證明這也是有用的渲染文本。

唯一的警告是,您需要很多面孔才能使文本看起來光滑。

進(jìn)一步閱讀

不同的情況要求不同的技術(shù)。我們在這里看到的是一顆銀色子彈,它們都有自己的優(yōu)勢和缺點。

那里有很多工具和庫可以幫助您充分利用WebGL文本,其中大部分實際上源自外部WebGL。如果您想繼續(xù)學(xué)習(xí),我強烈建議您超越WebGL并查看其中一些鏈接:

  • 在三js中加載字體的幾種方法
  • 關(guān)于文本重型Spotify運動的案例研究
  • 關(guān)于MSDF的有趣對話
  • 更多字體渲染技術(shù)
  • GPU上渲染矢量藝術(shù)(字形)
  • freetype如何進(jìn)行文本渲染
  • 用位圖字體創(chuàng)建有趣的效果

以上是使用WebGL渲染文本的技術(shù)的詳細(xì)內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機

Video Face Swap

Video Face Swap

使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

什么是'渲染障礙CSS”? 什么是'渲染障礙CSS”? Jun 24, 2025 am 12:42 AM

CSS會阻塞頁面渲染是因為瀏覽器默認(rèn)將內(nèi)聯(lián)和外部CSS視為關(guān)鍵資源,尤其是使用引入的樣式表、頭部大量內(nèi)聯(lián)CSS以及未優(yōu)化的媒體查詢樣式。1.提取關(guān)鍵CSS并內(nèi)嵌至HTML;2.延遲加載非關(guān)鍵CSS通過JavaScript;3.使用media屬性優(yōu)化加載如打印樣式;4.壓縮合并CSS減少請求。建議使用工具提取關(guān)鍵CSS,結(jié)合rel="preload"異步加載,合理使用media延遲加載,避免過度拆分與復(fù)雜腳本控制。

外部與內(nèi)部CSS:最好的方法是什么? 外部與內(nèi)部CSS:最好的方法是什么? Jun 20, 2025 am 12:45 AM

thebestapphachforcssdepprodsontheproject'sspefificneeds.forlargerprojects,externalcsSissBetterDuoSmaintoMaintainability andReusability; forsMallerProjectsorsingle-pageApplications,InternaltCsmightBemoresobleable.InternalCsmightBemorese.it.it'sclucialtobalancepopryseceneceenceprodrenceprodrenceNeed

我的CSS必須在較低的情況下嗎? 我的CSS必須在較低的情況下嗎? Jun 19, 2025 am 12:29 AM

否,CSSDOESNOTHAVETOBEINLOWERCASE.CHOMENDENS,使用flowercaseisrecommondendendending:1)一致性和可讀性,2)避免使用促進(jìn)性技術(shù),3)潛在的Performent FormanceBenefits,以及4)RightCollaboraboraboraboraboraboraboraboraboraboraboraboraboraboraboraboraborationWithInteams。

CSS案例靈敏度:了解重要的 CSS案例靈敏度:了解重要的 Jun 20, 2025 am 12:09 AM

cssismostlycaseminemintiment,buturlsandfontfamilynamesarecase敏感。1)屬性和valueslikeColor:紅色; prenotcase-sensive.2)urlsmustmustmatchtheserver'server'scase,例如

什么是AutoPrefixer,它如何工作? 什么是AutoPrefixer,它如何工作? Jul 02, 2025 am 01:15 AM

Autoprefixer是一個根據(jù)目標(biāo)瀏覽器范圍自動為CSS屬性添加廠商前綴的工具。1.它解決了手動維護(hù)前綴易出錯的問題;2.通過PostCSS插件形式工作,解析CSS、分析需加前綴的屬性、依配置生成代碼;3.使用步驟包括安裝插件、設(shè)置browserslist、在構(gòu)建流程中啟用;4.注意事項有不手動加前綴、保持配置更新、非所有屬性都加前綴、建議配合預(yù)處理器使用。

什么是CSS計數(shù)器? 什么是CSS計數(shù)器? Jun 19, 2025 am 12:34 AM

csscounterscanautomationallymentermentermentections和lists.1)usecounter-ensettoInitializize,反插入式發(fā)芽,andcounter()orcounters()

CSS:何時重要(何時不)? CSS:何時重要(何時不)? Jun 19, 2025 am 12:27 AM

在CSS中,選擇器和屬性名不區(qū)分大小寫,而值、命名顏色、URL和自定義屬性則區(qū)分大小寫。1.選擇器和屬性名不區(qū)分大小寫,例如background-color和Background-Color相同。2.值中的十六進(jìn)制顏色不區(qū)分大小寫,但命名顏色區(qū)分大小寫,如red有效而Red無效。3.URL區(qū)分大小寫,可能導(dǎo)致文件加載問題。4.自定義屬性(變量)區(qū)分大小寫,使用時需注意大小寫一致。

CSS中的情況敏感性:選擇器,屬性和值所解釋的 CSS中的情況敏感性:選擇器,屬性和值所解釋的 Jun 19, 2025 am 12:38 AM

cssselectorsand and propertynamesarecase-insimentimentiment.1)selectorSlike like'div'div'div'div'and'and'and'And'Andiv'areequivalent.2)propertioessuchas'backusuchas'backusuchas'backusuchas'backusuchas'backer'back-and'background and backorgook crolor'backorground-artreateateDthesementhesame.3)

See all articles