Unity中Shader旋转矩阵(四维旋转矩阵)

这篇具有很好参考价值的文章主要介绍了Unity中Shader旋转矩阵(四维旋转矩阵)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

在上篇文章中,我们推算出了Shader物体旋转所使用的二维旋转矩阵。

  • Unity中Shader旋转矩阵(二维旋转矩阵)

在这篇文章中,我们来推算得到四维旋转矩阵。


一、围绕X轴旋转

围绕X轴旋转代表,物体顶点的X轴不变。

1、可以使用上篇文章中,同样的方法推导得出围绕X轴旋转的点阵。

Unity中Shader旋转矩阵(四维旋转矩阵),Unity,unity,矩阵,java

  • 我们把P2增加一维且分量为1

2、求Mrotate

  • Mrotate * P1 = P2
  • Mrotate = P2* P1-1
    Unity中Shader旋转矩阵(四维旋转矩阵),Unity,unity,矩阵,java
  • 最后得到Mrotate
    Unity中Shader旋转矩阵(四维旋转矩阵),Unity,unity,矩阵,java

二、围绕Y轴旋转

围绕Y轴旋转代表,物体顶点的Y轴不变。

1、可以使用上篇文章中,同样的方法推导得出围绕Y轴旋转的点阵。

Unity中Shader旋转矩阵(四维旋转矩阵),Unity,unity,矩阵,java

  • 我们把P2增加一维且分量为1

2、求Mrotate

  • Mrotate * P1 = P2
  • Mrotate = P2* P1-1
    Unity中Shader旋转矩阵(四维旋转矩阵),Unity,unity,矩阵,java
  • 最后得到Mrotate
    Unity中Shader旋转矩阵(四维旋转矩阵),Unity,unity,矩阵,java

三、围绕Z轴旋转

围绕Z轴旋转代表,物体顶点的Z轴不变。

1、可以使用上篇文章中,同样的方法推导得出围绕Z轴旋转的点阵。

Unity中Shader旋转矩阵(四维旋转矩阵),Unity,unity,矩阵,java

  • 我们把P2增加一维且分量为1

2、求Mrotate

  • Mrotate * P1 = P2
  • Mrotate = P2* P1-1
    Unity中Shader旋转矩阵(四维旋转矩阵),Unity,unity,矩阵,java
  • 最后得到Mrotate
    Unity中Shader旋转矩阵(四维旋转矩阵),Unity,unity,矩阵,java

可以修改sin函数前面的负号位置实现顺时针还是逆时针。这篇文章中是顺时针


四、在Shader实现

1、在属性面板定义四维变量,用xyz控制XYZ轴上的旋转

_Rotation(“Rotation(XYZ)”,Vector) = (0,0,0,0)

2、在常量缓冲区申明该变量

CBUFFER_START(UnityPerMaterial)
float4 _Rotation;
CBUFFER_END

3、在 顶点着色器 定义旋转矩阵

float4x4 M_rotateX = float4x4
(
1,0,0,0,
0,cos(_Rotation.x),sin(_Rotation.x),0,
0,-sin(_Rotation.x),cos(_Rotation.x),0,
0,0,0,1
);
float4x4 M_rotateY = float4x4
(
cos(_Rotation.y),0,sin(_Rotation.y),0,
0,1,0,0,
-sin(_Rotation.y),0,cos(_Rotation.y),0,
0,0,0,1
);
float4x4 M_rotateZ = float4x4
(
cos(_Rotation.z),sin(_Rotation.z),0,0,
-sin(_Rotation.z),cos(_Rotation.z),0,0,
0,0,1,0,
0,0,0,1
);

4、使用旋转矩阵与模型顶点相乘输出

v.vertexOS = mul(M_rotateX,v.vertexOS);
v.vertexOS = mul(M_rotateY,v.vertexOS);
v.vertexOS = mul(M_rotateZ,v.vertexOS);

