没有一个程序员想写错的代码,但没有一个程序员能不写错的代码
而美术向的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;
博客记录了美术向TA代码中的一些亮点。包括线性空间转Gamma、返回透明颜色的材质球、用step替换if else等内容。介绍了HLSL中step函数的用法及如何结合改造算法替代if else逻辑判断,还提及声明定义作用和剔除颜色的方法。

2568





