Notifications
Article
[MMD]MME Effect官方开发手册中文版
Published a year ago
229
1
MME Effect
/*******************************************************************/
苍蓝星 2018.4.1 翻译
转载请注明出处
如有疏漏和翻译不当,请留言指正
bladesero@qq.com
/*******************************************************************/
MMEffect 参考
0.1.0.0 (2010/9/18) 初版
0.2.0.0 (2010/12/12) MME Ver0.20
・增加了OFFSCREENRENDERTARGET(译者注:后备缓冲渲染目标)的语法
・添加了可以通过CONTROLOBJECT语义获取的信息
・放宽了由CONTROLOBJECT语义引用的对象绘制顺序的限制
・添加了EGDGECOLOR的语法
・修复了VIEWPORTPIXELSIZE(译者注:视口像素尺寸)语义的错误描述
・部分日语更正
0.2.2.0 (2010/12/16) MME Ver0.22
・更改了如何在RENDERCOLORTARGET和OFFSCREENRENDERTARGET语义中指定Miplevels(译者注:Mipmaps纹理等级)
0.2.3.0 (2010/12/20) MME Ver0.23
・补充增加了CONTROLOBJECT的语义
0.2.4.0 (2011/02/09) MME Ver0.24
・”(Self)”被添加到可以为CONTROLOBJECT语义指定的特殊对象名称
・TEXTUREVALUEセマンティクスを追加
0.2.6.0 (2010/02/21) MME Ver0.26
・修正了关于Draw=Geometry的描述
0.2.7.0 (2011/05/22) MME Ver0.27
・添加了_INDEX语义
・增加了VertexCount和SubsetCount参数
・增加了opadd参数
・补充增加了TEXTUREVALUE的语义
0.2.8.0 (2012/03/26) MME Ver0.28
・CONTROLOBJECT语义描述的部分修正
0.3.0.0 (2012/09/19) MME Ver0.30
・OFFSCREENRENDERTARGET可以指定语义DefaultEffect
“Main_default”被添加为特殊效果名称
0.3.3.0 (2013/02/13) MME Ver0.33
・纹理材质添加了变形的语义(ADDINGTEXTURE等)
・它对应于PMX模型的子纹理(请参阅UseSphereMap,use_spheremap,use_subtexture)
・添加了MATERIALTOONTEXTURE语义
・增加了GROUNDSHADOWCOLOR语义
・添加MME_MIPMAP宏
○注意
・该参考解释了由MME Effect识别的语义和注释。
有关效果文件本身的参考信息,请参见下文。
效果文件格式 http://msdn.microsoft.com/ja-jp/library/bb173005(v=VS.85).aspx 英文版:https://msdn.microsoft.com/en-us/zn-ch/library/bb173005(v=VS.85).aspx
HLSL参考 http://msdn.microsoft.com/ja-jp/library/bb509638(v=VS.85).aspx 英文版:https://msdn.microsoft.com/zh-cn/library/bb509638(v=VS.85).aspx

