convertScene.shader 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
  2. Shader "Unlit/convertScene"
  3. {
  4. Properties
  5. {
  6. _MainTex ( "Texture" , 2D) = "white" {}
  7. _Twist( "Twist" , float ) = 1
  8. _TestValue("TestValue", float) = 10
  9. }
  10. SubShader
  11. {
  12. Tags { "RenderType" = "Opaque" }
  13. LOD 100
  14. Pass
  15. {
  16. CGPROGRAM
  17. #pragma vertex vert
  18. #pragma fragment frag
  19. // make fog work
  20. #pragma multi_compile_fog
  21. #include "UnityCG.cginc"
  22. struct appdata
  23. {
  24. float4 vertex : POSITION;
  25. float2 uv : TEXCOORD0;
  26. };
  27. struct v2f
  28. {
  29. float2 uv : TEXCOORD0;
  30. UNITY_FOG_COORDS(1)
  31. float4 vertex : SV_POSITION;
  32. };
  33. sampler2D _MainTex;
  34. float4 _MainTex_ST;
  35. float4 _MainTex_TexelSize;
  36. float _Twist;
  37. v2f vert (appdata v)
  38. {
  39. v2f o;
  40. o.vertex = UnityObjectToClipPos(v.vertex);
  41. o.uv = TRANSFORM_TEX(v.uv, _MainTex);
  42. UNITY_TRANSFER_FOG(o,o.vertex);
  43. return o;
  44. }
  45. fixed4 frag (v2f i) : SV_Target
  46. {
  47. fixed2 tuv = i.uv;
  48. //这里将当前纹理坐标平移至中心点,表示按中心旋转,
  49. //如果有需要,可以算出3d坐标在屏幕上的位置,然后根据屏幕位置做平移
  50. fixed2 uv = fixed2(tuv.x - 0.5, tuv.y - 0.5);
  51. //通过距离计算出当前点的旋转弧度PI/180=0.1745
  52. float angle = _Twist * 0.1745 / (length(uv) + 0.1);
  53. float sinval, cosval;
  54. sincos(angle, sinval, cosval);
  55. //构建旋转矩阵
  56. float2x2 mat = float2x2(cosval, -sinval, sinval, cosval);
  57. //旋转完成后,平移至原位置
  58. uv = mul(mat, uv) + 0.5;
  59. // sample the texture
  60. fixed4 col = tex2D(_MainTex, uv);
  61. // apply fog
  62. // UNITY_APPLY_FOG(i.fogCoord, col);
  63. return col;
  64. }
  65. ENDCG
  66. }
  67. }
  68. }