标签:inpu exclude 写入 应用 cto table str 顶点 信息
Ox00 Surface Shader Syntax
常用的三种输出数据格式:
//Standard output structure of surface shaders is this:
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
};
//Unity 5版本以上, 支持physically based lighting models.
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
};
?
0x01 Surface Shader compile directives
Surface shader编码在CGPROGRAM...ENDCG块内,
- 必须在Subshader块内而不能在pass内部,Surface shader将自己编译成多个通道.
- 必须使用#pragma surface surfaceFunction lightModel [optionalparams] 指令来表明这是surface shader.
拆分#pragma surface surfaceFunction lightModel [optionalparams]
必要参数:
surfaceFunction |
格式void surf (Input IN, inout SurfaceOutput o),Input自定义结构常必须包含纹理坐标和其他自需变量 |
lightModel |
Standard lighting |
使用SurfaceOutputStandard |
StandardSpecular lighting |
使用SurfaceOutputStandardSpecular |
Lambert and BlinnPhong |
不支持基于物理照明,低端设备用 |
|
surfaceFunction 中Input参数纹理坐标必须带uv或uv2前缀
struct Input
{
????float2 uv_MainTex;
????floatX 其他变量;
}
其他变量 |
说明 |
float3 viewDir |
视图方向为了计算时差、边缘光照等效果,Input需要包含视图方向 |
float4 color |
每个顶点颜色值 |
float4 screenPos |
屏幕空间位置,为了获得反射效果 |
float3 worldPos |
世界坐标空间 |
float3 worldRefl |
世界空间反射向量,surface shader不能写入o.Normal参数 |
float3 worldNormal |
世界空间法向量,surface shader不能写入o.Normal参数 |
float3 worldRefl;INTERNAL_DATA |
世界坐标反射向量,surface shader必须写入o.Normal参数。基于逐像素法线贴图获得反射向量,请使用WorldReflectionVector(IN,o.Normal) |
float3 worldNormal;INTERNAL_DATA |
世界坐标法线向量,surface shader必须写入o.Normal参数。基于逐像素法线贴图获得反射向量,请使用WorldReflectionVector(IN,o.Normal) |
可选参数:optionalparams
Transparency and alpha testing
使用alpha and alphatest指令
|
?
|
fade-transparency或premultiplied transparency |
alpha:blend |
混合 |
alpha:fade |
淡出 |
alpha:premul |
预乘(使半透明表面保留适当的镜面反射) |
alphatest:VariableName |
基于给定变量值执行cutout |
keepalpha |
始终在alpha channel写入1.0 |
decal:add |
叠加在表面上,并执行叠加混合 |
decal:blend |
Alpha混合 |
|
Custom modifier functions用于计算更改输入的顶点数据,或更改最终计算的片元色 |
vertex:VertexFunction |
修改计算per-vertex data |
finalcolor:ColorFunction |
? |
finalgbuffer:ColorFunction |
在deferred path生效 |
finalprepass:ColorFunction |
在forward path生效。base path |
|
Shadows and Tessellation 阴影和网格细分 |
addshadow |
? |
fullforwardshadows |
在forward path下,除了支持默认的一个方向光阴影,还可支持点光和聚光阴影 |
tessellate:TessFunction |
//待详细补充 |
|
Code generation options
调整生成着色器代码选项,使得shader更小加载更快
|
?
exclude_path:deferred, |
exclude_path:forward, |
exclude_path:prepass |
|
不给指定的渲染路径生成passes |
noshadow |
关闭接受所有阴影 |
noambient |
不使用环境光和探头 |
novertexlights |
在forward path下禁用探头和逐顶点光照 |
nolightmap |
关闭所有光照贴图 |
nodynlightmap |
禁用运行时动态GI |
nodirlightmap |
不支持方向光光照贴图 |
nofog |
禁用所有内置fog |
nometa |
不生成meta pass(提取光照贴图和GI信息用) |
noforwardadd |
禁用forward path中additive pass,支持一个完整的方向光和所有逐顶点/SH计算的光 |
nolppv |
不再支持Light Probe Proxy Volume组件 |
noshadowmask |
禁用阴影遮罩 |
|
Miscellaneous options 各种其他选项 |
softvegetation |
only be rendered Soft Vegetation |
interpolateview |
在顶点着色器中计算视图方向并进行插值;而不是在像素着色器中计算它。这可以使像素着色更快,但会消耗更多的纹理插值器。 |
halfasview |
传递半角向量而不是视图向量到光照函数。半角向量将被逐顶点计算和标准化。这更快,但不完全正确。 |
approxview |
被遗弃了。用interpolateview |
dualforward |
基本不用(官方内置shader没搜到) |
dithercrossfade |
使表面着色器支持抖动效果。然后,您可以将这个着色器应用到GameObjects中,这些GameObjects使用为交叉淡入过渡模式配置的LOD组组件。 |
|
?
表面着色器的工作原理
0x02 Surface Shader Light Model
Lighting.cginc
UnityLambertLight |
基于非物理的漫反射 |
LightingLambert |
//..待补充 |
LightingLambert_Deferred |
//.. |
LightingLambert_PrePass |
//.. |
UnityBlinnPhongLight |
基于非物理的镜面高光 |
LightingBlinnPhong |
//.. |
LightingBlinnPhong_Deferred |
//.. |
LightingBlinnPhong_PrePass |
//.. |
LightingLambert_GI |
//.. |
LightingBlinnPhong_GI |
//.. |
?
half4 Lighting (SurfaceOutput s, UnityGI gi);forward path,不依赖视图方向
half4 Lighting (SurfaceOutput s, half3 viewDir, UnityGI gi); forward path,依赖视图方向
half4 Lighting_Deferred (SurfaceOutput s, UnityGI gi, out half4 outDiffuseOcclusion, out half4 outSpecSmoothness, out half4 outNormal); deferred lighting paths
half4 Lighting_PrePass (SurfaceOutput s, half4 light); Use this in light prepass (legacy deferred) lighting paths. in light prepass (legacy deferred) lighting paths
half4 Lighting_GI (SurfaceOutput s, UnityGIInput data, inout UnityGI gi);自定义GI解析光照贴图和探针数据
自定义光照函数:
?
0x03 Example
UnityShader基础效果-Surface Shader
标签:inpu exclude 写入 应用 cto table str 顶点 信息
原文地址:https://www.cnblogs.com/baolong-chen/p/11621189.html