・为了语义和注释规范,请参考NVIDIA的SAS脚本。
(译者注:以下页面已被移除,请访问百度快照:https://0x9.me/NiPWE)
http://developer.nvidia.com/object/using_sas.html
但是,这并不能保证FX Composer的效果文件可以正常工作。
**************************************************
1 Technique与Pass(译者注:渲染通道)
1.1 组成
效果文件有technique和pass的分层结构,如下所示。
/**********************************/
参数声明1
参数声明2
technique Tech1 {
pass Pass1 {
VertexShader = …
PixelShader = …
}
pass Pass2 {
VertexShader = …
PixelShader = …
}
}
technique Tech2 {
pass Pass1 {
VertexShader = …
PixelShader = …
}
pass Pass2 {
VertexShader = …
PixelShader = …
}
}
/**********************************/
一个technique由一个或多个pass组成。
一个Pass对应于一个渲染过程,
如果一个technique由多个pass组成,
这意味着该technique使用多Pass渲染。
在technique和pass中,可以使用注释。
注释通过在technique名称/pass名称之后加上“<”和“>”来描述,如下所示。
注释名称中不区分字母大小写。
/******************************************************/
technique Tech1 < string Subset = “1-6,8”; > {
pass Pass1 < string Script = “Draw=Buffer;”; > {
}
pass Pass2 {
}
}
/******************************************************/
technique和pass中也有称为脚本的特殊注释
它可以被指定。这将在§3中解释。
1.2 technique的注释
对于technique的注释,
描述绘制该technique的场景的条件。
对于这种情况,可以指定以下内容。
・对象的Subset(子集)编号(≒物体的material(材质)编号)
・绘制对象(对象本身/影子/轮廓/自我阴影的(Zplot)Z值图)
・绘图flag(标志)(使用texture(纹理)ON/OFF、使用sphereMap(球体映射贴图)ON/OFF、使用卡通渲染ON/OFF)
根据条件按照效果文件中写入的顺序进行验证,
如果使用条件与多种technique重叠,
前面在效果文件中描述的优先。(译者注:先进行上述的3种条件判断,再执行technique)
如果效果文件中不存在满足条件的technique,
则使用MMD标准着色器。
○注释
・string Subset
指定technique适用的Subset的编号。
在PMD模型的情况下,这对应于模型的材质编号。
当省略注释时,将应用到所有子集。

可以通过枚举用逗号分隔的数字来指定多个数字,如”0,3,5″。
另外,您可以通过用连字符连接数字来指定范围,例如”6-10″。
如果仅指定了范围的开始编号,例如”12-“,则所有后续编号都是目标对象。

  例: string Subset = “0-6,8”;
・string MMDPass
指定应用该technique的绘制目标。
指定下列一种。 该划分源自MMD的绘图程序。
  ”object” : 对象本身(自阴影OFF)
“zplot” : 用于自阴影的Z值图
“object_ss” : 对象本身(自阴影ON)
“shadow” : 影子(不是自阴影的简单阴影)
“edge” : 轮廓(仅限PMD格式)
  当注释被省略时,假定“object”被指定。
  例: string MMDPass = “object”;
・bool UseTexture
指定是否使用纹理。
如果该technique仅覆盖使用纹理的子集,请指定为true。
相反,对于不使用纹理的子集,请指定false。
  当注释被省略时,纹理的有无将被忽略。
  例: bool UseTexture = true;
・bool UseSphereMap
指定是否使用球体贴图。
如果该technique仅覆盖使用球体贴图的子集,请指定为true。
(包括在PMX模型中为球体模式指定了子纹理的情况)
相反,对于不使用球体贴图的子集,请指定false。
  当注释被省略时,球面图的有无将被忽略。
  例: bool UseSphereMap = false;
・bool UseToon
指定是否使用卡通渲染。
如果该technique以对象(= PMD模型)作为目标使用卡通渲染,则指定true。
相反,对于不使用卡通渲染的对象(=配件),请指定false。
  当注释被省略时,是否存在卡通渲染使用被忽略。
  例: bool UseToon = true;
○用法示例
//当自阴影为ON时,Tech1应用于子集0至6和子集8,
//tech2适用于子集的No.7和No.9。
//当自身阴影关闭时,将使用Tech 3。

technique Tech1 <
string MMDPass = “object_ss”;
string Subset = “0-6,8”;
> {
}
technique Tech2 <
string MMDPass = “object_ss”;
string Subset = “7,9-“;
> {
}
technique Tech3 <
string MMDPass = “object”;
> {
}
○补充
・排除无效的technique。
http://msdn.microsoft.com/ja-jp/library/bb206324(v=VS.85).aspx 英文版:https://msdn.microsoft.com/en-us/zn-ch/library/bb206324(v=VS.85).aspx
・使用除MMDPass=”object”,”object_ss”之外的其他技术,UseTexture,UseSphereMap,UseToon不能正常工作。
**************************************************
2 参数语义和注释
在下面的内容中,您可以在效果文件中将它用于MMEEffect,
解释参数语义和注释。
通过用语义和注释声明参数声明,
通过求解参数可以获得渲染所需的各种信息。
参数语义和注释描述如下。
类型名称 参数名称 : 语义名称 < 类型名称 注释1 = 值; 类型名称 注释2 = 值; … > ;
一些语义不指定注释。
语义名称和注释名称之间的字母大小写将被忽略。
2.1 几何变换
参考:http://msdn.microsoft.com/ja-jp/library/bb206269(v=VS.85).aspx 英文版:https://msdn.microsoft.com/en-us/zn-ch/library/bb206269(v=VS.85).aspx
●WORLD
●VIEW
●PROJECTION
●WORLDVIEW
●VIEWPROJECTION
●WORLDVIEWPROJECTION
 用于顶点坐标转换的变换矩阵。
坐标变换包括世界变换,视图变换和投影变换(投影变换)。

这六种语义分别是:
WORLD : 世界变换矩阵
VIEW : 视图变换矩阵
PROJECTION : 投影变换矩阵
WORLDVIEW : 世界变换矩阵×视图变换矩阵
VIEWPROJECTION : 视图变换矩阵x投影变换矩阵
WORLDVIEWPROJECTION : 世界变换矩阵×视图变换矩阵×投影变换矩阵
类型是float4x4。

通过在“WORLDINVERSE”之类的语义末尾添加“INVERSE”,可以获得每个矩阵的逆矩阵。
另外,如果将“TRANSPOSE”添加到“WORLDTRANSPOSE”的末尾,则会获得每个矩阵的转置矩阵。
要获得逆矩阵的转置矩阵,请在末尾添加“INVERSETRANSPOSE”。

○注释
・string Object (可选项)
在视图转换和投影转换中,指定将视点设置为何处。
可以指定”Camera”或”Light”。 默认值是”Camera”。
   要从相机的角度执行普通坐标转换,请指定”Camera” 。
以光源作为视点,在进行坐标转换时指定”Light”,例如自阴影的Z值图。
○使用示例
float4x4 WorldMatrix : WORLD ;
float4x4 WorldViewProjMatrix : WORLDVIEWPROJECTION ;
float4x4 LightViewMatrix : VIEW < string Object = “Light”; > ;
float4x4 WorldInvMatrix : WORLDINVERSE ;
float4x4 WorldViewProjTransMatrix : WORLDVIEWPROJECTIONTRANSPOSE ;
 ○补充
・当“对象”被指定为”Light”对象注释时获得的矩阵,
由于它与用于MMD的自阴影的矩阵相关联,
如果您在[显示(V)] – [自阴影显示(P)]中完全关闭自身阴影功能,
你将不能引用正确的值。
2.2 光和材质
参考:http://msdn.microsoft.com/ja-jp/library/bb174694(v=VS.85).aspx 英文版:https://msdn.microsoft.com/en-us/zn-ch/library/bb174694(v=VS.85).aspx
●DIFFUSE
●AMBIENT
●EMISSIVE
●SPECULAR
●SPECULARPOWER
●TOONCOLOR
●EDGECOLOR
●GROUNDSHADOWCOLOR
 3D对象的材质(材質)的颜色值或灯光的颜色值。
 这六种语义分别是:
DIFFUSE   : 漫反射颜色(漫射光)
AMBIENT   : 环境颜色(环境光)
EMISSIVE   : 自发光颜色(自发光)
SPECULAR   : 高光颜色(高光)
SPECULARPOWER   : 高光强度
TOONCOLOR   : Toon颜色
EDGECOLOR   : 轮廓线颜色
GROUNDSHADOWCOLOR : 地面阴影颜色
Toon颜色表示在PMD模型的卡通渲染中自阴影的颜色(具体来说,是Toon.bmp左下角的颜色)。

数据类型为除了”SPECULARPOWER”是float以外、其他的都是float3或者float4。
颜色的4种通道为(红色·绿色·蓝色·alpha(透明度))。float3类型的数据将忽略浮点型数。

○注释
・string Object (必须)
指定是否获取对象的灯光或材质颜色。
可以指定”Light”或”Geometry”。
   要获取对象的材质颜色,请指定”Geometry”。
要获得灯光,请指定”Light”。
“SPECULARPOWER”,”EMISSIVE”和”TOONCOLOR”不受灯光影响,所以无法指定”Light”。
○用法示例
float4 MaterialDiffuse : DIFFUSE < string Object = “Geometry”; >;
float3 MaterialAmbient : AMBIENT < string Object = “Geometry”; >;
float3 MaterialEmmisive : EMISSIVE < string Object = “Geometry”; >;
float3 MaterialSpecular : SPECULAR < string Object = “Geometry”; >;
float SpecularPower : SPECULARPOWER < string Object = “Geometry”; >;
float3 MaterialToon : TOONCOLOR;
float3 EdgeColor : EDGECOLOR;
float3 LightDiffuse : DIFFUSE < string Object = “Light”; >;
float3 LightAmbient : AMBIENT < string Object = “Light”; >;
float3 LightSpecular : SPECULAR < string Object = “Light”; >;
static float4 DiffuseColor = MaterialDiffuse * float4(LightDiffuse, 1.0f);
static float3 AmbientColor = MaterialAmbient * LightAmbient + MaterialEmmisive;
static float3 SpecularColor = MaterialSpecular * LightSpecular;
float4 GroundShadowColor : GROUNDSHADOWCOLOR;
 ○补充
・只有在MMDPass =”edge”的technique中才能正确获取轮廓颜色。
・仅在MMDPass =”阴影”的technique中才能正确获得地面阴影颜色。
・MMDPass=”zplot”或MMDPass=”edge”的technique中无法正确获取其他颜色值。
●POSITION
●DIRECTION
光线或相机在世界空间中的位置和方向。
类型是float3或float4。

○注释
・string Object (必须)
它指定了摄像机和要获得的光的坐标。
可以指定”Camera”或”Light”。
○使用示例
float3 LightDirection : DIRECTION < string Object = “Light”; >;
float3 CameraPosition : POSITION < string Object = “Camera”; >;
 ○补充
・由于MMD的光是方向光,
光线的位置坐标是与光线方向相反的无限远点。
●MATERIALTEXTURE
为材质设置的纹理。

 ○注释
○使用方法
texture ObjectTexture : MATERIALTEXTURE;
sampler ObjTexSampler = sampler_state
{
texture = <ObjectTexture>;
MINFILTER = LINEAR;
MAGFILTER = LINEAR;
MIPFILTER = LINEAR;
ADDRESSU = WRAP;
ADDRESSV = WRAP;
};
// tex2D(ObjTexSampler, float2(x,y)) 你可以看MSDN的参考内容

 ○补充
・在MMDPass=”zplot”或MMDPass=”edge”的technique中无法正确获取其他颜色值。
●MATERIALSPHEREMAP
材质中设置的球体贴图纹理。

 ○注释
○用法示例
texture ObjectSphereMap : MATERIALSPHEREMAP;
sampler ObjSphSampler = sampler_state
{
texture = <ObjectSphereMap>;
MINFILTER = LINEAR;
MAGFILTER = LINEAR;
MIPFILTER = LINEAR;
ADDRESSU = WRAP;
ADDRESSV = WRAP;
};
// tex2D(ObjSphSampler, float2(x,y)) 你可以看MSDN的参考内容

 ○补充
・在MMDPass=”zplot”或MMDPass=”edge”的technique中无法正确获取其他颜色值。
●MATERIALTOONTEXTURE
マテリアルに設定されている、トゥーンマップテクスチャ。

 ○アノテーション
なし
○使用例
texture ObjectToonTexture : MATERIALTOONTEXTURE;
sampler ObjToonSampler = sampler_state
{
texture = <ObjectSphereMap>;
MINFILTER = LINEAR;
MAGFILTER = LINEAR;
MIPFILTER = NONE;
ADDRESSU = CLAMP;
ADDRESSV = CLAMP;
};
// tex2D(ObjToonSampler, float2(x,y)) 你可以看MSDN的参考内容

 ○补充
・在MMDPass=”zplot”或MMDPass=”edge”的technique中无法正确获取其他颜色值。
・另外,对于附件(UseToon = false时),无法正确获取
・在PMD模型中,对于不使用Toon的材质,它们会有纯白色的纹理。
●ADDINGTEXTURE
●MULTIPLYINGTEXTURE
●ADDINGSPHERETEXTURE
●MULTIPLYINGSPHERETEXTURE
PMX材质中的加法和乘法值,可用于纹理和球体贴图。

 ○注释
○使用示例
float4 TextureAddValue : ADDINGTEXTURE;
float4 TextureMulValue : MULTIPLYINGTEXTURE;
float4 SphereAddValue : ADDINGSPHERETEXTURE;
float4 SphereMulValue : MULTIPLYINGSPHERETEXTURE;
 ○补充
・只有当MMDPass=”object_ss”时才能正确获得每个值。
・另外,在附件的情况下(当UseToon = false时),加法值全部为0,乘法值全部为1。
2.3 Screen信息
●VIEWPORTPIXELSIZE
 渲染目标的屏幕大小。
类型是float2。单位是像素。
※此值是指MMD屏幕或屏幕外渲染目标的大小。
即使渲染目标随着脚本的“RenderColorTarget”命令而改变,
该值不会改变。

○注释

○使用示例
float2 ScreenSize : VIEWPORTPIXELSIZE;
 ○补充
・在内部,我们引用Viewport的.Width和.Height值。
2.4 时间
●TIME
●ELAPSEDTIME
 时间信息。
类型是float。 单位是秒。
“TIME”表示从第0帧开始的播放时间。
例如,第0帧为0.0(秒),第45帧为1.5(秒)。

“ELAPSEDTIME”代表最后一次绘制所用的时间。
例如,当以60fps输出AVI时,“ELAPSEDTIME”的值在1/60秒处恒定。

○注释
・bool SyncInEditMode (可选项)
即使MMD处于编辑模式,它也会指定它是否与帧链接。
指定true或false。 默认值是false。

当MMD处于编辑模式时,由于帧的播放停止,
如果TIME的值总是与帧时间相关联,
在编辑模式下,使用此值的动画也将停止。

如果此注释指定为false,
在编辑模式下,系统时间用于TIME和ELAPSEDTIME值,而不是帧时间。
这可以防止动画在编辑模式下停止。

○使用示例
float ftime : TIME <bool SyncInEditMode=true;>;
float elapsed_time : ELAPSEDTIME;
static float fps = 1.0 / elapsed_time;
 ○补充
・如果SyncInEditMode = true,则由于MMD上的帧移动操作,ELAPSEDTIME的值可能为0或负值。
2.5 鼠标
●MOUSEPOSITION
 鼠标的当前位置。
类型是float2。
 MMD绘图区域的中心是(0,0),左下角是(-1,-1),右上角是(1,1)。
采用此xy坐标的方式与投影转换后的顶点坐标相同。
 ○注释
○使用方法
float2 pos : MOUSEPOSITION;
●LEFTMOUSEDOWN
●MIDDLEMOUSEDOWN
●RIGHTMOUSEDOWN
 有关鼠标按钮的信息。
类型为float4。
可以获得的值由以下四个数据组成。
・上次按下按钮时鼠标的坐标(xとy)
・是否按下当前按钮(0或1)
・上次按下按钮时的TIME值(秒)

鼠标坐标的方式与MOUSEPOSITION相同。

 ○注释
○使用方法
float4 mouse_down : LEFTMOUSEDOWN;
static float2 pos = mouse_down.xy;
static bool is_pressed = (mouse_down.z != 0);
2.6 控制对象
●CONTROLOBJECT
 获取指定对象的坐标和世界变换矩阵。
主要用于控制MMD着色器所需的参数。
类型是bool, float, float3, float4或float4x4。

取决于所使用的类型,可以获取的信息是不同的。

・bool
是否显示指定的对象
・float
缩放指定对象的值
・float3, float4
指定对象的坐标(偏移量)
・float4x4
指定对象的世界变换矩阵

 另外,通过为item注释指定特殊字符串,
除此之外的其他值也可以获得。
 ○注释
・string name (必须)
指定对象的文件名(不包括文件夹路径)。
如果你指定一个特殊的文件名”(self)”,
您可以将效果分配到的对象作为目标。

另外,如果您指定特殊文件名称”(OffscreenOwner)”,
您可以定位离屏所有者对象(仅在离线渲染期间)。
此处,屏幕外所有者是声明OFFSCREENRENDERTARGET的效果
指向分配的对象

・string item (可选项)
当你想获得一个对象的特殊值时指定这个。

指定下列之一。
骨骼名称 : 获取指定骨骼的坐标或PMD模型的世界变换矩阵。
类型是float3,float4,float4x4其中之一。
表情名称 : 获取PMD模型的指定面部表情的值。类型为float。

“X” : 配件位置X(X在配件面板上)。类型为float。
“Y” : 配件位置Y(Y在配件面板上)。类型为float。
“Z” : 配件位置Z(Z在配件面板上)。类型为float。
“XYZ” : 配件位置(X,Y,Z在配件面板上)。类型为float3。
“Rx” : 配件旋转X(Rx在配件面板上)。类型为float。(※1)
“Ry” : 配件旋转Y(Ry在配件面板上)。类型为float。
“Rz” : 配件旋转Z(Rz在配件面板上)。类型为float。
“Rxyz” : 配件旋转(Rx,Ry,Rz在配件面板上)。型类型为float3。
“Si” : 配件尺寸(Si在配件面板上)。类型为float。(※2)
“Tr” : 配件透明度(Si在配件面板上)。类型为float。

※1 获得的值是以弧度表示的面板上的值。
※2 获得的值是面板上的值乘以10。

○使用示例
//”stage01.x”显示是否被获取
bool flag : CONTROLOBJECT < string name = “stage01.x”; >;

//”negi.x”获取缩放值
float scaling : CONTROLOBJECT < string name = “negi.x”; >;

//”negi.x”获取X的旋转角度
float rot_x : CONTROLOBJECT < string name = “negi.x”; string item = “Rx”; >;
//”negi.x”以角度单位获得旋转X。
float rot_x_rad : CONTROLOBJECT < string name = “negi.x”; string item = “Rx”; >;
static float rot_x = rot_x_rad * 180 / 3.14159265;
//”弱音ハク.pmd”获取Bone「ポニテIK」的坐标
float3 pos : CONTROLOBJECT < string name = “弱音ハク.pmd”; string item = “ポニテIK”; >;
//”弱音ハク.pmd”获取「まばたき」的值
float morph : CONTROLOBJECT < string name = “弱音ハク.pmd”; string item = “まばたき”; >;
 ○补充
・由于PMD模型的世界变换矩阵不随单位矩阵而改变,
通常,它用于X文件(附件)。
・附件的缩放值是乘以MMD上附件尺寸值的10倍的值。
(在内部,使用由长度(world_matrix._ 11 _ 12 _ 13)获得的值)
・如果没有指定文件名的对象,则设置下列值。
对于X文件:
缩放值 :10
偏移值  :(0,0,0,1)
世界变换矩阵:缩放矩阵(xyz各10倍)
特殊item值   :0
对于PMD文件:
缩放值 :1
偏移值  :(0,0,0,1)
世界变换矩阵:单位矩阵
骨骼坐标  :(0,0,0,1)
骨骼转换矩阵:单位矩阵
表情值     :0
  ・从MME ver0.20开始,现在即使在参考源对象之后绘制参考目标对象,
你依然可以获得这些值。
・如果有多个具有指定名称的对象,则按以下优先顺序选择它们。
(1) 比参考源对象早且最接近绘制顺序的绘制顺序。
(2) 最后的绘制顺序

  ・对于没有任何顶点的对象,例如dummy bones.pmd,
即使将其指定为参照目标,也无法获取坐标。
2.7 纹理相关
●普通纹理
 生成纹理。
 类型为texture, texture2D, texture3D, textureCUBE。
即使指定了RENDERCOLORTARGET,RENDERDEPTHSTENCILTARGET,ANIMATEDTEXTURE以外的语义也会被忽略。
设置采样器后,可以通过调用tex2D(s,t)函数等生成纹理的内容。

○注释
・string ResourceType
指定纹理的类型。 指定”2D”, “3D”, “CUBE”中的一个。
不能指定与类型不一致的值。
   当类型是”texture”并且要产生除”2D”之外的纹理时,
您必须指定此注释。 除此之外,它可以省略。
 ・string ResourceName
指定作为纹理来源的图像文件。
支持的文件格式是bmp,.dds,.dib,.jpg,.png和.tga。
通过相对路径指定文件名时,存储效果文件的文件夹将成为参考文件。
 ・int Width
・int Height
・int Depth
以像素为单位指定纹理的宽度,高度和深度。
深度仅为3D纹理指定。
它不能与Dimensions和ViewportRatio同时指定。

(Width,Height,Depth),Dimensions, ViewportRatio没有指定时,
默认值是64像素。
另外,如果指定了ResourceName,则会自动从图像文件中获取大小。

・int2(or int3) Dimensions
以像素为单位指定纹理的宽度,高度和深度。
深度仅为3D纹理指定。

您不能同时指定ViewportRatio, Width, Height, Depth。

・float2 ViewportRatio
将纹理的宽度和高度指定为与渲染目标的屏幕大小的比率。
要创建与屏幕大小相同的纹理,请指定”float2 ViewportRatio = {1.0, 1.0};”。
要生成水平和垂直两倍大小的纹理,请指定”float2 ViewportRatio = {2.0, 2.0};”。

Dimensions, Width, Height, Depth不能同时指定。

・string Format
指定纹理的格式。

如果省略,则使用“A8R8G8B8”。
如果指定了ResourceName,则从图像文件中获取格式,
此注释的设置将被忽略。

可以指定的格式是D3DFORMAT(参考http://msdn.microsoft.com/ja-jp/library/bb172558(v=VS.85).aspx
英文版:https://msdn.microsoft.com/zh-cn/library/bb172558(v=VS.85).aspx)

您可以指定”A8R8G8B8″,”FMT_A8R8G8B8″或”D3DFMT_A8R8G8B8″格式。

 ・int Miplevels
生成指定级别的mipmap。
如果省略或指定0,则会创建完整的mipmap。
如果指定1,则不生成mipmap。
・int Levels
它是Miplevels的别名。

○使用示例
texture negi_tex < string ResourceName = “negi.bmp”; >;
sampler TexSampler = sampler_state {
texture = <negi_tex>;
};

texture2D map_tex <
string ResourceName = “map.png”;
int Miplevels = 1;
int Width = 64;
int Height = 64;
>;

●RENDERCOLORTARGET
 生成可为渲染目标指定的曲面。
指定此语义生成的纹理添加到脚本的RenderColorTarget中
它可以被指定。
渲染后,可以使用tex2D()函数像普通纹理一样引用内容。
 类型是texture或texture2D。
○注释

 ・int Width, int Height, int Depth
・int2 Dimensions
・float2 ViewportRatio
请参阅”●普通纹理”。
如果省略,则使用设置”float2 ViewportRatio = {1.0, 1.0};”。
 ・string Format
请参阅”●普通纹理”
如果省略,则使用”A8R8G8B8″。
 ・int Miplevels
・int Levels
请参阅”●普通纹理”
可以指定1或0。
如果指定了0,则会创建一个完整的mipmap。
如果指定了1,则不生成mipmap(默认值)。
○使用示例
texture2D ScnMap : RENDERCOLORTARGET <
float2 ViewPortRatio = {1.0,1.0};
int MipLevels = 1;
string Format = “A8R8G8B8” ;
>;
sampler2D ScnSamp = sampler_state {
texture = <ScnMap>;
};

technique Tech <
string Script = “RenderColorTarget0=ScnMap;
●RENDERDEPTHSTENCILTARGET
 生成深度模板表面(所谓的Z缓冲区)。
指定此语义生成的纹理添加到脚本的RenderDepthStencilTarget中
它可以被指定。
与由RENDERCOLORTARGET生成的纹理不同,由此语义生成的纹理,
渲染后,内容不能被引用。
 类型是texture或texture2D。
 ○注释
 ・int Width, int Height, int Depth
・int2(or int3) Dimensions
・float2 ViewportRatio
请参阅”●普通纹理”
如果省略,则使用设置”float2 ViewportRatio = {1.0, 1.0};”。
 ・string Format
请参阅”●普通纹理”
省略した場合、”D24S8″が使用される。如果省略,则使用”D24S8″。
○使用示例
texture2D DepthBuffer : RENDERDEPTHSTENCILTARGET <
float2 ViewPortRatio = {2.0,2.0};
string Format = “D24S8”;
>;

technique Tech <
string Script = “RenderDepthStencilTarget=DepthBuffer;
●ANIMATEDTEXTURE
生成动画纹理。

类型是texture或texture2D。

默认情况下,除了与帧时间一起自动生成动画,
它可以与另一个参数(如控制对象)一起运动。

 ○注释
 ・string ResourceName (必要)
指定成为纹理基础的动画图像文件。
支持的文件格式为.gif(动画GIF)和.png(APNG)。
 ・float Offset (可选项)
偏移动画开始时间。(单位:秒)
例如,如果指定2.5,则动画开始可以延迟2.5秒。
默认值是0.0。
 ・float Speed (可选项)
指定动画的播放速度。
例如,将2.0指定为动画速度的两倍。
默认值是1.0。
 ・string SeekVariable (可选项)
通过帧时间以外的方法执行动画的搜索控制时指定。
当指定参数名称时,动画会与参数值的更改一起执行。
   默认情况下,结合帧时间(TIME<SyncInEditMode=true>)设置动画。
○使用示例
// 与对象seek.x的大小变化一起运动

float atime: ControlObject < string Name = “seek.x”; >;

texture AnimeTex : ANIMATEDTEXTURE <
string ResourceName = “anime.png”;
string SeekVariable=”atime”;
>;

 ○补充
・当MMD的绘图的fps低于动画要求的fps时,会发生丢帧。
・对于APNG,GByte单位的巨大动画文件也可以播放(一次)。
●OFFSCREENRENDERTARGET
创建离屏渲染目标。

类型是texture或texture2D。

在生成离屏渲染目标后,
在指定的条件下,自动在该渲染目标上绘制所有对象。

tex2D()函数可以像使用普通纹理一样引用渲染结果。

 ○アノテーション
 ・int Width, int Height, int Depth
・int2 Dimensions
・float2 ViewportRatio
请参阅”●普通纹理”
如果省略,则使用设置”float2 ViewportRatio = {1.0, 1.0};”。
 ・string Format
请参阅”●普通纹理”
如果省略,则使用”A8R8G8B8″。
 ・int Miplevels
・int Levels
请参阅”●普通纹理”
可以指定1或0。
如果指定了0,则会创建一个完整的mipmap。
如果指定了1,则不生成mipmap(默认值)。
 ・float4 ClearColor
设置颜色以清除渲染目标。
渲染目标会自动使用此处指定的清除颜色。
・float ClearDepth
设置Z值以清除深度模板表面。
使用此处指定的Z值,深度模板表面将自动清除。

・bool AntiAlias
使用抗锯齿进行渲染。 默认值是false。
*抗锯齿有效时,视频内存会在很大程度上被消耗,
注意纹理的大小

・string Description
指定离屏渲染目标的描述。
此处指定的字符串将显示在效果分配的GUI对话框中。

・string DefaultEffect
指定如何分配要在离屏渲染中使用的效果文件。
以下面的格式描述了一个分配过程。

“(对象文件名称)=(效果文件名称);”

要切换要用于每个对象的效果文件,请多次描述此分配。
当多次描述时,对象文件名将按照它们的描述顺序进行比较,并使用第一个匹配项。

例: string DefaultEffect = “self=hide; Mirror*.x=hide; *=MirrorObject.fx;”;

可以为目标文件名指定带”*”和”?”的通配符。
“Self”可以被指定为一个特殊的对象文件名,
此OFFSCREENRENDERTARGET的效果表示分配的对象本身。

如果您使用效果文件名的相对路径指定文件名,
存储参考源的效果文件的文件夹为参考。

另外,可以将”none”和”hide”指定为特殊效果文件名称,
这代表”无效”和”无显示”。
另外,如果指定了”main_default”,与主屏幕上的默认行为相同,
根据目标文件路径自动分配fx文件和emd文件。

○使用示例

texture MirrorRT: OFFSCREENRENDERTARGET <
string Description = “OffScreen RenderTarget for Mirror.fx”;
int Width = 256;
int Height = 256;
float4 ClearColor = { 1, 1, 1, 1 };
float ClearDepth = 1.0;
bool AntiAlias = true;
string DefaultEffect =
“self = hide;”
“Mirror*.x = hide;”
“*=MirrorObject.fx;”;
>;

●TEXTUREVALUE
 获取指定纹理的纹理信息并将其存储在数组中。
即使在不支持VTF(Vertex Texture Fetching)的环境中,
纹理的值可以从顶点着色引用(※限制,见补充)
该类型是float 4([height] [width])的二维数组,或者是一维数组。

○注释
・string TextureName (必要)
指定纹理的参数名称。

○使用示例
float4 ParticleBaseArray[TEX_HEIGHT][TEX_WIDTH] : TEXTUREVALUE <
string TextureName = “ParticleBaseTex”;
>;
float4 ParticleBaseArray2[TEX_HEIGHT] : TEXTUREVALUE <
string TextureName = “ParticleBaseTex2”;
>;

float4 color1 = ParticleBaseArray[v][u];
float3 color2 = ParticleBaseArray2[idx].rgb;
○补充
・由于该值由常量寄存器传递,所以可以引用的纹理数量限制在200个左右。
・如果数组的大小与纹理的大小不匹配,则不能保证可以正确获取值。
在某些环境中,您只能创建尺寸为2的纹理,
请注意,即使指定了其他尺寸,尺寸也可以自动展开和创建。
・从纹理中获取值会发生在帧的开始处。
因此,即使您在中途更新目标纹理,该值也不会更新,直到下一帧。

2.8 效果文件
●STANDARDSGLOBAL
指定SAS(Standard Annotations and Semantics)的版本。
它也用于描述整个效果文件的注释。

指定参数名称”Script”,输入float类型,版本号为0.8的值。

○注释

 ・string ScriptOutput (可选项)
无法指定”color”以外的值。 默认值也是这个值。
・string ScriptClass (可选项)
指定效果文件的用途(绘制什么效果)。

指定为下列之一。

“object” : 绘制一个对象。(默认)
“scene” : 绘制一个屏幕缓冲区。
“sceneorobject” : 以上两者。

基本上,在正常对象绘制的效果中,请指定”object”,
对于预效果和后效果,请指定”scene”。

当指定”object”时,不要在路径脚本中执行Draw = Buffer。
另外,指定”scene”时,请勿执行Draw = Geometry。
如果指定了”sceneorobject”,则两者都可以执行。

・string ScriptOrder (可选项)
并指定效果文件的执行时间。

指定下列之一。

“standard” : 绘制一个对象。(默认)
“preprocess” : 在绘制对象之前绘制。 用于预效果。
“postprocess” : 绘制对象后绘制。 用于后期效果。

※确切地说,在preprocess之前,postprocess预处理
(从technique脚本的“ScriptExternal = Color”处开始)被执行。

・string Script (可选项)
指定要使用的technique的搜索顺序。

通常は、エフェクトファイルに記述されている順で、使用可能なテクニックが検索される(1.2)が、
このアノテーションを用いると、その検索順序を明示的に指定できる。
通常,按效果文件中所述的顺序搜索可用的technique(1.2),
通过此注释,您可以明确指定搜索顺序。

它以下面的格式指定。
“Technique=Technique?Tech1:Tech2:~;”

例:string Script = “Technique=Technique?SimplePS:TexturedPS:SimpleQuadraticPS:TexturedQuadraticPS;”;

如果只有一种technique可以使用,也可以如下指定。
string Script = “Technique=MainTech;”;

○使用示例
//对于正常的效果
float Script : STANDARDSGLOBAL <
string ScriptOutput = “color”;
string ScriptClass = “object”;
string ScriptOrder = “standard”;
> = 0.8;

  //在后期处理的情况下
float Script : STANDARDSGLOBAL <
string ScriptOutput = “color”;
string ScriptClass = “scene”;
string ScriptOrder = “postprocess”;
> = 0.8;
2.9 特殊参数
具有以下名称的参数将自动设置为无语义。
●parthf (bool型)
自阴影标志。
对应于自阴影(false,模式1)的模式1 /模式2。
●spadd (bool型)
球面映射贴图加法计算合成标志(true为加法计算合成)。
●transp (bool型)
半透明标志(true为半透明)。
对应于[显示(V)] – [半透明]。
●use_texture (bool型)
テクスチャ使用フラグ。
描画中のマテリアルがテクスチャを使用する場合にtrue。
纹理使用标志。
如果正在绘制的材质使用纹理,则为true。
●use_spheremap (bool型)
球面映射贴图使用标志。
如果绘制的材质使用球面映射贴图,则为true。
在使用PMX模型的副纹理时也是如此。
●use_subtexture (bool型)
Subtexture使用标志。
在使用PMX模型的副纹理时为true。
●use_toon (bool型)
卡通渲染使用标志。
对于PMD模型为true。
●opadd (bool型)
加法合成标志。
如果该对象的绘图设置为加法合成模式,则为true。
●VertexCount (int型)
对象的顶点数。
●SubsetCount (int型)
对象的子集数。
○使用示例
bool parthf;
bool use_texture;
bool use_toon;
int VertexCount;
○补充
・当MMDPass=”object”,”object_ss”时,不能保证为这些参数设置到正确的值。
2.9 顶点着色器语义
●_INDEX
用于在顶点着色器中获取顶点索引值的语义。
它可以用作顶点着色器的输入参数。 类型是int。

○使用示例

VS_OUTPUT Basic_VS(float4 Pos : POSITION, int index: _INDEX) {
VS_OUTPUT Out;
Out.Pos = mul( Pos, WorldViewProjMatrix );

float f = (float)index/VertexCount;
Out.Color = float4(f,f,f,1);
return Out;
}

 ○补充
・由于它在将其传递给顶点着色器的过程中转换为浮点类型,
如果索引值超过2 ^ 24 = 16777216,则无法获得正确的值。
2.10 宏
●MME_MIPMAP
 它是在MMD生成对应纹理的mipmap时定义的。
 ○使用示例
sampler ObjTexSampler = sampler_state {
texture = <ObjectTexture>;
#ifdef MME_MIPMAP
MIPFILTER = LINEAR;
#endif
};
 ○补充
**************************************************
3 脚本
technique和pass可以指定称为脚本的特殊注释。
technique technique名称 < string Script = “命令; 命令; …” ; > { … }
pass pass名称 < string Script = “命令; 命令; …” ; > { … }
在执行时,这些命令按照描述的顺序依次执行。
通过使用此脚本,您可以更改或清除渲染目标,
pass的循环处理等可以被执行。
如果你不做任何特殊的处理,比如后期效果,你通常不需要指定脚本。
如果technique脚本被省略,则technique通过按顺序执行。
另外,如果省略了pass脚本,则执行”Draw=Geometry”。
○命令
・RenderColorTarget=(纹理名称 or 空白)
・RenderColorTarget0=(纹理名称 or 空白)
・RenderColorTarget1=(纹理名称 or 空白)
・RenderColorTarget2=(纹理名称 or 空白)
・RenderColorTarget3=(纹理名称 or 空白)
设置渲染目标。
RenderColorTarget是RenderColorTarget 0的别名。

它通常与RenderDepthStencilTarget命令结合使用。
此外,RenderColorTargets 1到3不能单独使用,并且它们总是与RenderColorTarget 0组合使用。

对于参数,指定用RENDERCOLORTARGET语义声明的纹理参数的名称。
要重置为故障的渲染目标,请指定为空。

应该注意,设置的渲染目标保持不变,直到技术处理完成,除非再次执行这些命令。

・RenderDepthStencilTarget=(纹理名称 or 空白)
设置深度模板表面(所谓的Z缓冲区)。
它通常与RenderColorTarget 0命令结合使用。

对于参数,指定使用RENDERDEPTHSTENCILTARGET语义声明的纹理参数的名称。
要重置为默认深度模板表面,请指定为空。

・ClearSetColor=(参数名称)
设置颜色以清除渲染目标。(我还不清楚)

对于参数,请指定类型为float 4的参数的名称。
此参数中设置的值为清除渲染目标的颜色。

・ClearSetDepth=(参数名称)
设置Z值以清除深度模板表面。 (我还不清楚)

对于参数,请指定float类型参数的名称。
为该参数设置的值是用于清除深度模板表面的Z值。

・Clear=Color
清除渲染目标。
对于要清除的颜色,使用由ClearSetColor命令设置的值。

・Clear=Depth
清除深度模板表面。
要清除Z值,将使用由ClearSetDepth命令设置的值。

・ScriptExternal=Color
绘制另一个对象。
该命令只能用于technique的脚本中。

这只能在后期处理中(在STANDARDSGLOBAL参数的ScriptOrder注释中
具有指定的“后处理”的效果文件)来执行。

通常,在后期效果中,将输入纹理设置为渲染目标后,
使纹理渲染其他对象。
当这个其他对象被渲染时,这个命令被执行。
(参考Tips中的后效果)

在后期效果中,必须始终只在technique脚本上执行一次。

・Pass=(pass名称)
执行指定的pass。
该命令只能用于technique的脚本中。

如果您为technique指定脚本,则除非明确使用此命令,否则这两个路径都不会执行。

・LoopByCount=(参数名称)
・LoopEnd=
循环部分脚本达指定的次数。
该命令只能用于technique的脚本中。

对于参数,请指定数值类型(int,bool,float)的参数的名称。
从LoopByCount到LoopEnd的命令序列重复执行的次数与在此参数中设置的值相同。
循环可以嵌套。

在下面的例子中,pass p1在执行第三遍p0之后执行。

/****************************/
int Count = 3;

technique TShader <
string Script =
“LoopByCount=Count;”
“Pass=p0;”
“LoopEnd=;”
“Pass=p1;”;
> {
/****************************/

・LoopGetIndex=(参数名称)
将循环中的循环计数器的值设置为指定的参数。
此命令只能从LoopByCount到LoopEnd使用。

・Draw=Geometry
绘制一个对象。
该命令只能在pass脚本中使用。

如果pass脚本被省略,则执行该命令。
STANDARDSGLOBALのScriptClassに”scene”を指定している場合、
このコマンドを実行してはならない。
当为STANDARDSGLOBAL的ScriptClass指定”scene”时,
不要执行这个命令。

・Draw=Buffer
绘制一个矩形多边形,其大小与渲染目标的屏幕相匹配。
该命令只能在pass脚本中使用。

将其用于后期效果和预效果。
当为STANDARDSGLOBAL的ScriptClass指定”object”时,
不要执行这个命令。

・RenderPort=*
不支持。

○使用示例
technique TShader <
/* 如果两个字符串符号(“~” “~”)之间只有空格字符
由于它被认为是一系列字符串,因此可以将其划分和描述如下 */
string Script =
“RenderColorTarget0=RenderTarget;”
“RenderDepthStencilTarget=DepthBuffer;”
“ClearSetColor=ClearColor;”
“ClearSetDepth=ClearDepth;”
“Clear=Color;”
“Clear=Depth;”
“ScriptExternal=color;”
“Pass=P0;” ;
> {
pass P0 < string Script= “RenderColorTarget0=; RenderDepthStencilTarget=; Draw=Buffer;” ; > {
}
}
**************************************************
4 Tips
●使用MMD标准着色器
仅在对象的部分图像上使用该效果,
如果您想为其他图像使用MMD标准着色器,
您必须在效果文件中描述要使用MMD标准着色器的technique场景。
(”1.2 technique注释”参考)
/************************************************************/
/* 如果在效果文件中只有这个technique,
除了对象绘制(当自阴影为ON时)以外,都由MMD标准着色器绘制 */
technique Tech1 < string MMDPass = “object_ss”; > {
pass Pass1 {
}
pass Pass2 {
}
}
/************************************************************/

另外,由于路径的默认着色器是MMD标准着色器,
除非按如下方式设置pass的VertexShader或PixelShader,否则,
MMD标准着色器用于渲染pass。

/************************************************************/
technique Tech1 < string MMDPass = “object_ss”; > {
pass Pass1 {
// VertexShader = xxx
// PixelShader = xxx
}
}
/************************************************************/

●空technique
 如果该technique如下所述被清空,则使用该technique不会执行绘图。
通过使用这个,可以抑制部分或全部对象的绘制。
  /*********************************************************/
technique ShadowTech < string MMDPass = “shadow”; > {
}
/*********************************************************/

●带/不带物体的pass的开/关
如果您按照以下方式编写脚本,
则只有在特定对象的显示为ON时才可以运行该路径。
这使用了真/假值被解释为1和0作为数值的事实。
  /*********************************************************/
bool flag : CONTROLOBJECT < string name = “aaa.x”; >;
technique Tech1 <
string Script =
“LoopByCount=flag;”
“Pass=Pass1;”
“LoopEnd=;”
;
> {
pass Pass1 {
}
}
/*********************************************************/

●在效果文件中共享参数
通常,参数不在不同的效果文件之间共享。
但是,通过在参数声明中指定“共享”关键字,
效果文件之间可以共享相同名称的参数。

在以下示例中,可以从effect2.fx引用由effect1.fx生成的纹理。
因此,有必要在两个参数声明中指定“共享”关键字。
此外,还需要匹配名称以及类型名称和语义。

/************** effect1.fx ******************/

shared texture ShadowBuffer : RENDERCOLORTARGET <
float2 ViewPortRatio = {2.0,2.0};
int MipLevels = 1;
string Format = “A8R8G8B8” ;
>;

/********************************************/

  /************** effect2.fx ******************/
shared texture ShadowBuffer : RENDERCOLORTARGET;

/********************************************/

●if声明
如果你想加快渲染速度,在描述着色器时,应该尽可能地减少使用if语句等条件分支
最好不要使用它。

在根据纹理的存在或不存在来切换着色器处理的情况下,
参照use_texture参数,而不是着色器中if语句中的条件分支,
在具有纹理的子集和没有纹理的子集之间划分technique本身更快。

●uniform关键字
如果在声明函数参数时指定了“uniform”关键字,则可以将该参数的值作为编译时常量。

在以下示例中,如果在编译时删除Basic_PS()中的if语句,
可以避免由于条件分支造成的速度降低(可能)。

/*******************************************************************/
float4 Basic_PS( VS_OUTPUT IN, uniform bool useTexture ) : COLOR0
{
float4 Color = IN.Diffuse;
if ( useTexture ) {
Color *= tex2D( ObjTexSampler, IN.Tex );
}
}

technique TechWithTex {
pass P1 {
/* useTexture=true でシェーダをコンパイル */
PixelShader = compile ps_2_0 Basic_PS(true);
}
}

technique TechWithoutTex {
pass P1 {
/* useTexture=false でシェーダをコンパイル */
PixelShader = compile ps_2_0 Basic_PS(false);
}
}
/*******************************************************************/

●在效果文件中使用日语
基本上,不建议在注释以外的效果文件中使用日文字符。

可以使用时,请注意字符代码。
诸如用于纹理生成的图像文件的路径和控制对象的对象名称,
使用日语指定文件名时,效果文件的字符代码必须为Shift-JIS。

●后期处理
为后期效果创建效果文件时,
以下参数需要在效果文件中声明。
(”●STANDARDSGLOBAL”参考)

float Script : STANDARDSGLOBAL <
string ScriptOutput = “color”;
string ScriptClass = “scene”;
string ScriptOrder = “postprocess”;
> = 0.8;
另外,在典型的后期处理中,以下处理是通过technique脚本完成的。

(1) 将渲染目标更改为您自己的纹理并清除它。

示例脚本:
“RenderColorTarget0=(RENDERCOLORTARGET纹理);”
“RenderDepthStencilTarget=(RENDERDEPTHSTENCILTARGET纹理);”
“ClearSetColor=(确定的颜色值);”
“ClearSetDepth=(确定的z值);”
“Clear=Color;”
“Clear=Depth;”

 (2) 绘制前置效果,对象和其他后期效果。
此时,渲染结果保存在(1)中指定的纹理中。
   示例脚本:
“ScriptExternal=Color;”
(3) 恢复渲染目标并输入渲染结果的纹理作为输入并执行该pass。

   示例脚本:
“RenderColorTarget0=;”
“RenderDepthStencilTarget=;”
“Pass=(パス1);”
“Pass=(パス2);”
Tags:
blade
student - Artist
2
Comments
ZJ
6 months ago
Technical Artist
tql
0