Chinaunix首页 | 论坛 | 博客
  • 博客访问: 38739
  • 博文数量: 59
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 328
  • 用 户 组: 普通用户
  • 注册时间: 2014-07-11 09:27
文章分类
文章存档

2015年(7)

2014年(52)

我的朋友

分类: 信息化

2014-09-25 16:28:48

本章将描述如何定义材质着色器,使其包含各种渲染风格组合。 制作高级自定义材质着色器效果时,需要遵守本章列出的规则,使效果与各种光照类型和动态光照正确地互动。

Vision 引擎允许您编写自定义材质着色器。 然后可使用这些着色器来实现默认着色器所不支持的附加功能。 例如,可以编写一个着色器来模拟不同皮肤层,以获得更自然的结果。

对于材质着色器,引擎使用一套规则来判定究竟使用着色器效果库中的哪一个着色器。

对于材质着色器,最重要的问题在于,应用程序究竟是使用延迟着色、正向着色还是移动设备正向着色。 三者之间有一些相似,但我们不建议在同一个项目中混用,所以下文将分别列出每一种着色的基本原则。

一般问题
对材质应用着色器效果时,有时需要特别版本的着色器效果,才能适用于动态光照材质。 另外,这些效果必须考虑到不同表面类型会使用不同的光照范式(光照网格对比光照贴图)。

示例: 设想您希望添加具有”卷轴效果”的着色器,纹理会沿一个方向滚动。 如果您想让该效果在所有表面正常工作,就需要至少为以下情况提供实现方法:
通过光照贴图静态照亮的表面
通过 dot3 光照贴图静态照亮的表面
通过光照网格静态照亮的表面
全亮的表面

此外,您可能还想为以下情况提供不同的着色器:
带有 / 不带有法线贴图的材质
带有 / 不带有逐像素高光贴图的材质
带有 / 不带有视差贴图的材质
带有 / 不带有 alpha 测试的材质
您不需要实现以上所有不同组合,不被使用的组合可不必考虑。 就算被使用且没有可用的对应着色器,引擎还会使用下一个最佳回退方案,所以依然可以运行,但外观也许不完全符合期望。 不过,如果某着色器库包含部分或全部上述着色器,则引擎一定能为材质正确选择着色器。这就是包含标记的用途所在。
那么,引擎是如何通过效果来判断使用哪一种子技术的呢? 可视化着色器编辑器允许程序员为每一种技术分别设置包含标记。 包含标记是从效果查询技术时必须指定的一组字符串标记。 所以适合用来提供独有的变量。

注: 生成完整的库、提供所有不同的着色器组合,这可能需要大量彼此之间仅仅略有不同的着色器。 为了尽可能自动完成该任务,应使用 Vision 引擎的着色器排列组合系统
着色器库包含一份着色器列表,以及效果、技术和着色器通路的分层结构。 每种”效果”都能包含不限数量的”技术”。 每种”技术”都可引用任何可用”着色器”。 也就是说,一个着色器可被多种不同技术引用。 您可以事后在某个材质中使用该”效果”。 例如,如果要在材质上设置”卷轴”效果,您不用直接选择技术或着色器。 相反,引擎会通过设在所有技术中的包含标记来选择最合适的技术。

您可以配置包含标记,方法为在”着色器库”窗格中选择一种技术,然后在”着色器属性”窗格中编辑它们。 包含标记是由分号隔开的字符串列表。 

着色器提供器

当某个材质上的自定义”效果”被指定,所谓的着色器提供器将从该效果中选择要使用的技术(从而决定要使用哪些着色器)。 Vision 引擎内置一个用于延迟渲染的着色器提供器,以及另一个用于正向渲染的着色器提供器。 您可以用自定义实现方案替代着色器提供器。 本文档将描述默认着色器提供器的工作方式。

总的来说,着色器提供器会分析某材质属性,据此编写一份包含标记列表以体现这些特性。 然后通过这些包含标记从指定效果中选择一种技术。

例如,如果某材质有一个法线贴图,且使用 alpha 测试,着色器提供器会设置包含代码”VMATERIAL_NORMALMAP”和”ALPHATEST”。 然后,着色器提供器会从效果中选择第一个注明这些包含标记的技术。 如果没有,则回退到该效果的第一个技术。

