首页 > 其他分享 >Shader实现翻书效果

Shader实现翻书效果

时间:2024-01-25 13:22:07浏览次数:59  
标签:MainTex 效果 float vertex Shader 翻书 float4 WaveLength v2f

原理

翻书这个过程可以看成是平面上的点都绕z轴旋转,但是直接这样写的话会出现问题。因为旋转轴是在中间的,所以我们在旋转之前要把点向左偏移5个单位这样旋转轴就到了最左边,然后再乘上旋转矩阵得到旋转之后的位置,再向右边偏移5个单位还原一下。这样实现的太生硬了,所以带入正弦函数改变一下顶点的高度,让书页有点弧度。需要注意的是Plane默认是单面的,所以在渲染的时候要双面渲染,不然背面是透明的。

代码

Shader "Custom/Test"
{
	Properties {
		_MainTex("Main Tex", 2D) = "white"{}
        _SecTex("Sec Tex", 2D) = "white"{}
        _Angle("Angle", range(0, 180)) = 0
        _WaveLength("WaveLength", range(-1, 1)) = 1
	}
	SubShader {
       Pass
       {
           Cull Back
           CGPROGRAM
           #pragma vertex vert
           #pragma fragment frag
           #include "Lighting.cginc"
           
           sampler2D _MainTex;
           float4 _MainTex_ST;
           float _Angle;
           float _WaveLength;
           struct a2v
           {
               float4 vertex : POSITION;
               float4 texcoord : TEXCOORD0;
           };

           struct v2f
           {

               float4 pos : SV_POSITION;
               float2 uv : TEXCOORD2;
           };

           v2f vert(a2v v)
           {
               v2f o;
               v.vertex -= float4(5, 0, 0, 0);
               float s;
               float c;
               sincos(radians(_Angle), s, c);
               float4x4 rotation = {
                   c, s, 0, 0,
                   -s, c, 0, 0,
                   0, 0, 1, 0,
                   0, 0, 0, 1
               }; // 绕Z轴旋转的矩阵

               v.vertex.y = s * sin(v.vertex.x * _WaveLength);
               v.vertex = mul(rotation, v.vertex);


               v.vertex += float4(5, 0, 0, 0);
               o.pos = UnityObjectToClipPos(v.vertex);
               o.uv = v.texcoord * _MainTex_ST.xy + _MainTex_ST.zw;
               return o;
           }

           fixed4 frag(v2f i) : SV_TARGET0
           {
               return tex2D(_MainTex, i.uv);
           }
         
           ENDCG
       }

       Pass
       {
           Cull Front
           CGPROGRAM
           #pragma vertex vert
           #pragma fragment frag
           #include "Lighting.cginc"
           
           float _Angle;
           float _WaveLength;
           sampler2D _SecTex;
           float4 _SecTex_ST;
           struct a2v
           {
               float4 vertex : POSITION;
               float4 texcoord : TEXCOORD0;
           };

           struct v2f
           {

               float4 pos : SV_POSITION;
               float2 uv : TEXCOORD2;
           };

           v2f vert(a2v v)
           {
               v2f o;
               v.vertex -= float4(5, 0, 0, 0);
               float s;
               float c;
               sincos(radians(_Angle), s, c); // 输入的是弧度制
               float4x4 rotation = {
                   c, s, 0, 0,
                   -s, c, 0, 0,
                   0, 0, 1, 0,
                   0, 0, 0, 1
               }; // 绕Z轴旋转的矩阵

               v.vertex.y = s * sin(v.vertex.x * _WaveLength);
               v.vertex = mul(rotation, v.vertex);


               v.vertex += float4(5, 0, 0, 0);
               o.pos = UnityObjectToClipPos(v.vertex);
               o.uv = v.texcoord * _SecTex_ST.xy + _SecTex_ST.zw;
               return o;
           }

           // 不考虑光照,所以就直接采样纹理颜色输出就行了
           fixed4 frag(v2f i) : SV_TARGET0
           {
               return tex2D(_SecTex, i.uv);
           }
         
           ENDCG
       }

	} 
	FallBack "Diffuse"
}

参考

https://blog.csdn.net/qq_28299311/article/details/103267750

