unity shader编程 平行世界
自己练手的:
老实说,学编程容易导致脑子瓦特超载
Shader "Unlit/NewUnlitShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_offset("myoffset",Range(-10,10))=3
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
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;
float _offset;
float4 offsetvec4 = float4(-1,0,0,0);
float4 quaternionMul(float4 q, float4 r)
{
float3 qv = q.xyz;
float3 rv = r.xyz;
return float4(
cross(qv, rv) + qv * r.w + q.w * rv,
q.w * r.w - dot(qv, rv));
}
float4 rotate(float4 q, float4 p)
{
float4 c = float4(-1.0 * q.xyz, q.w);
float4 t = quaternionMul(q, p);
return quaternionMul(t, c);
}
float4 expands3To4(float3 nnn) {
return float4(nnn.x, nnn.y, nnn.z, 0);
}
float4 modifyscenecenter(float4 modelvertex,float4 centervec4) {
return float4(modelvertex+centervec4);
}
v2f vert (appdata v)
{
v2f o;
float4 viewvec4 = expands3To4(UnityObjectToViewPos(v.vertex));
float deltaX =-_offset- viewvec4.x;
if (deltaX <= 0) { viewvec4.w = 1; o.vertex = mul(UNITY_MATRIX_P,viewvec4); }
if(deltaX>0){
if(viewvec4.y<0){
float myAngle = -deltaX / viewvec4.y;
if(myAngle<3.1415){
float4 quaternion = float4(0,0,-sin(myAngle/2),cos(myAngle/2));
viewvec4 = modifyscenecenter(viewvec4,-_offset*offsetvec4);
viewvec4.x = 0;
viewvec4 = rotate(quaternion,viewvec4);
viewvec4= modifyscenecenter(viewvec4, _offset * offsetvec4);
viewvec4.w = 1;
o.vertex = mul(UNITY_MATRIX_P, viewvec4);
}
if(myAngle>=3.1415){
float4 quaternion = float4(0, 0, -1, 0);
viewvec4 = modifyscenecenter(viewvec4, -_offset * offsetvec4);
float myX = deltaX + 3.1415*viewvec4.y;
viewvec4.x = 0;
viewvec4 = rotate(quaternion, viewvec4);
viewvec4.x = myX;
viewvec4 = modifyscenecenter(viewvec4, _offset * offsetvec4);
viewvec4.w = 1;
o.vertex = mul(UNITY_MATRIX_P, viewvec4);
}
}
}
//o.vertex = UnityObjectToClipPos(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
}
}
}