出于各种目的,着色器提供器可能从一个效果中选择不止一个技术。 例如,提供器可能为通常渲染选择一种技术,再为镜面对象的渲染选择一种技术(后者可使用性能开支较低的着色器)。

正向渲染
在正向渲染中,一个着色器效果库所提供的着色器必须能够渲染带任何光源类型(点光源、聚光灯、平行光源)以及其他静态光照方法(光照贴图、光照贴图-dot3、光照网格)的表面。 Vision SDK 中的默认正向渲染材质库“vMaterial.ShaderLib”是可以参考的示例。 但要注意的是,该方法使用着色器排列组合系统生成着色器和技术,实际生成的数量比直接可见的数量更多。 

    动态光照着色器
受动态光照影响的几何体会使用着色器通路再次渲染,该通路由相应的”电光源”或”聚光灯”技术提供。 这要求渲染循环动态地准备动态光源着色器,即设置当前光照位置、光照色、指向等。 为了实现高度灵活和性能出众的解决方案,引擎要求参与动态光照的所有着色器通路都属于一个专用着色器类。

该着色器类可在着色器属性中设置:

该类在引擎中始终可用,所以类型管理器知道如何创建其实例。 一个VDynamicLightShader 类的实例会暂存在着色器编写时注册的相关着色器,从而便利地为光照位置或颜色设置提供快速成员函数。 从渲染循环:

VDynamicLightShader *pPass = (VDynamicLightShader *)pTech->GetShader(i);   // set light source properties pPass->SetPosition((VVertex3f &)vPosition); pPass->SetRadius(pLight->GetRadius()); pPass->SetColor(vColor, pLight->GetMultiplier()); [...]

此类要求在顶点和像素着色器中用代码写死着色器注册命名,从而在编写时暂存注册信息:

注册名 类型 用法
LightPos float3 光照在世界空间中的位置
LightColor float4 带预倍增光照倍增值的光照颜色(xyz),w=1.0
LightRadius float4 光照影响参数:x:半径,y:1/半径(用于衰减纹理),z:半径二次方,w:1/半径二次方
LightAngle float4 聚光灯投射参数:x:投射半角的余弦,y:1.0/(1.0 - x),z:0.0,w:0.0
LightDir float4 平行光照的指向(xyz),w:0.0
AttenTex Sampler 衰减纹理的纹理采样器
ShadowTex Sampler 延迟阴影蒙版的纹理采样器
RefPlaneX float4 聚光灯的第一投射平面
RefPlaneY float4 聚光灯的第二投射平面
RefPlaneW float4 聚光灯的第三投射平面(远距离平面)
InvScreenSize float4 逆向屏幕分辨率(xy),z:0.0,w:0.0
ProjTex Sampler 投射纹理(聚光灯)的纹理采样器

请参考 vMaterial.ShaderLibvMaterialFullbright.ShaderLib 和vMaterialGlow.ShaderLib 中的标准材质着色器示例。 

法线渲染

