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

表面着色器官方文档: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、表面着色器的优缺点:

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

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 八点钟,风声未醒 换季的风铃再也摇不动屋檐瓦栋 雨声垂直的滴落,湿了好几回年轻 谁的童言无忌在湖上摇荡 我的思绪往...
    曾昭阅读 325评论 3 1
  • 我想还是写篇日记吧 昨晚睡前他们问我去不去爬铜鼓嶂,我想了想,还是去了,毕竟那么懒去锻炼 记得去年登高之时阳光明媚...
    peng格林T阅读 277评论 0 1
  • 以2010为界限划定年份 是2010年以后的机票么?金币侍从-,否定 机票为2010年以前(这里没有划定是否包含2...
    Gin_堇阅读 239评论 0 0
  • 每次拜读经典书籍的时候,崇敬之心油然而生。每一部经典都具备丰富的内涵,而且作者无不是在人生中,遭遇凄惨跌荡中获得写...
    本能发动阅读 442评论 0 0

友情链接更多精彩内容