5、最终效果

Unity中Shader旋转矩阵(四维旋转矩阵),Unity,unity,矩阵,java文章来源地址https://www.toymoban.com/news/detail-766090.html


五、最终测试代码

//平移变换
//缩放变换
//旋转变换(四维)
Shader "MyShader/URP/P3_5_7"
{
    Properties
    {
        _Translate("Translate(XYZ)",Vector) = (0,0,0,0)
        _Scale("Scale(XYZ)",Vector)= (1,1,1,1)
        _Rotation("Rotation(XYZ)",Vector) = (0,0,0,0)
    }
    SubShader
    {
        Tags
        {
            "PenderPipeline"="UniversalPipeline"
            "RenderType"="Opaque"
            "Queue"="Geometry"
        }
        Pass
        {
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            
            #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"

            struct Attribute
            {
                float4 vertexOS : POSITION;
            };

            struct Varying
            {
                float4 vertexCS : SV_POSITION;
            };

            CBUFFER_START(UnityPerMaterial)
            float4 _Translate;
            float4 _Scale;
            float4 _Rotation;
            CBUFFER_END
            Varying vert (Attribute v)
            {
                Varying o;
                //平移变换
                float4x4 M_Translate = float4x4
                    (
                    1,0,0,_Translate.x,
                    0,1,0,_Translate.y,
                    0,0,1,_Translate.z,
                    0,0,0,1
                    );
                v.vertexOS = mul(M_Translate,v.vertexOS);
                //缩放交换
                float4x4 M_Scale = float4x4
                    (
                    _Scale.x,0,0,0,
                    0,_Scale.y,0,0,
                    0,0,_Scale.z,0,
                    0,0,0,1
                    );
                v.vertexOS = mul(M_Scale,v.vertexOS);
                //旋转变换
                float4x4 M_rotateX = float4x4
                    (
                    1,0,0,0,
                    0,cos(_Rotation.x),sin(_Rotation.x),0,
                    0,-sin(_Rotation.x),cos(_Rotation.x),0,
                    0,0,0,1
                    );
                float4x4 M_rotateY = float4x4
                    (
                    cos(_Rotation.y),0,sin(_Rotation.y),0,
                    0,1,0,0,
                    -sin(_Rotation.y),0,cos(_Rotation.y),0,
                    0,0,0,1
                    );
                float4x4 M_rotateZ = float4x4
                    (
                        cos(_Rotation.z),sin(_Rotation.z),0,0,
                        -sin(_Rotation.z),cos(_Rotation.z),0,0,
                        0,0,1,0,
                        0,0,0,1
                    );
                v.vertexOS = mul(M_rotateX,v.vertexOS);
                v.vertexOS = mul(M_rotateY,v.vertexOS);
                v.vertexOS = mul(M_rotateZ,v.vertexOS);
                o.vertexCS = TransformObjectToHClip(v.vertexOS.xyz);
                return o;
            }

            half4 frag (Varying i) : SV_Target
            {
                return 1;
            }
            ENDHLSL
        }
    }
}