法线渲染所使用的技术应使用以下包含标记标识:
VMATERIAL_NORMALMAP: 这类技术可处理带有法线贴图的材质
VMATERIAL_PARALLAX: 这类技术可处理带有有效视差贴图参数、法线贴图中有一个 alpha 通道的材质
VMATERIAL_SPECULAR: 这类技术可处理带有有效高光参数(高光倍增和指数)的材质
VMATERIAL_REFMAP: 这类技术可处理带有逐像素高光贴图的材质
ALPHATEST: 这类技术可处理要求 alpha 测试的材质
MIRROR: 这类技术可处理镜面渲染(在 DX11 中使用一个剪切面来获得适当的镜面渲染)。 在其他平台上,该包含标记为可选。
LIGHTGRID: 这类技术将渲染使用光照网格照亮的平面。
LIGHTMAP: 这类技术将渲染使用光照贴图照亮的表面。
LIGHTMAPDOT3: 这类技术将渲染使用 dot3 光照贴图照亮的表面。
POINTLIGHT: 这类技术将渲染使用点光照照亮的平面。
PROJPOINTLIGHT: 这类技术将渲染使用投射点光照照亮的平面。
SPOTLIGHT: 这类技术将渲染使用聚光灯照亮的平面。
DIRECTIONALLIGHT: 这类技术将渲染用平行光照照亮的平面。
SHADOWMAP: 这类技术将渲染用动态光照照亮(点光照、投射点光照、聚光灯或平行光照)、且使用阴影贴图的平面。

   注: 能够处理某种材质、实现其特定设置的技术并不一定要实现该效果。 例如,您可以编写一个简单的通路通过型着色器,仅输出基底纹理。 该着色器一般可以处理带有法线贴图、视差贴图、逐像素高亮乃至 alpha 测试的材质。 但它并不执行这些功能。 反过来,确实执行视差贴图的着色器只能处理带有 alpha 通道和有效视差设置的法线贴图的材质。 也就是说,如果您仅提供一种技术来处理材质的所有不同变体,该技术只能执行输入数据必定可用的任务。 例如,假如您提供一种带有 VMATERIAL_NORMALMAP 包含标记的技术,但没有提供不带该包含标记的技术,则带有法线贴图的材质以及不带有法线贴图的材质都会使用该技术。 因此,该着色器实际上不得使用法线贴图。

部分包含标记彼此为正交关系。 例如,最好为每一个光照类型添加 VMATERIAL_xyz 的所有不同组合。 另外,对于每一组动态光照技术,也应额外附加一组技术,专门处理这一光照带阴影贴图的情况。 但是,作为最低限度的要求,库应提供带如下包含标记的技术:

1、LIGHTMAP、VMATERIAL_NORMALMAP、VMATERIAL_PARALLAX、VMATERIAL_SPECULAR、VMATERIAL_REFMAP:
     该技术渲染以光照贴图照亮的表面。

· 2、LIGHTMAPDOT3、VMATERIAL_NORMALMAP、VMATERIAL_PARALLAX、VMATERIAL_SPECULAR、VMATERIAL_REFMAP: 
     该技术渲染以 dot3 光照贴图照亮的表面。

3、LIGHTGRID、VMATERIAL_NORMALMAP、VMATERIAL_PARALLAX、VMATERIAL_SPECULAR、VMATERIAL_REFMAP:
     该技术渲染以光照网格照亮的表面。

4、POINTLIGHT、VMATERIAL_NORMALMAP、VMATERIAL_PARALLAX、VMATERIAL_SPECULAR、VMATERIAL_REFMAP:
     该技术渲染以点光照动态照亮的表面。

5、POINTLIGHT、SHADOWMAP、VMATERIAL_NORMALMAP、VMATERIAL_PARALLAX、VMATERIAL_SPECULAR、VMATERIAL_REFMAP:
     该技术渲染以点光照动态照亮、且使用阴影贴图的表面。

6、PROJPOINTLIGHT、VMATERIAL_NORMALMAP、VMATERIAL_PARALLAX、VMATERIAL_SPECULAR、VMATERIAL_REFMAP:
     该技术渲染以投射点光照动态照亮的表面。

7、PROJPOINTLIGHT、SHADOWMAP、VMATERIAL_NORMALMAP、VMATERIAL_PARALLAX、VMATERIAL_SPECULAR、VMATERIAL_REFMAP:
     该技术渲染以投射点光照动态照亮、且使用阴影贴图的表面。

8、SPOTLIGHT、VMATERIAL_NORMALMAP; VMATERIAL_PARALLAX、VMATERIAL_SPECULAR、VMATERIAL_REFMAP:
     该技术渲染以聚光灯动态照亮的表面。

9、SPOTLIGHT、SHADOWMAP、VMATERIAL_NORMALMAP、VMATERIAL_PARALLAX、VMATERIAL_SPECULAR、VMATERIAL_REFMAP:
     该技术渲染以聚光灯动态照亮、且使用阴影贴图的表面。

10、DIRECTIONALLIGHT、VMATERIAL_NORMALMAP、VMATERIAL_PARALLAX、VMATERIAL_SPECULAR、VMATERIAL_REFMAP:
       该技术渲染以平行光照动态照亮的表面。

