MME 编写入门(一)· 渲染流水线、认识 HLSL

本文由 简悦 SimpRead 转码, 原文地址 www.bilibili.com

作者:小林呓

关于 MME 的编写 K 佬写了很好的教程,一共三集,每集都比较短,还有一些专栏。

关于 MME 的编写 K 佬写了很好的教程,一共三集,每集都比较短,还有一些专栏。

https://www.bilibili.com/video/BV17W411n7g5

作为 MME 的入门实际上还是有一定难度的,因为有关渲染的编程的背后,不仅包含一大堆的数学原理,还包含很多方面,需要相当多的知识储备。而我本人非计算机相关专业,仅是个人自学,写这篇文章的目的,也就是做个总结的笔记吧。

  • DirectX 9 与 HLSL(High Level Shading Language)

    MMD 基于 DirectX 9 开发,对于渲染的自由度非常低。 MME 是在此基础上对于 MMD 所进行的二次开发,并以插件的形式存在。

    为了使用 DirectX 9 的特性,用户必须学习 HLSL,即高级着色器语言。这是一门由微软开发的、与 C 语言语法颇为相似的着色器语言。 HLSL 有多个版本,具体取决于可用的功能,但 MME 支持 HLSL 直到 Shader Model 3.0(因为 MMD 在 DirectX 9.0c 上运行)。

    DX9 这个版本目前来说算是比较落后吧(2023 年),没有几何着色器,也没有计算着色器,没有曲面细分等等。要学习的内容较少,所以相对来说算是比较容易。

  • HLSL 的基本语法

    HLSL 的基本语法与 C/C++ 相同,但它具有适合编写图形程序的专用向量、矩阵类型和函数。 一些数学函数类似于 C/C++ 标准库中的函数。

  • 编写工具

    关于 MME 的 fx 文件编写,可以用记事本(但不推荐),可以使用 notepad++,但是想要支持代码高亮和提示功能,需要自行配置一下语言库。也可以使用 Visual Studio Code 或者 2019 等等。fx 不能自行运行,它是从 DirectX 调用的。FX 本身并不控制绘图过程,而是主机程序(即 MME)的作用命令 “做这个” 和“画这个”。

    (另外的一些:可以使用 NVIDIA FX Composer 辅助学习。FX Composer 是一个免费的工具,可以直接从 NVIDIA 的官方开发者中心下载。FX Composer 的最新版本是 2.5,官方已经不在提供更新。总的来说,这是一个非常**过时**的工具了……

    作者在原书中给出的解释:NVIDIA FX Composer 已经不再提供更新开发支持,并且开始变得有些老旧。它仅支持 DirectX 9 和 DirectX 10,并不支持 DirectX 11。同样,AMD 提供的 shader 编写工具——RenderMonkey,也不再支持 DirectX 11,对这个工具的开发也已经停止。)

    (题外话,记不清是哪一个作者,似乎是针金,他好像使用 RenderMonkey 来写 fx 文件,因为某一次某一个 fx 文件里我看到过 RenderMonkey 的一些相关)

    注意:FX Composer 中编写的效果文件并**不能直接在 MME 中实现**。只能说可以用来辅助学习。

    HLSL 的教学视频,教程已经非常老旧,但是里面的**数学原理**和过程依旧值得学习和参考,通过这个可以对整个流程有很清晰的认知。

    https://www.bilibili.com/video/BV1pZ4y1k7dr

    当然,这一部分只是选择性地了解。

  • 渲染流水线

    渲染管线也称渲染流水线,可以将其理解为一个流程。管线的主要功能是在给定一个虚拟相机、 三维物体、光源等等的情况下生成或渲染二维图像。这个工作时 CPU 和 GPU 共同完成的。

    渲染流程主要分为几个大的阶段:应用阶段,几何阶段,光栅化阶段,像素处理阶段。

    这些阶段中的每个阶段本身也可以是一条管线。管线的各阶段是并行执行的,每个阶段都取决于上一阶段的结果。理想情况下,将非管线系统划分为 n 个管线阶段,可以使速度提高 n 倍。因此提升性能是使用管线的主要原因。

应用阶段(application)

