UnityShader基础方法代码合集不断补充中

博客记录了美术向TA代码中的一些亮点。包括线性空间转Gamma、返回透明颜色的材质球、用step替换if else等内容。介绍了HLSL中step函数的用法及如何结合改造算法替代if else逻辑判断,还提及声明定义作用和剔除颜色的方法。

没有一个程序员想写错的代码,但没有一个程序员能不写错的代码

而美术向的TA写的代码甚至不能看,辣眼睛

确实是不够看的

只不过,只盯着问题看还是无法解决问题

需要各取所需,只涉取优点,亮点,则不需要解决产生问题的人都能够变得没问题

所以,记录下一些非程序员的写法

 

线性空间转Gamma

			half3 GammaToLinear(in half3 v)
			{
#if defined(UNITY_COLORSPACE_GAMMA)
				return v * v;
#else
				return v;
#endif
			}
			half3 LinearToGamma(in half3 v)
			{
#if defined(UNITY_COLORSPACE_GAMMA)
				return sqrt(v);
#else
				return v;
#endif
			}

返回透明颜色,而不是黑色的材质球

					//fragment shader
					half alpha = (color.r + color.g + color.b) * _AlphaImpl;
					return half4(color, alpha);
					
					//return half4(color, 1);//必然会黑色的方法,因为color=0,而alpha=1

用step替换if else

(chu出处:https://blog.csdn.net/liu_if_else/article/details/77455639

在HLSL中, step(a,b)既是当b>=a时返回1,否则返回0,换句话说既是当a<=b时返回1,否则返回0。因此可以把被比较数灵活的插入a或b的位置,完成小于或大于的比较。由于返回值是0或1,它无法直观的替代if else逻辑判断,需要结合改造算法,例如:

				//边缘判定
				float edge=max(dot(i.N,i.V),0);

				if(edge<_Edge){
					return _EdgeColor;
				}

上文中,直接返回的_EdgeColor,将在下文中变为一个000或保持自身值的rgb变量,新增的一个edge变量会变为0或1的开关,并在最后的计算步骤中参与最终颜色的计算:

				//边缘判定
				float edge=max(dot(i.N,i.V),0);

				edge=step(edge,_Edge); //if(edge<=_Edge) edge=1 , else edge=0

				_EdgeColor*=edge;
				//...中间过程略...
			//0.5Kd or Kd  1or0		1or0       0or1	  0orEdgeColor	
				col=(Kd*diffuseLight+Ks)*(1.0f-edge)+_EdgeColor;

声明,定义为inline和uniform的作用是?

inline void applyRim(
    inout half4 finalColor,
    half nDotL,
    half nDotV)
{
}

当然,还有很多声明

precision highp float;
precision highp int;
uniform 	vec4 _MainTex_TexelSize;
uniform lowp sampler2D _MainTex;
in highp vec2 vs_TEXCOORD0;
layout(location = 0) out mediump vec4 SV_Target0;
vec4 u_xlat0;
mediump vec3 u_xlat16_0;
lowp vec3 u_xlat10_0;
lowp vec3 u_xlat10_1;
mediump vec3 u_xlat16_2;

剔除颜色的方法

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

avi9111

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值