11、DIRECTIONALLIGHT、SHADOWMAP; VMATERIAL_NORMALMAP、VMATERIAL_PARALLAX、VMATERIAL_SPECULAR、VMATERIAL_REFMAP:
       该技术渲染以平行光照动态照亮、且使用阴影贴图的表面。

除非您还提供所有不同的 VMATERIAL_xyz 技术组合,否则以上技术将处理所有组合。 例如,技术 1 会处理所有光照贴图材质,哪怕该材质没有法线贴图。 因此,相应的着色器不应执行法线贴图等任务(否则就需要法线贴图的输入数据)。
   注: 如果您不提供处理动态光源的技术,则引擎会回退使用默认光照着色器。 如果您想使用一种不被任何光源影响的效果,您应提供带有以上包含标记的技术,但将其留空(即不引用任何着色器)。

仅深度渲染
着色器提供器还会搜寻可用于仅深度渲染的技术。 提供器会使用法线着色器作为回退选择,但这还不够。 因此,着色器提供器会寻找带有以下包含标记的技术:
DEPTHFILL: 处理仅深度渲染的技术
DEPTHFILL、ALPHATEST: 为 alpha 测试几何体处理仅深度渲染的技术。

延迟着色
在延迟着色模式下,着色器效果库必须提供将表面渲染到 G-Buffer 中的着色器。 因为静态光照也写入该通路,所以必须提供不同的静态光照方法(光照贴图、光照贴图-dot3、光照网格)。 Vision SDK 的默认延迟着色库“vDeferredMaterial.ShaderLib”中有一个关于”初始通路”效果的示例。 但要注意的是,该方法使用着色器排列组合系统生成着色器和技术,实际生成的数量比直接可见的数量更多。

   法线渲染
法线渲染所使用的技术应使用以下包含标记标识:

VMATERIAL_NORMALMAP: 这类技术可处理带有法线贴图的材质
VMATERIAL_PARALLAX: 这类技术可处理带有有效视差贴图参数、法线贴图中有一个 alpha 通道的材质
VMATERIAL_SPECULAR: 这类技术可处理带有有效高光参数(高光倍增和指数)的材质
VMATERIAL_REFMAP: 这类技术可处理带有逐像素高光贴图的材质
ALPHATEST: 这类技术可处理要求 alpha 测试的材质
LIGHTGRID: 这类技术将渲染使用光照网格照亮的平面。
LIGHTMAP: 这类技术将渲染使用光照贴图照亮的表面。
LIGHTMAPDOT3: 这类技术将渲染使用 dot3 光照贴图照亮的表面。
FULLBRIGHT: 这类技术将渲染全亮表面。
FULLBRIGHT、VERTEXCOLOR: 这类技术将渲染全亮且使用顶点颜色的表面。
不带 LIGHTGRID、LIGHTMAP、LIGHTMAPDOT3 或 FULLBRIGHT 包含标记的技术将处理不使用静态光照的几何体
MSAA: 为 D3D 11 渲染器执行多重采样的技术。
  注: 能够处理某种材质、实现其特定设置的技术并不一定要实现该效果。 例如,您可以编写一个简单的通路通过型着色器,仅输出基底纹理。 该着色器一般可以处理带有法线贴图、视差贴图、逐像素高亮乃至 alpha 测试的材质。 但它并不执行这些功能。 反过来,确实执行视差贴图的着色器只能处理带有 alpha 通道和有效视差设置的法线贴图的材质。 也就是说,如果您仅提供一种技术来处理材质的所有不同变体,该技术只能执行输入数据必定可用的任务。 例如,假如您提供一种带有 VMATERIAL_NORMALMAP 包含标记的技术,但没有提供不带该包含标记的技术,则带有法线贴图的材质以及不带有法线贴图的材质都会使用该技术。 因此,该着色器实际上不得使用法线贴图。

部分包含标记彼此为正交关系。 例如,最好为每一个静态光照类型添加 VMATERIAL_xyz 的所有不同组合。 但是,作为最低限度的要求,库应提供带如下包含标记的技术:
1、VMATERIAL_NORMALMAP、VMATERIAL_PARALLAX、VMATERIAL_SPECULAR、VMATERIAL_REFMAP: 
     该技术将未照亮的表面渲染到 G-Buffer 中。 

