Unity3D 中的 X-Ray 透视效果

unity_xray

感觉是第三次写Xray了,最早是 stage3d, 然后是 havok, 现在是u3d… 真是闲的蛋疼。。。
不过u3d 写shader 真是比 havok 方便多了, 比如混合模式,深度检测方式都可以直接和 shader一起写,而havok 中还要去shader外部配置。。

直接上完整shader好了,渲染2次,1次深度测试以小于缓冲区的深度通过,绘制透视部分, 第二次正常渲染

请不要无脑复制转载本文, 由 dreamfairy 原创, 转载请注明出处 本文地址 http://www.dreamfairy.cn/blog/2016/05/27/unity3d-%e4%b8%ad%e7%9a%84-x-ray-%e9%80%8f%e8%a7%86%e6%95%88%e6%9e%9c/

Shader “Aoi/XRayShader”
{
Properties
{
_MainTex(“Texture”, 2D) = “white” {}
_RayColor(“RayColor”, COLOR) = (0,0,1,0)
}
SubShader
{
Pass
{
Tags{ “RenderType” = “Transparent” “Queue” = “Transparent” }
Blend One OneMinusSrcAlpha
Cull Back
ZTest Greater
ZWrite Off

CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog

#include “UnityCG.cginc”
#include “Lighting.cginc”

struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
float4 normal : NORMAL;
};

struct v2f
{
UNITY_FOG_COORDS(0)
float4 vertex : SV_POSITION;
float2 uv : TEXCOORD1;
float4 diff : TEXCOORD2;
};

v2f vert(appdata v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = v.uv;

float3 worldNormal = normalize(mul(_Object2World, float4(v.normal.xyz,0)).xyz) * -1; //将法线转换到世界空间, * -1 是为了有外轮廓的效果,因此将法线翻转
float3 viewDirection = normalize(_WorldSpaceCameraPos); //将视野也转到相同的世界空间
o.diff = max(0, dot(viewDirection, worldNormal)); //计算视野和法线的夹角 将垂直的部分不填色

return o;
}

uniform float4 _RayColor;

fixed4 frag(v2f i) : SV_Target
{
_RayColor *= i.diff.x;
return _RayColor;
}
ENDCG
}

Pass
{
Tags{ “RenderType” = “Opaque” }
ZWrite On
ZTest LEqual

CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog

#include “UnityCG.cginc”

struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};

struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
};

sampler2D _MainTex;
float4 _MainTex_ST;

v2f vert(appdata v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}

fixed4 frag(v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
ENDCG
}

}
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注