MME編寫入門(一)·渲染流水線、認(rèn)識HLSL
關(guān)于MME的編寫K佬寫了很好的教程,一共三集,每集都比較短,還有一些專欄。
https://www.bilibili.com/video/BV17W411n7g5
作為MME的入門實(shí)際上還是有一定難度的,因?yàn)橛嘘P(guān)渲染的編程的背后,不僅包含一大堆的數(shù)學(xué)原理,還包含很多方面,需要相當(dāng)多的知識儲(chǔ)備。而我本人非計(jì)算機(jī)相關(guān)專業(yè),僅是個(gè)人自學(xué),寫這篇文章的目的,也就是做個(gè)總結(jié)的筆記吧。
?DirectX 9與HLSL(High Level Shading Language)
MMD基于 DirectX 9開發(fā),對于渲染的自由度非常低。 MME是在此基礎(chǔ)上對于 MMD所進(jìn)行的二次開發(fā),并以插件的形式存在。
為了使用DirectX 9的特性,用戶必須學(xué)習(xí) HLSL,即高級著色器語言。這是一門由微軟開發(fā)的、與 C語言語法頗為相似的著色器語言。 HLSL有多個(gè)版本,具體取決于可用的功能,但MME支持HLSL直到Shader Model 3.0(因?yàn)镸MD在DirectX 9.0c上運(yùn)行)。
DX9這個(gè)版本目前來說算是比較落后吧(2023年),沒有幾何著色器,也沒有計(jì)算著色器,沒有曲面細(xì)分等等。要學(xué)習(xí)的內(nèi)容較少,所以相對來說算是比較容易。
HLSL 的基本語法
HLSL 的基本語法與 C/C++ 相同,但它具有適合編寫圖形程序的專用向量、矩陣類型和函數(shù)。 一些數(shù)學(xué)函數(shù)類似于 C/C++ 標(biāo)準(zhǔn)庫中的函數(shù)。
編寫工具
關(guān)于MME的fx文件編寫,可以用記事本(但不推薦),可以使用notepad++,但是想要支持代碼高亮和提示功能,需要自行配置一下語言庫。也可以使用Visual Studio Code或者2019等等。fx不能自行運(yùn)行,它是從DirectX調(diào)用的。FX本身并不控制繪圖過程,而是主機(jī)程序(即MME)的作用命令“做這個(gè)”和“畫這個(gè)”。
(另外的一些:可以使用NVIDIA FX Composer輔助學(xué)習(xí)。FX Composer是一個(gè)免費(fèi)的工具,可以直接從NVIDIA的官方開發(fā)者中心下載。FX Composer的最新版本是2.5,官方已經(jīng)不在提供更新??偟膩碚f,這是一個(gè)非常過時(shí)的工具了……
作者在原書中給出的解釋:NVIDIA FX Composer已經(jīng)不再提供更新開發(fā)支持,并且開始變得有些老舊。它僅支持DirectX 9和DirectX 10,并不支持DirectX 11。同樣,AMD提供的shader編寫工具——RenderMonkey,也不再支持DirectX 11,對這個(gè)工具的開發(fā)也已經(jīng)停止。)
(題外話,記不清是哪一個(gè)作者,似乎是針金,他好像使用RenderMonkey來寫fx文件,因?yàn)槟骋淮文骋粋€(gè)fx文件里我看到過RenderMonkey的一些相關(guān))
注意:FX Composer中編寫的效果文件并不能直接在MME中實(shí)現(xiàn)。只能說可以用來輔助學(xué)習(xí)。
HLSL的教學(xué)視頻,教程已經(jīng)非常老舊,但是里面的數(shù)學(xué)原理和過程依舊值得學(xué)習(xí)和參考,通過這個(gè)可以對整個(gè)流程有很清晰的認(rèn)知。
https://www.bilibili.com/video/BV1pZ4y1k7dr
當(dāng)然,這一部分只是選擇性地了解。

