博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Cg入门18:Fragment shader - 边缘泛光和透明
阅读量:2201 次
发布时间:2019-05-03

本文共 3932 字,大约阅读时间需要 13 分钟。

泛光:
处理后效果:
透明:
1.
tags{
"queue" = "transparent }     //调整渲染顺序
2.blend srcAlpha oneMinussrcalpha   //混合透明
3. 
zwrite off                        //写入的z轴深度关掉
关掉z轴深度与不关掉的区别:
代码:
Shader "Sbin/trans" {	Properties {		_Scale("Scale",Range(1,8)) = 2	}		SubShader {		tags{"queue" = "transparent" }				pass{			blend srcAlpha oneMinussrcalpha			zwrite off	//写入的z轴深度关掉					CGPROGRAM			#pragma vertex vert			#pragma fragment frag			#include "UnityCG.cginc"			struct v2f{				float4 pos : POSITION;				float4 col : COLOR;				float3 normal:TEXCOORD0;				float4 vertex:TEXCOORD1;			};			v2f vert(appdata_base v){				v2f o;								o.pos = mul(UNITY_MATRIX_MVP,v.vertex);				o.col = fixed4(0,1,1,1);				o.vertex = v.vertex;				o.normal = v.normal;								return o;			}						float _Scale;						fixed4 frag(v2f v):COLOR			{				float3 N = mul((float3x3)_World2Object,v.normal);				N = normalize(N);								float4 wpos = mul(_Object2World,v.vertex);				float3 V = _WorldSpaceCameraPos.xyz - wpos.xyz;				V = normalize(V);								float bright = 1 -saturate(dot(N,V));				bright = pow(bright,_Scale);								return fixed4(1,1,1,1)*bright;			}			ENDCG					}	} 		FallBack "Diffuse"}
优化部分:
怎么关掉pass方法,
方法1:注释掉
方法2:blend zero one  (解释:zero 表示0乘以当前pass颜色输出,0就是不输出;one就是全部输出前面的pass通道计算的颜色值)
dstAlpha : 当前渲染的alpha值乘以当前alpha值
srcAlpha :采用原始alpha乘以当前alpha值
blendop revsub
:用之前pass渲染的颜色值减去当前的pass颜色值
代码:
Shader "Sbin/trans" {	Properties {		_MainColor("MainColor",Color) = (1,1,1,1)		_Scale("Scale",Range(1,10)) = 2		_Outer("Outer",Range(0,1)) = 0.2			}		SubShader {		tags{"queue" = "transparent" }				pass{			blend srcAlpha oneMinussrcalpha			zwrite off	//写入的z轴深度关掉					CGPROGRAM			#pragma vertex vert			#pragma fragment frag			#include "UnityCG.cginc"			struct v2f{				float4 pos : POSITION;				float4 col : COLOR;				float3 normal:TEXCOORD0;				float4 vertex:TEXCOORD1;			};						float _Scale;			fixed4 _MainColor;			float _Outer;			v2f vert(appdata_base v){				v2f o;								v.vertex.xyz += v.normal*_Outer;								o.pos = mul(UNITY_MATRIX_MVP,v.vertex);				o.col = fixed4(0,1,1,1);				o.vertex = v.vertex;				o.normal = v.normal;								return o;			}												fixed4 frag(v2f v):COLOR			{				float3 N = mul((float3x3)_World2Object,v.normal);				N = normalize(N);								float4 wpos = mul(_Object2World,v.vertex);				float3 V = _WorldSpaceCameraPos.xyz - wpos.xyz;				V = normalize(V);								float bright = saturate(dot(N,V));				bright = pow(bright,_Scale);								_MainColor.a *= bright;								return _MainColor;			}			ENDCG		}				//==============================================================================				pass{			blendop revsub			blend dstAlpha one  //之前的alpha值			//blend zero one			zwrite off	//写入的z轴深度关掉					CGPROGRAM			#pragma vertex vert			#pragma fragment frag			#include "UnityCG.cginc"			struct v2f{				float4 pos : POSITION;			};			v2f vert(appdata_base v){				v2f o;				o.pos = mul(UNITY_MATRIX_MVP,v.vertex);				return o;			}						fixed4 frag(v2f v):COLOR			{				return fixed4(1,1,1,1);			}			ENDCG		}				//==============================================================================				pass{			blend srcAlpha oneMinussrcalpha			//blend zero one			zwrite off	//写入的z轴深度关掉					CGPROGRAM			#pragma vertex vert			#pragma fragment frag			#include "UnityCG.cginc"			struct v2f{				float4 pos : POSITION;				float4 col : COLOR;				float3 normal:TEXCOORD0;				float4 vertex:TEXCOORD1;			};			v2f vert(appdata_base v){				v2f o;								o.pos = mul(UNITY_MATRIX_MVP,v.vertex);				o.col = fixed4(0,1,1,1);				o.vertex = v.vertex;				o.normal = v.normal;								return o;			}						float _Scale;						fixed4 frag(v2f v):COLOR			{				float3 N = mul((float3x3)_World2Object,v.normal);				N = normalize(N);								float4 wpos = mul(_Object2World,v.vertex);				float3 V = _WorldSpaceCameraPos.xyz - wpos.xyz;				V = normalize(V);								float bright = 1 - saturate(dot(N,V));				bright = pow(bright,_Scale);								return fixed4(1,1,1,1)*bright;			}			ENDCG		}	} 		FallBack "Diffuse"}
你可能感兴趣的文章
一文了解强化学习
查看>>
CART 分类与回归树
查看>>
seq2seq 的 keras 实现
查看>>
seq2seq 入门
查看>>
什么是 Dropout
查看>>
用 LSTM 做时间序列预测的一个小例子
查看>>
用 LSTM 来做一个分类小问题
查看>>
详解 LSTM
查看>>
按时间轴简述九大卷积神经网络
查看>>
详解循环神经网络(Recurrent Neural Network)
查看>>
为什么要用交叉验证
查看>>
用学习曲线 learning curve 来判别过拟合问题
查看>>
用验证曲线 validation curve 选择超参数
查看>>
用 Grid Search 对 SVM 进行调参
查看>>
用 Pipeline 将训练集参数重复应用到测试集
查看>>
PCA 的数学原理和可视化效果
查看>>
机器学习中常用评估指标汇总
查看>>
什么是 ROC AUC
查看>>
Bagging 简述
查看>>
详解 Stacking 的 python 实现
查看>>