ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

HLSL中mul函数的使用

2021-11-07 16:30:46  阅读:325  来源: 互联网

标签:存储 r0 HLSL 函数 矩阵 v0 mul o0


一、mul函数

mul函数的作用是完成向量与矩阵的乘法运算,有如下两种形式

        1、mul(v, M):行向量v乘以矩阵M

        2、mul(M, v):矩阵乘以列向量v

默认情况下,矩阵是按列选取(column-major matrix picking),也就是每个寄存器存储矩阵的一列,M=(c0, c1, c2, c3);如果是按行选取(row-major matrix picking),那么每个寄存器存储的是矩阵的一行.

下面说明在默认按列选取情况下,mul的两种实现方式

1、mul(v, M)

    dp4 o0.x, v0, c0
    dp4 o0.y, v0, c1
    dp4 o0.z, v0, c2
    dp4 o0.w, v0, c3

dp4的作用是完成4维向量的点积,结果存储在o0中

2、mul(M, v)

    mul r0, c1, v0.y
    mad r0, c0, v0.x, r0
    mad r0, c2, v0.z, r0
    mad o0, c3, v0.w, r0

实现原理:o0 = c0*x + c1*y + c2*z + c3*w

其中mad完成是mul add两个操作,即mad d, a, b, c <<==>> d = a * b + c

对于在hlsl中,如果对顶点进行变换,选取用那个形式进行计算取决于矩阵的存储形式以拾取方式,具体情况如下:

        1、如果用Effect::SetMatrix进行矩阵的设置,那么就用mul(v, M),因为在SetMatrix时,会进行矩阵的转置操作。或者用mul(v, transpos(M))

        2、如果不用Effect::SetMatrix进行矩阵的设置,比如Ogre,那么传入shader中的矩阵就是按行存储的,故采用mul(M, v)

下面截图分别是矩阵在GPU的存储形式和CPU端的存储形式

GPU 端

CPU端

 可见在没有通过Effect::SetMatrix设置时,存储表现形式是一样的。最后一列表示的是平移变换

二、矩阵构造

在HLSL中矩阵的构造如下:

float4x4 mt = float4x4(v0,  v1, v2, v3);

                    = {v00 , v01 , v02, v03 ,

                        v10 , v11 , v12 , v13 ,

                        v20 , v21 , v22 , v13 ,

                        v30 , v31 , v32 , v33}    

即按行序构造。

mt[0]获取的是第0行元素的值v0

标签:存储,r0,HLSL,函数,矩阵,v0,mul,o0
来源: https://blog.csdn.net/a812073479/article/details/121191482

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有