渲染流水線
渲染管線也稱渲染流水線,可以將其理解為一個(gè)流程。管線的主要功能是在給定一個(gè)虛擬相機(jī)、 三維物體、光源等等的情況下生成或渲染二維圖像。這個(gè)工作時(shí)CPU和GPU共同完成的。
渲染流程主要分為幾個(gè)大的階段:應(yīng)用階段,幾何階段,光柵化階段,像素處理階段。
? ?這些階段中的每個(gè)階段本身也可以是一條管線。管線的各階段是并行執(zhí)行的,每個(gè)階段都取決于上一階段的結(jié)果。理想情況下,將非管線系統(tǒng)劃分為 n 個(gè)管線階段,可以使速度提高 n 倍。因此提升性能是使用管線的主要原因。

應(yīng)用階段(application)
渲染流水線的起點(diǎn)是CPU,即應(yīng)用階段。這個(gè)階段是我們自己主導(dǎo)的,通常由CPU負(fù)責(zé)實(shí)現(xiàn)。
需要準(zhǔn)備場景的基本數(shù)據(jù),渲染的物體、光源的數(shù)據(jù)、攝像機(jī)的數(shù)據(jù)、一些全局性的數(shù)據(jù),準(zhǔn)備好這些需要渲染的場景對象之后,我們還要做一些優(yōu)化,比如算法上的加速,或者說剔除。接著設(shè)置渲染狀態(tài),準(zhǔn)備渲染參數(shù),繪制的順序。
設(shè)置好渲染狀態(tài)和參數(shù)以后,CPU把渲染數(shù)據(jù)輸出到顯存去交給GPU處理。
幾何階段(geometry processing)
幾何處理階段(geometry processing),此階段會(huì)處理變換,投影以及所有其他類型的幾何處理。這一階段在CPU上進(jìn)行??梢岳斫鉃镚PU的工作環(huán)節(jié)。另外,此階段會(huì)計(jì)算所需要繪制的內(nèi)容,并判斷應(yīng)如何繪制以及應(yīng)在何處繪制。
幾何階段進(jìn)一步分為以下功能階段(functional stages):頂點(diǎn)著色(vertex shading),投影(projection),裁剪(clipping)和屏幕映射(screen mapping)

光柵化階段(rasterization)
光柵化階段(rasterization)通常會(huì)依次將三個(gè)頂點(diǎn)輸入,形成三角形,然后找到該三角形內(nèi)所有需要計(jì)算的像素,將它們發(fā)送到下一個(gè)階段。(光柵化階段好像是不可編程,但可配置的,在此并不多贅述)關(guān)于光柵化階段,我們以后可能要去解決鋸齒相關(guān)的問題。
像素處理階段(pixel processing)
像素處理階段的目標(biāo)是計(jì)算每個(gè)可見圖元中每個(gè)像素的顏色與隱藏面剔除。

怎么感覺寫了很長時(shí)間了卻還沒寫到入門,本篇若是再塞入語法和范例恐怕就會(huì)變得太長了……所以,本文都是些大的概述,算是理論基礎(chǔ)的小鋪墊吧。在后續(xù)的幾篇,我們細(xì)化深入了解。我們需要了解更多詳細(xì)的過程,才能去寫代碼。
我們實(shí)際上去編寫的,是幾何階段的頂點(diǎn)著色器和光柵化階段后的像素著色器。(像素著色器也可以成為片段著色器,有些地方會(huì)翻譯為片段)


頂點(diǎn)著色器:頂點(diǎn)著色器計(jì)算對象每個(gè)頂點(diǎn)的屏幕坐標(biāo)。頂點(diǎn)著色器基于每個(gè)頂點(diǎn)執(zhí)行,輸入是對象的頂點(diǎn)信息(通過骨骼變形轉(zhuǎn)換后),輸出是傳遞給頂點(diǎn)屏幕坐標(biāo) + 像素著色器的頂點(diǎn)信息。
像素著色器:像素著色器計(jì)算屏幕上展開的對象的每個(gè)像素的顏色。像素著色器基于每個(gè)像素運(yùn)行,其中輸入是從頂點(diǎn)著色器傳遞的頂點(diǎn)信息,輸出是像素的顏色信息。