到了这里,关于Unity中Shader旋转矩阵(四维旋转矩阵)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity矩阵平移旋转缩放Matrix4x4

    最近在研究帧同步定点数物理系统中需要自定义定点数矩阵,所以在这里分享下基础的矩阵案例旋转、平移、缩放。(注意这里本文中的transform组件式基于unity浮点数的教程并非帧同步定点数)参考原文 参数可以参考我上图的参数,这里注意三个顶点是一个面,这里我上述的

    2024年01月17日
    浏览(32)
  • 【Unity Shader】Unity阴影

    记录下在unity中如果想实现阴影,有哪些路子可以选择,目前看有两种 1.经典的shadowmap 2.planar projection 如果开启renderer组件的cast shadows为on,开启平行光的light组件的shadow type,那么就会在物体shader中寻找LightMode=ShadowCaster的Pass进行渲染 场景有两个物体,平面和球体,使用unity内

    2024年02月09日
    浏览(42)
  • Unity | Shader基础知识(第一集:unity中最简单的shader)

    目录 一、unity的shader 二、创建一个shader(在创建时,选前三种都可以) 三、内容解读 1.shader一直都在 2.我们写shader在写什么 四、没有被干预的shader(最简单的shader) 相关阅读 编写着色器概述 - Unity 手册 一、unity的shader unity写的shader并不是真正意义上的shader。 官方解释:

    2024年02月04日
    浏览(42)
  • 【Unity Shader】Unity前向渲染

    ForwardBase Pass(优先渲染),渲染一个逐像素平行光和所有的顶点/球面调和光,阴影只和平行光有关系,那阴影应该是这个Pass中实现的 ForwardAdd Pass(需要和Base配合使用,否则不生效),渲染剩余全部逐像素灯光 Unity会根据场景中各个光源的设置以及这些光源对物体的影响程

    2024年02月08日
    浏览(47)
  • 【Unity Shader】Shader Graph

    shader graph 入门: (对基础内容进行详细介绍) Shader Graph入门-CSDN博客 unity-shader(入门)_unity3d shader-CSDN博客 各种效果的节点配置: 【unity造轮子】Unity ShaderGraph使用教程与各种特效案例(2023/12/1更新)_unity特效-CSDN博客 大佬文章里所用的PBR Master更新后已经没有了,所以参考

    2024年02月01日
    浏览(45)
  • Unity Shader variants (shader 变体)

    官方地址 https://docs.unity3d.com/cn/2022.2/Manual/SL-MultipleProgramVariants.html 教程可以看这里 https://www.jianshu.com/p/48ad75f0b4b9 https://www.jianshu.com/p/3e6b84317097 变种用我自己的理解就是 能用程序控制的shader 举个例子 这里声明了 a b c d 四个变量(其实是开关 下面会说) 记住 #pragma multi_compil

    2024年02月12日
    浏览(26)
  • 【Unity Shader】Unity中阴影映射标准制作流程

    前半部分的基于图片的实时阴影技术是百人计划的前半部分总结,后面的Unity中的实现过程是《入门精要》中的实现。 这里的“基于图片”指阴影生成一张图片。 他并不是一个基于图片的解决方案,但思路值得借鉴。 缺点:只能投影到平面;投影物体必须在光线和平面之间

    2023年04月17日
    浏览(26)
  • Unity | Shader基础知识(什么是shader)

    Shader的中文名叫着色器。 着色器的作用: 这个世界是3D的,包括在Unity的场景中,我们建的球球,方块块之类的,都是3D的,但是,屏幕是2D的,把3D的东西,通过颜色的汇总,显示在2D的屏幕上。 想知道颜色是怎么合到一起的,我们就找个图片,把它拆开看。 因为世界上所有

    2024年02月15日
    浏览(50)
  • 【Unity Shader】Unity中利用GrabPass实现玻璃效果

    《入门精要》中模拟玻璃是用了Unity里的一个特殊的Pass来实现的,这个Pass就是 GrabPass ,比起上一篇博客实现镜子的方法,这个方法我认为相对复杂,因此在实现之前需要对GrabPass及实现原理做一个更加详细的介绍。 场景物体拜访和贴图完全参考《入门精要》: 以及当前场景

    2024年02月09日
    浏览(34)
  • Unity Shader - UI/Default shader 优化示例

    Unity : 2020.3.37f1 Pipeline : BRP 做性能优化都是慢慢都扣出来的 当然,优先处理 top 热点的 但是一些就算不是 top,但是像素面积有多,overdraw 也多不可小觑 当然,如果你能找到性能热点,那还是优先分析一下哪些 shader 占的 cycles 最高,和 A, L/S, T, 最高 还有 register 的数量尽可能

    2024年02月07日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包