2、LIGHTMAP、VMATERIAL_NORMALMAP、VMATERIAL_PARALLAX、VMATERIAL_SPECULAR、VMATERIAL_REFMAP: 
     该技术渲染以光照贴图照亮的表面。 

3、LIGHTMAPDOT3、VMATERIAL_NORMALMAP、VMATERIAL_PARALLAX、VMATERIAL_SPECULAR、VMATERIAL_REFMAP: 
     该技术渲染以 dot3 光照贴图照亮的表面。

4、LIGHTGRID、VMATERIAL_NORMALMAP、VMATERIAL_PARALLAX、VMATERIAL_SPECULAR、VMATERIAL_REFMAP: 
             该技术渲染以光照网格照亮的表面。
除非您还提供所有不同的 VMATERIAL_xyz 技术组合,否则以上技术将处理所有组合。 例如,技术 1 会处理所有未照亮材质,哪怕该材质没有法线贴图。 因此,相应的着色器不应执行法线贴图等任务(否则就需要法线贴图的输入数据)。

  镜面渲染
出于性能考量,镜面始终采用正向渲染,即便主渲染方式为延迟着色。 因此需要专用镜面渲染技术。 如果着色器库中没有提供镜面技术,则使用默认的镜面技术。 取决于您所执行的具体效果,这一回退可能合适,也可能不合适。

如果您想提供专用镜面渲染技术,应使用如下包含标记:
 MIRROR、LIGHTMAP: 该技术将把以光照贴图照亮的对象渲染到镜面中。
 MIRROR、LIGHTGRID: 该技术将把以光照网格照亮的对象渲染到镜面中。
 MIRROR、FULLBRIGHT: 该技术将把全亮对象渲染到镜面中。
 MIRROR、FULLBRIGHT、VERTEXCOLOR: 该技术将把使用顶点颜色的全亮对象渲染到镜面中。

移动正向渲染

类似于正向渲染,在移动设备正向渲染中,一个着色器效果库所提供的着色器必须能够渲染带任何光源类型(点光源、聚光灯、平行光源)以及其他静态光照方法(光照贴图、光照贴图-dot3、光照网格)的表面。 Vision SDK 中的默认移动设备材质库 MobileShaders.ShaderLib 是可以参考的示例。 但要注意的是,该方法使用着色器排列组合系统生成着色器和技术,实际生成的数量比直接可见的数量更多。

移动设备正向渲染器将使用其自身的 Vision 移动着色器提供器。 该着色器提供器不仅支持移动着色器(来自 MobileShaders.ShaderLib),而且支持大多数常规的正向渲染着色器。 

  动态光照着色器
受动态光照影响的几何体要求渲染循环动态地准备相应的动态光照着色器,即设置当前光照位置、光照色、指向等。 为了实现高度灵活和性能出众的解决方案,引擎要求参与动态光照且针对移动设备(如 MobileShaders.ShaderLib 中的着色器)的所有着色器通路都属于一个专用着色器类: VMobileDynamicLightShader(V 移动设备动态光照着色器)。

此类要求在顶点和像素着色器中用代码写死着色器注册命名,从而在编写时暂存注册信息:

注册名 类型 用法
LightPos float4 光照在世界空间中的位置(xyz),w=1.0
LightColor float4 带预倍增光照倍增值的光照颜色(xyz),w=1.0
LightRadius float4 光照影响参数:x:半径,y:1/半径(用于衰减纹理),z:半径二次方,w:1/半径二次方
LightAngle float4 聚光灯投射参数:x:投射半角的余弦,y:1.0/(1.0 - x),z:0.0,w:0.0
LightDir float4 平行光照的指向(xyz),w:0.0
AttenTex Sampler 衰减纹理的纹理采样器
ShadowTex Sampler 阴影贴图的纹理采样器
LightProjectionTex float4x4 阴影投射光照的视角投射纹理矩阵
ShadowParameters float4 阴影贴图参数:x:淡出终点,y:1.0/(淡出范围),z:删减法阴影阈值,w:0.0


   法线渲染
