游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5526|回复: 7

HLSL里mul函数的问题

[复制链接]

8

主题

15

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2008-7-19 11:19:00 | 显示全部楼层 |阅读模式
一个点,向量通过矩阵变换是因该:矩阵X向量
在HLSL里为什么向量乘以矩阵都是这样的形式mul(向量,矩阵)?
比如世界矩阵乘以顶点就是mul(pos,mat)

19

主题

42

帖子

44

积分

注册会员

Rank: 2

积分
44
发表于 2008-7-19 12:21:00 | 显示全部楼层

Re:HLSL里mul函数的问题

因为DX的矩阵是逆的
如果是OpenGL那就是mul(mat,pos)

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2008-7-19 15:07:00 | 显示全部楼层

Re:HLSL里mul函数的问题

一个点,向量通过矩阵变换是因该:矩阵X向量
----这里向量 看做 是列向量,对吧。这里的矩阵是OpenGL标准

而 M$ 为了与众不同,它采用 (行)向量 * 转置的OpenGL矩阵。

但是到了 shader 中,M$ 的这种方法就显得不方便了,因为需要用4条 dp4 指令实现,你想想...

所以需要 OpenGL矩阵 * (列)向量,但这又不符合 M$ 的书写顺序,所以他就 mul vector, matrix
(这里的 matrix 采用OpenGL矩阵,即 M$ 矩阵的 转置 )

http://bbs.gameres.com/showthread.asp?threadid=110042
投票: 关于变换矩阵的行列性(不懂请勿乱选)   ( 1 2 3 )

简单的说 M$ 的 mul 是一个“混血儿”。(我从来不用,很恶心,还是GL的好)

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2008-7-19 15:12:00 | 显示全部楼层

Re:HLSL里mul函数的问题

从另一个 抽 象 的 角度去看,可以认为,M$ 的 hlsl 里面用的仍然是 M$ 独家标准的 矩阵。
(即 行向量 * OpenGL矩阵的转置)

但是我们这样认为: 在 shader的寄存器里面,在矩阵的物理存储上,用的是颠倒的顺序。
而从  M$ 的 逻辑上看,仍然是 M$ 标准。只不过确实需要用 OpenGL标准来进行物理存储。  

8

主题

15

帖子

15

积分

新手上路

Rank: 1

积分
15
 楼主| 发表于 2008-7-21 20:48:00 | 显示全部楼层

Re:HLSL里mul函数的问题

虽然自己搞明白了,但是还要谢谢各位解答~

0

主题

11

帖子

36

积分

注册会员

Rank: 2

积分
36
发表于 2008-7-22 09:43:00 | 显示全部楼层

Re: HLSL里mul函数的问题

左手矩阵和右手坐标系的区别。对应向量为行向量,或者列向量。
因为用那种的都有。不过dx 用了行向量,而opengl 用了列向量
这里也没ms啥事。
科学计算大部分列,工业大部分用行。也没这么绝对。呵呵,左手对右手而已

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2008-7-23 14:35:00 | 显示全部楼层

Re: HLSL里mul函数的问题

只有topameng说得比较正确,除了左右手系部分。

左右手系和行矩阵列矩阵没关系。OpenInventor是基于OpenGL的,右手系,但它是用行矩阵。

行矩阵的乘法的结合律是从左到右,列矩阵是从右到左。工业领域一般采用行矩阵,因为行元素在内存里是连续的,内存访问效率比列矩阵高。

64

主题

272

帖子

272

积分

中级会员

Rank: 3Rank: 3

积分
272
发表于 2008-7-23 16:18:00 | 显示全部楼层

Re:HLSL里mul函数的问题

同意LS的,我们上课用的线性代数也是行向量,所以看DX看的比较舒服……
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-21 22:13

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表