Shader学习的基础知识(十三)镜面效果
一个摄像机的渲染结果会输出到颜色缓冲中,并显示到我们屏幕上。GPU允许我们把整个三维场景渲染到一个中间缓冲中,即渲染目标纹理。而不是传统的帧缓冲或后备缓冲。与之相关的还是多重渲染目标纹理。
Unity为目标纹理专门定义了一种纹理类型,渲染纹理,有两方式可以创建。
方法一:在Project目录下创建一个渲染纹理,然后把摄像机渲染目标设置为渲染纹理,这样一来该摄像机的渲染纹理就会实时更新到渲染纹理中,而不是屏幕上。
方法二:在屏幕后处理使用GradPass命令或OnRenderImage函数来获取当前屏幕图像。Unity会把这个屏幕图放在一张分辨率同等的渲染纹理中,下面我们可以在自定义的Pass中把它当前变通纹理来处理。
镜子效果
这里用的是方法一:
Step1:和创建Cube一样创建一个TenderTexture。
Step2:创建一个摄像机并把赋予它。
Step3:创建一个Quad把再材质赋予它。
Step4:把RenderText赋予给材质。
才是代码如下:
Shader "Custom/TestShader21" {
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;
// 因为镜子是反的
o.uv.x = 1 - o.uv.x;
return o;
}
fixed4 frag(v2f i) : SV_Target {
return tex2D(_MainTex, i.uv);
}
ENDCG
}
}
FallBack Off
}