渲染流水线的起点是 CPU,即应用阶段。这个阶段是我们自己主导的,通常由 CPU 负责实现。

需要准备场景的基本数据,渲染的物体、光源的数据、摄像机的数据、一些全局性的数据,准备好这些需要渲染的场景对象之后,我们还要做一些优化,比如算法上的加速,或者说剔除。接着设置渲染状态,准备渲染参数,绘制的顺序。

设置好渲染状态和参数以后,CPU 把渲染数据输出到显存去交给 GPU 处理。

几何阶段(geometry processing)

几何处理阶段(geometry processing),此阶段会处理变换,投影以及所有其他类型的几何处理。这一阶段在 CPU 上进行。可以理解为 GPU 的工作环节。另外,此阶段会计算所需要绘制的内容,并判断应如何绘制以及应在何处绘制。

几何阶段进一步分为以下功能阶段(functional stages):顶点着色(vertex shading),投影(projection),裁剪(clipping)和屏幕映射(screen mapping)

光栅化阶段(rasterization)

光栅化阶段(rasterization)通常会依次将三个顶点输入,形成三角形,然后找到该三角形内所有需要计算的像素,将它们发送到下一个阶段。(光栅化阶段好像是不可编程,但可配置的,在此并不多赘述)关于光栅化阶段,我们以后可能要去解决锯齿相关的问题。

像素处理阶段(pixel processing)

像素处理阶段的目标是计算每个可见图元中每个像素的颜色与隐藏面剔除。

怎么感觉写了很长时间了却还没写到入门,本篇若是再塞入语法和范例恐怕就会变得太长了…… 所以,本文都是些大的概述,算是理论基础的小铺垫吧。在后续的几篇,我们细化深入了解。我们需要了解更多详细的过程,才能去写代码。

我们实际上去编写的,是几何阶段的**顶点着色器**和光栅化阶段后的**像素着色器**。(像素着色器也可以成为片段着色器,有些地方会翻译为片段)

效果文件的结构,即顶点着色器、像素着色器、绘制定义

  • 顶点着色器:顶点着色器计算对象每个顶点的屏幕坐标。顶点着色器基于每个顶点执行,输入是对象的顶点信息(通过骨骼变形转换后),输出是传递给顶点屏幕坐标 + 像素着色器的顶点信息。

  • 像素着色器:像素着色器计算屏幕上展开的对象的每个像素的颜色。像素着色器基于每个像素运行,其中输入是从顶点着色器传递的顶点信息,输出是像素的颜色信息。

本文至此仅是一些简单认识,作为开篇,并不急于直接入手写代码,主要是树立大的框架,列举了一些可供学习的文章地址。另外,推荐观看图形学 GAMES101 的课程,闫令琪老师的课,可以在哔哩哔哩上免费看。

附上舞力介入和光束人 p 的文章地址和另一篇 mme 介绍博客,作为 mme 的学习非常有帮助

推荐一个 hlsl 的基础学习,虽然文章作者是在 ue4 中实现的,但其逻辑运算等实际上是相通的

还有就是微软官方的 HLSL 学习文档,我这里放的是中文版的地址,机器翻译有很多地方不对,所以建议还是看英文版的。

英文版

ビームマン P 和 MME

実は著者は、MME に触れるまで HLSL に関してほとんど素人でした。ニコニコ動画で MME を使った動画を見て、「これを使えばカッコいいミサイルやビームが出せるのでは!?」と手を出したのがきっかけです。

好きこそ物の上手なれ、とことわざにもあるように、何事も嫌々では上達は望めません。本来 MMD は動画を書き出すことを目的としたソフトなので、せっかく使うのならば動画を書き出して動画サイトに投稿してみましょう。新しい楽しみが発見できるかもしれません。

实际上,作者在接触 MME 之前几乎是 HLSL 的业余爱好者。 当我在 Nico Nico 上看到使用 MME 的视频时,我想,“也许我可以用它来生产很酷的导弹和光束!?

俗话说,喜欢就擅长,什么都做不了就不能指望进步。 最初,MMD 是用于导出视频的软件,因此如果您想使用它,请导出视频并将其发布在视频网站上。 您可能会发现新的乐趣。

参考

评论