标签:MainTex,效果,float,vertex,Shader,翻书,float4,WaveLength,v2f
From: https://www.cnblogs.com/monituihuo/p/17986954

相关文章

  • 效果图云渲染活动“喜迎龙年,渲染有礼”正式上线
    Renderbus瑞云渲染在2024年新年之际,特别推出了一个促销活动以庆祝“龙年”,并作为回馈给致力于效果图制作的客户们。在这次活动中,客户们可以在充值期间获得一些可通用的渲染券,这些券可以在后续进行影视动画或效果图渲染时使用。让我们一探究竟,看看此次优惠活动都包含哪些内容。......
  • 无涯教程-CSS - 文字效果
    您可以使用CSS过滤器将特殊效果添加到文本,图像和网页的其他方面,而无需使用图像或其他图形。AlphaChannelAlpha通道滤镜会更改对象的透明度,从而使其融合到背景中,以下参数可以在此过滤器中使用-Sr.No.Parameter&Remark1opacity透明度。0是完全透明的,100是完全不透明的......
  • 前端歌谣-第陆拾陆课-html+css+js实现计算器效果
    前言我是歌谣微信公众号关注前端小歌谣一起学习前端知识今天继续给大家讲解计算器的讲解index.css/*Basicreset*/*{ margin:0; padding:0; box-sizing:border-box; /*Bettertextstyling*/ font:bold14pxArial,sans-serif;}/*FinallyaddingsomeIE9......
  • 按钮效果(转载)Button effect (reprint)
    <title>CodePen-ButtonHoverEffects</title><style>html{padding-top:50px;font-family:"OpenSans",Helvetica,arial,sans-serif;text-align:center;backgr......
  • 2024-1-22动画效果和部分方法
    目录动画效果each.each.data()动画效果//基本show([s,[e],[fn]])hide([s,[e],[fn]])toggle([s],[e],[fn])//滑动slideDown([s],[e],[fn])slideUp([s,[e],[fn]])slideToggle([s],[e],[fn])//淡入淡出fadeIn([s],[e],[fn])fadeOut([s],[e],[fn])fadeTo([[s],o,[e],[......
  • input聚焦,label上移效果
    有一个输入框,有一行lable提示文案,当输入框聚焦,文案上移<divclass="input-area"><inputtype="text"class="__input"required/><labelfor=""class="__tip">Input...</label></div>.input-ar......
  • Unity:Couldn't open include file 'Packages/com.unity.render-pipelines.universal/S
    初学Shader,Unity报错↑,总之是找不到ulsl的Core文件,网上找的其他解决方案例如删除文件夹再生成或者改变shader的某些属性,但是根本找不到。最终找到原因是项目类型不同,要把传统3D升级成URP项目。解决办法:安装UniversalRP拓展1.在unity中打开需要升级的场景,SaveAs一份并打开该场......
  • 2024-01-20:用go语言,小扣在探索丛林的过程中,无意间发现了传说中“落寞的黄金之都“, 而
    2024-01-20:用go语言,小扣在探索丛林的过程中,无意间发现了传说中"落寞的黄金之都",而在这片建筑废墟的地带中,小扣使用探测仪监测到了存在某种带有「祝福」效果的力场,经过不断的勘测记录,小扣将所有力场的分布都记录了下来,forceField[i]=[x,y,side],表示第i片力场将覆盖以坐标......
  • 「云渲染科普」Vray渲染效果图材质参数设置
    ​渲染是创造出引人入胜视觉效果的关键步骤,在视觉艺术领域尤为重要。不过,渲染作为一个资源密集型的过程,每当面对它时,我们往往都会遭遇到时间消耗和资源利用的巨大挑战。幸运的是,有几种方法能够帮助我们优化渲染,使之既高效又经济。例如,通过掌握一些渲染设置技巧,利用云渲染等服务,或......
  • 测试!芝麻代理效果怎么样?数据采集成功率?
    芝麻代理的风评有点两级分化了,有人说垃圾,也有人认为贵有贵的道理。别整这些有的没有的,我们今天就来测试一下,看看真相具体怎么样。HTTP代理的稳定性、匿名程度、响应速度、IP池可用率以及带宽这几个点,是保证我们的数据采集业务成功率,所以我们主要也是测试这些。1.配置我用 python ......