我的shader学习之五
本篇依然是笔记
这次的内容是做一个玻璃,
这个东西实际实现里shader不复杂,但是实际操作比较多
这个东西用到了两个摄像机,也就是通过一个摄像机把它的摄像内容渲染到一个中间缓冲上,即渲染目标纹理。这个东西的使用是unity提供的。(暂时不知道opengl里面是怎么做的)
我们设置一个片的材质,然后把这个片儿放在对应的模型后面,然后前后各一个摄像机,如下图
然后两个摄像机看到的分别是
然后我们可以看到一个摄像机看到的内容就可以被拿到用作镜子,可以把一个摄像机的场景图像渲染到一张render_texture上。
然后shader去使用这张render_texture。
使用方式是在camera组件里去设置
里面的Target Texture
然后我们来看shader。
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
//渲染纹理
Shader "Unity Shaders Book/Chapter 10/Mirror" {
Properties {
_MainTex ("Main Tex", 2D) = "white" {} //渲染纹理
}
SubShader {
Tags { "RenderType"="Opaque" "Queue"="Geometry"}
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
sampler2D _MainTex;
struct a2v {
float4 vertex : POSITION;
float3 texcoord : TEXCOORD0;
};
struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
};
v2f vert(a2v v) { //顶点函数
v2f o;
o.pos = UnityObjectToClipPos(v.vertex); //转换顶点坐标到裁剪空间
o.uv = v.texcoord; //纹理
// Mirror needs to filp x
//o.uv.x = 1 - o.uv.x; //x反向
return o;
}
fixed4 frag(v2f i) : SV_Target {
return tex2D(_MainTex, i.uv); //取纹理坐标
}
ENDCG
}
}
FallBack Off
}
这里其实非常简单,就是去获取渲染纹理,然后x轴反向就行。
ps:这里补充一点关于unity设置主摄像机的。
第一是设置Tag为MainCamera,第二是设置target texture,(亲自试了只设置1并没有起效果,设置target texture为空就是让其参与主摄像机)