Unity Shader——Writing Surface Shaders(0)

时间:2015-05-12 11:09:49   收藏:0   阅读:286

  从今天起,开始翻译Unity关于shader的官方文档。翻译水平比较一般,目的主要是通过翻译来提升对shader的见解,也让其他人更容易的了解shader。以下开始正文内容:

 

编写Surface Shaders

  和光交互的shader写起来很复杂,有不同的光照类型、阴影选项、渲染路径(正向渲染和延迟渲染),有时shader需要考虑所有的复杂性。

  Unity中的Surface Shader是一个代码生成器,用它来写光照shader(lit shader)相比于使用低阶的顶点/像素shader(vertex/pixel shader)程序,会更加容易。注意Surface Shader中并没有固定的语言和奇幻的东西(magic or ninjas involved)。它仅仅是生成原本必须由手工重复编写的代码。你也可以用Cg/HLSL来写shader代码。

  这里有一些例子: Surface Shader ExamplesSurface Shader Custom Lighting Examples

它如何工作

  你定义一个“surface 函数”,其输入是你所需要的任意UVs或数据,输出是SurfaceOutput数据结构。SurfaceOutput简单地描述了surface的属性(properties of the surface),如反射率颜色(albedo color)、法线(normal)、散射(emission)、镜面反射(specularity )等。

  Surface Shader编译器会确定需要什么输入,有什么输出等,也会产生实际的顶点&像素shader(vertex&pixel shaders),以及渲染路径来处理正向和延迟渲染。

  surface标准的输出结构如下:

struct SurfaceOutput
2 {
3     fixed3 Albedo;  // 漫反射颜色
4     fixed3 Normal;  // 切线空间法线,如果赋值的话
5     fixed3 Emission;
6     half Specular;  // 高光强度,范围是0-1
7     fixed Gloss;    // specular intensity
8     fixed Alpha;    // 透明度
9 };

  在Unity 5中,surface shader 也能使用物理光照模型。内建的标准和标准镜面光照模型(见下文)分别使用以下输出结构:

struct SurfaceOutputStandard
{
    fixed3 Albedo;      // 基础 (漫反射或镜面反射) 颜色
    fixed3 Normal;      // 切线空间法线,如果赋值的话
    half3 Emission;
    half Metallic;      // 0=非金属, 1=金属
    half Smoothness;    // 0=粗糙, 1=光滑
    half Occlusion;     // 遮挡(默认1)
    fixed Alpha;        // 透明度
};
struct SurfaceOutputStandardSpecular
{
    fixed3 Albedo;      // 漫反射颜色
    fixed3 Specular;    // 镜面反射颜色
    fixed3 Normal;      // 切线空间法线,如果赋值的话
    half3 Emission;
    half Smoothness;    // 0=粗糙, 1=光滑
    half Occlusion;     // 遮挡(默认1)
    fixed Alpha;        // 透明度
};

例子

  参见:Surface Shader ExamplesSurface Shader Custom Lighting Examples and Surface Shader Tessellation

Surface Shader编译指令

  Surface shader放在CGPROGRAM..ENDCG块中,就像其他任何的shader一样。不同处在于:

  #pragma surface指令如下:

#pragma surface surfaceFunction lightModel [optionalparams]

必须参数

Custom Lighting Models

可选参数

  透明度和alpha测试(Transparency and alpha testing)由alpha和alphatest指令控制。通常透明度有两种类型:传统alpha混合(用于对象淡出)或更逼近物理的“混合预乘”(允许半透明的表面保持合适的镜面反射)。开启半透明度使得产生的surface shader代码包含blending指令:基于给定的变量,开启alpha裁剪将会在生成的像素shader中进行碎片丢弃。

  定制修改器函数(Custom modifier functions)能够用来改变或者计算输入的顶点数据,或者改变最终计算出的片段颜色。

  阴影和镶嵌(Shadows and Tessellation)— 附加指令,用于控制阴影和镶嵌的处理。

  代码生成选项 — 默认生成的surface shader代码会尝试去处理所有可能的光照/阴影/光照贴图场景。尽管如此,在某些情况下你并不需要其中一些,你可以调整生成的代码来跳过它们。这样就能产生更小、加载速度更快的shader。

  混合选项

  要了解使用上述不同选项所带来确切的变化,使用Shader Inspector中的“Show Generated Code” 按钮将会有所帮助。

Surface Shader 输入结构

  输入结构 Input 通常有shader所需的任意纹理坐标。纹理坐标必须命名为“uv”+“纹理名称”(或者以“uv2”开头,来使用第二个纹理坐标集)。 

输入结构中还能放入一下额外的变量:

Surface shaders 和 DirectX 11

  目前,surface shader编译管道的部分内容并不能理解 DirectX 11-特定的HLSL 语法, 所以如果你在使用HLSL特性,诸如StructuredBuffers, RWTextures 和其他非DX9 语法,你必须将之包含在只针对DX11的预处理器宏中。详情参见Platform Specific Differences 。

 

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!