法线渲染所使用的技术应使用以下包含标记标识:
LIGHTGRIDSIMPLE: 这类技术将渲染使用简化光照网格照亮的表面(对应着色器中应始终设有 LIGHTGRID 包含标记,从而使该着色器也被非移动设备着色器提供器选中)。
LIGHTMAP: 这类技术将渲染使用光照贴图照亮的表面。 (对应着色器中应始终设有 LIGHTMAP 包含标记,从而使该着色器也被非移动设备着色器提供器选中)。
LIGHTMAPDOT3: 这类技术将渲染使用 dot3 光照贴图照亮的表面(不被移动设备专用着色器支持)。
POINTLIGHT: 这类技术将渲染使用点光照照亮的平面。
SPOTLIGHT: 这类技术将渲染使用聚光灯照亮的平面。
DIRECTIONALLIGHT: 这类技术将渲染用平行光照照亮的平面。
FULLBRIGHT: 这类技术将渲染全亮表面。
MIRROR: 这类技术可处理镜面渲染。
MOBILE_DYNAMICBASEPASSLIGHTING: 这类技术将渲染基底通路中带有动态光照 / 阴影的表面。
MOBILE_SUBTRACTIVE_SHADOWMAP: 这类技术将渲染基底通路中带有删减法阴影的表面(与 USE_SHADOWMAP 组合使用)。
NOFOG: 带有该包含标记的技术不对被渲染表面应用雾。
USE_SHADOWMAP: 这类技术将渲染带有动态阴影贴图的表面。
USE_GLOBAL_AMBIENT: 只有带该包含标记的技术才会在基底通路中应用全局环境色。

   注: 能够处理某种材质、实现其特定设置的技术并不一定要实现该效果。 例如,您可以编写一个简单的通路通过型着色器,仅输出基底纹理。 该着色器通常可处理所有带对应包含标记的材质,但只是不会实现那些特性。 不过,如果您仅提供一种技术来处理材质的所有不同变体,该技术只能执行输入数据必定可用的任务。 例如,假如您提供一种带有 USE_SHADOWMAP 包含标记的技术,但没有提供不带该包含标记的技术,则带有阴影贴图的材质以及不带有阴影贴图的材质都会使用该技术。 因此,该着色器实际上不得使用阴影贴图。

部分包含标记彼此为正交关系。 例如,最好为每一组动态光照技术再额外附加一组技术,用于处理基底通路中的动态光照,其设置可以是 LIGHTMAP、LIGHTMAPDOT3、MOBILE_DYNAMICBASEPASSLIGHTING、POINTLIGHT。 但是,作为最低限度的要求,库应提供带如下包含标记的技术:

1、LIGHTMAP、LIGHTMAPDOT3:
     该技术渲染以光照贴图照亮的表面。

2、LIGHTGRIDSIMPLE、LIGHTGRID:
     该技术渲染以简化光照网格照亮的表面。

3、POINTLIGHT:
     该技术渲染以点光照动态照亮的表面。 

4、SPOTLIGHT:
      该技术渲染以聚光灯动态照亮的表面。 

5、SPOTLIGHT、SHADOWMAP:
      该技术渲染以聚光灯动态照亮、且使用阴影贴图的表面。 

6、DIRECTIONALLIGHT:
      该技术渲染以平行光照动态照亮的表面。 

7、DIRECTIONALLIGHT、SHADOWMAP:
     该技术渲染以平行光照动态照亮、且使用阴影贴图的表面。 

   注: 如果您不提供处理动态光源的技术,则引擎会回退使用默认光照着色器。 如果您想使用一种不被任何光源影响的效果,您应提供带有以上包含标记的技术,但将其留空(即不引用任何着色器)。

仅深度渲染
着色器提供器还会搜寻可用于仅深度渲染的技术。 提供器会使用法线着色器作为回退选择,但这还不够。 因此,着色器提供器会寻找带有以下包含标记的技术:
DEPTHFILL: 处理仅深度渲染的技术。
DEPTHFILL、ALPHATEST: 为 alpha 测试几何体处理仅深度渲染的技术。

转自:
阅读(189) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~