美文网首页
Shader 学习之路-表面着色器(四)

Shader 学习之路-表面着色器(四)

作者: AnimeKing | 来源:发表于2019-04-08 23:12 被阅读0次

表面着色器官方文档:https://docs.unity3d.com/Manual/SL-SurfaceShaders.html

1、定义:对顶点着色器和片元着色器进一层封装,主要部分为两个结构体(Input、SurfaceOutput)和编译指令。

2、编译指令:指明表面着色器使用表面的函数和光照函数,并设置可选参数

#pragma surface surfaceFunction lightModel [optionalparams]

表面函数(SurfaceFunction):包含属性友反射率、光滑度、透明度等,使用输入结构体Input 来设置各种属性。

光照函数:使用表面函数来模拟光照效果,Unity内置基于物理的光照模型Standard 和

StandardSpecular,非物理光照模型函数Lambert 和 BlinnPhong。

其他可选参数:

自定义修改函数:

vertex:VertexFunction:顶点修改,实现一些顶点动画等

finalcolor:ColorFunction:最终颜色修改、实现雾效

finalgbuffer:ColorFunction:延迟渲染修改,实现边缘检测等

finalprepass:ColorFunction:Prepass base修改

阴影:

addshadow:添加一个阴影投射Pass,一般FallBack 通用的光照模式可以找到,对于顶点动画、

透明度需要特殊处理。

fullforwardshadows:在前向渲染路径支持所有光源类型的阴影,默认是只有平行光,添加这个参数可以让点光火聚光灯友阴影渲染。

noshadows:取消所有阴影。

透明度混合测试:

alpha、alpha:auto:透明测试

alpha:blend 透明混合

alphatest:VariableName:VariableName 用来剔除不满足的片元

光照:

noambient:不应用任何环境光照或者光照探针(light probe)

novertexlights:不应用逐顶点光照

noforwardadd:去掉所有前向渲染的额外pass,即支持逐像素平行光,其他光源用逐顶点或者阴影计算。

控制代码生成:

exclude_path:deferred,exclude_path:forward,exclude_path:prepass 不需要为特定渲染路径生成代码。

3、两个结构体

Input 结构体

包含主纹理和法线纹理的采样坐标uv_MainTex 和 uv_BumpMap

SurfaceOutput:存储表面属性结构体,作为光照函数输入来计算光照

// Lighting.cginc中定义

struct SurfaceOutput

{

    fixed3 Albedo;  // diffuse color

    fixed3 Normal;  // tangent space normal, if written

    fixed3 Emission;

    half Specular;  // specular power in 0..1 range,高光反射指数部分。

    fixed Gloss;    // specular intensity,高光反射强度系数。

    fixed Alpha;    // alpha for transparencies

};

// UnityPBSLighing.cginc中定义

struct SurfaceOutputStandard

{

    fixed3 Albedo;      // base (diffuse or specular) color

    fixed3 Normal;      // tangent space normal, if written

    half3 Emission;

    half Metallic;      // 0=non-metal, 1=metal

    half Smoothness;    // 0=rough, 1=smooth

    half Occlusion;    // occlusion (default 1)

    fixed Alpha;        // alpha for transparencies

};

struct SurfaceOutputStandardSpecular

{

    fixed3 Albedo;      // diffuse color

    fixed3 Specular;    // specular color

    fixed3 Normal;      // tangent space normal, if written

    half3 Emission;

    half Smoothness;    // 0=rough, 1=smooth

    half Occlusion;    // occlusion (default 1)

    fixed Alpha;        // alpha for transparencies

};

4、表面着色器的渲染流水线

5、表面着色器的优缺点:

优点:表面着色器是在顶点-几何-片元着色器上层的抽象封装,不需要写复杂的代码,直接定义好相关的参数和编译指令就可以实现需要的效果。

缺点:表面着色器必须按照它的规则去写代码,自由度不高,而且内部生成的顶点-几何-片元着色器也不是最优的,往往会产生性能上面的问题。

相关文章

网友评论

      本文标题:Shader 学习之路-表面着色器(四)

      本文链接:https://www.haomeiwen.com/subject/idpmiqtx.html