本文至此僅是一些簡單認(rèn)識,作為開篇,并不急于直接入手寫代碼,主要是樹立大的框架,列舉了一些可供學(xué)習(xí)的文章地址。另外,推薦觀看圖形學(xué)GAMES101的課程,閆令琪老師的課,可以在嗶哩嗶哩上免費(fèi)看。
附上舞力介入和光束人p的文章地址和另一篇mme介紹博客,作為mme的學(xué)習(xí)非常有幫助
MikuMikuEffectで學(xué)ぶHLSL入門(日文,需注冊才能看)
https://codezine.jp/article/corner/426
mme初級介紹(日文)
https://higeninjin.blog.fc2.com/blog-entry-5.html
推薦一個(gè)hlsl的基礎(chǔ)學(xué)習(xí),雖然文章作者是在ue4中實(shí)現(xiàn)的,但其邏輯運(yùn)算等實(shí)際上是相通的
HLSL語言基礎(chǔ)? https://zhuanlan.zhihu.com/p/52845899
還有就是微軟官方的HLSL學(xué)習(xí)文檔,我這里放的是中文版的地址,機(jī)器翻譯有很多地方不對,所以建議還是看英文版的。
https://learn.microsoft.com/zh-cn/windows/win32/direct3dhlsl/dx-graphics-hlsl?redirectedfrom=MSDN
英文版
https://learn.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-pguide
ビームマンP和MME
実は著者は、MMEに觸れるまでHLSLに関してほとんど素人でした。ニコニコ動(dòng)畫でMMEを使った動(dòng)畫を見て、「これを使えばカッコいいミサイルやビームが出せるのでは???」と手を出したのがきっかけです。
好きこそ物の上手なれ、とことわざにもあるように、何事も嫌々では上達(dá)は望めません。本來MMDは動(dòng)畫を書き出すことを目的としたソフトなので、せっかく使うのならば動(dòng)畫を書き出して動(dòng)畫サイトに投稿してみましょう。新しい楽しみが発見できるかもしれません。
實(shí)際上,作者在接觸MME之前幾乎是HLSL的業(yè)余愛好者。 當(dāng)我在Nico Nico 上看到使用MME的視頻時(shí),我想,“也許我可以用它來生產(chǎn)很酷的導(dǎo)彈和光束???
俗話說,喜歡就擅長,什么都做不了就不能指望進(jìn)步。 最初,MMD是用于導(dǎo)出視頻的軟件,因此如果您想使用它,請導(dǎo)出視頻并將其發(fā)布在視頻網(wǎng)站上。 您可能會(huì)發(fā)現(xiàn)新的樂趣。
參考
MME中文參考手冊? ?譯者? 不吃魚的喵醬
【中文字幕】HLSL著色器入門? https://www.bilibili.com/video/BV1pZ4y1k7dr
實(shí)時(shí)渲染(第四版)Real-Time Rendering (Fourth Edition)第2章?圖形渲染管線https://blog.csdn.net/qq_27534999/article/details/103148234
【DirectX11】第三篇 編寫Shader?——還是先了解下工具吧https://blog.csdn.net/xueyedie1234/article/details/51354458
TA成長之路?https://www.yuque.com/u12120868/md8ze7/ovoxxl
HLSL參考 https://docs.microsoft.com/zh-cn/windows/win32/direct3dhlsl/dx-graphics-hlsl-reference
從零開始學(xué)習(xí)MME的HLSL編程(1)https://www.bilibili.com/read/cv263176
關(guān)于MMD的各種光照的基礎(chǔ)原理? https://www.bilibili.com/read/cv308272