error:

1.

mul' implicit truncation of vector type

2.

matrixXXX: array dimensions of(unknown scope entry kind) must be explicit------------(XXXX(float3X4 matrix[]))-->(XXXX(float3X4 matrix[12]))

this problem refers to a          para     float 3X4 matrix[]

changed to       float 3X4 matrix[3][4]

transpose(M)

下面引用的两个人我同意第二个,第一个人灰色部分我认为反了

opengl ,cg   :    column-major   mul(matrix, pos) pos 列向量

dx              :     row-major       mul(pos, matrix) pos 行向量

cg change to hlsl的

solution :应该就是 mul(matrix, pos)--->  mul(pos, transpose(matrix))

这个solution有待验证

无论行向量 列向量 添加第四个的方法

float4 pos= float4(pos, 1);

float4 normal=float4(normal, 0);

float4 tangent=float4(tangent,0)

------------------------

这个问题 解决了 原来是两个问题混在一起

(XXXX(float3X4 matrix[]))-->(XXXX(float3X4 matrix[12]))我之前改为 matrix[3][4]这样compile通过但是意义很错

我忽略的那个问题就是 float3X4 matrix[12] is a 3 dims matrix   so  matrix[1] means a array of 3X4 not a array of 1X4 of 3X1

对于 cg --->hlsl  mul 的问题 solution 明确:mul(matrix, pos)--->  mul(pos, transpose(matrix))

引用放最后

--------------------------------------------------------

http://msdn.microsoft.com/en-us/library/windows/desktop/bb509706(v=vs.85).aspx

http://www.cnitblog.com/wjk98550328/archive/2007/09/27/34077.html

看dx sdk原文

The data in a matrix is loaded into shader constant registers before a shader runs. There are two choices for how the matrix data is read: in row-major order or in column-major order. Column-major order means that each matrix column will be stored in a single constant register, and row-major order means that each row of the matrix will be stored in a single constant register. This is an important consideration for how many constant registers are used for a matrix.

Row-major and column-major matrix ordering determine the order the matrix components are read from the constant table or from shader inputs. Once the data is written into constant registers, matrix order has no effect on how the data is used or accessed from within shader code. Also, matrices declared in a shader body do not get packed into constant registers.

解释:

这个row-major和column-major,只是决定你提供给shader的矩阵如何被理解,如果存入寄存器。举个例子,shader code中有column-major的float4x3 matWorld,那么你设置的时候提供一个4×3的矩阵,这个矩阵将占3个float4的寄存器,每列占一个,进行乘法计算的时候,必须是mul(pos,matWorld),也就是pos左乘这个矩阵。

如果shader中一个row-major的float3×4的矩阵,也占3个寄存器,乘法的时候是mul(matWorld,pos),就是pos右乘矩阵。

上面做法效率一样,结果一样。

如果,你混淆着瞎来,结果不是你想要的,就是占多寄存器之类。。。。

------------------

OpenGL:  按列存储矩阵(column-major)。调用API形成的矩阵用来和一个列向量相乘,矩阵在左,列向量在右
GLSL:   存储方式和OpenGL相同(column-major)
DirectX:    按行存储矩阵(row-major)。调用API形成的矩阵用来和一个行向量相乘,矩阵在右,行向量在左
HLSL: 存储方式和DirectX相反(column-major)

此,若HLSL的矩阵也是用来右乘行向量,则应将DX API构造的矩阵做Transpose,这样数学上HLSL会将Transpose后的矩阵视为 和DX API构造的矩阵是同一个矩阵,但是实际数值的存储顺序不同。若用来将矩阵左乘列向量,则可以不必做Transpose。

因此,一般的传入shader的操作是原封不动的将用来存储矩阵的array导入shader。但是如果是用的effect system里的setMatrix(), 则会先自动将矩阵由row-major改为colunn-major存储,再将其导入shader。这种情况下则无需在导入前手动Transpose 矩阵。

http://alvincc-tech.blogspot.com/2010/10/opengl-glsl-directx-hlsl.html

------------------------
 
这个问题还没完''' 显示测试之后 发现skin这里不对 人被拉成通向无限远的长面片
解决方法
缩小范围 确认导致问题的函数---就是上面的transpose matrix 3X4
 上文的解决方法在数学上看起来合理 但我忽略了一个问题 就是 这个matrix其实已经被转置过了
(就这一个解释了,很惭愧不能像pix那样调试只能根据结果来猜)
所以把这个矩阵定义成4X4 mul(pos,matrix)这样就可以了 1X4x4X4
显示结果就正确啦
 
-------------------------
这事还没完,有些小部件不对,明显是bonetransform 不太对
把define float 4x4row_major float4x4 去掉mul也交换之后,还是不对人又在另外的方向被拉伸到无穷大了,
也就是排除了这row major引发错误的可能性
 
注释一点,其实cgfx->hlsl的改动 不用手动交换mul的两个参数 
#define float4x4 row_major float4x4  配合相应的mul顺序 两者配合对了以后 换与不换结果是一样的
#define float4x4 row_major float4x4配 mul(pos,transformMatrix);
#define mul(a,b) mul((b),transpose(a))//这句很逆天吧 这样就不用挨个改了
                  还有个很常用的是 #define tex2D(a,b) a.Sample(globalSamplerState,(b).xy)
没有define float4x4 row_major float4x4配 mul(transformMatrix, pos);
这两者的显示结果是一样的
 
最终用4x4 matrix 传skinvertex
需要用float4第四位 w不能舍弃 ,这样就对了.
 
这下应该是真对了.

hlsl 和cg 涉及 mul 左乘 右乘的更多相关文章

  1. c++ 左值右值 函数模板

    1.先看一段代码,这就是一种函数模板的用法,但是红色的部分如果把a写成a++或者写成一个常量比如1,都是编译不过的,因为如果是a++的话,实际上首先是取得a的 值0,而0作为一个常量没有地址.写成1也 ...

  2. printf:函数参数计算从右向左,从左向右?

    造冰箱的大熊猫@cnblogs 2019/8/3 1.问题 某天写了如下代码: unsigned char ReadByteFromFile ( FILE * fp ) { unsigned char ...

  3. 【代码笔记】iOS-可以向左(右)滑动

    一,效果图. 二,代码. RootViewController.m - (void)viewDidLoad { [super viewDidLoad]; // Do any additional se ...

  4. js实现图片加载特效(从左到右,百叶窗,从中间到两边)

    /* 网上百度的,感觉”从中间到两边“的效果写的不是很好,改了一下,感觉可以了!*/<html> <head> <title></title> < ...

  5. 剑指offer系列——二维数组中,每行从左到右递增,每列从上到下递增,设计算法找其中的一个数

    题目:二维数组中,每行从左到右递增,每列从上到下递增,设计一个算法,找其中的一个数 分析: 二维数组这里把它看作一个矩形结构,如图所示: 1 2 8 2 4 9 12 4 7 10 13 6 8 11 ...

  6. layer-list实现只有左、右和下边框的圆角矩形

    项目中需要实现如下效果的布局 也就是一个左右下角带圆角,上方不带圆角的白色背景矩形,而且只有左.右和下边框,颜色为浅灰色. 当然,切一个.9图片作为背景也能实现,但是能用代码实现的还是尽量用代码实现, ...

  7. UIButton 一个控件 实现 左图标右文本的效果

    UIButton 一个控件 实现 左图标右文本的效果 如图,我们要实现一个 左边图标右边文本的效果,一般 可以考虑是 UIImageView + UILabel 不过,其实一个UIButton就可以搞 ...

  8. c#实现数据的左补右补功能

    /// <summary>        /// 左補右補功能        /// </summary>        /// <param name="st ...

  9. 没做过编译器就是被人欺——从一道变态的i++题猜编译器的行为(表达式从左往右扫描,同一变量相互影响)

    首先不要被人蒙了,如果是这样,根本编译不过: int i=1; int b=i+++++i; printf("%d %d\n", b ,i); Mingw报错:error: lva ...

随机推荐

  1. php_1

    简介:(“PHP: Hypertext Preprocessor”,超文本预处理器的字母缩写)是一种被广泛应用的开放源代码的多用途脚本语言,它可嵌入到 HTML中,尤其适合 web 开发,语言的风格有 ...

  2. 8款给力HTML5/CSS3应用插件 可爱的HTML5笑脸

    1.HTML5/CSS3实现笑脸动画 非常可爱 今天我们要分享一款基于纯CSS3实现的笑脸动画,我们只要在面部滑动鼠标,即可让人物的眼睛嘴巴动起来,实现微笑的效果,还挺可爱的. 在线演示 源码下载 2 ...

  3. 【leetcode】13. Roman to Integer

    题目描述: Given a roman numeral, convert it to an integer. 解题分析: 这道题只要百度一下转换的规则,然后着这解释写代码即可.实现上并没有什么难度,直 ...

  4. Codevs 2898 卢斯的进位制

    时间限制: 1 s  空间限制: 32000 KB  题目等级 : 青铜 Bronze 题目描述 Description 著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母 ...

  5. 存储过程及Comm.cs类的创建

    2013-09-25 13:08:59 一.准备工作 首先创建一个数据库,如创建“试用期公务员管理”数据库:再创建一个Comm.cs类,添加代码如下: using System;using Syste ...

  6. 实现textarea自适应的方法

    1.用div来模拟实现textarea自适应 <!doctype html> <html lang="en"> <head> <meta ...

  7. 防火墙设置:虚拟机ping不通主机,但是主机可以ping通虚拟机(转载)

    我在Windows7系统安装了虚拟机,通过虚拟机安装了Ubuntu13.04,我设置的主机与虚拟机的连接方式是桥接,安装好后,发现虚拟机ping不通主机,但是主机可以ping通虚拟机. 我的操作是:关 ...

  8. apk反编译之二——smali学习

    在apk被反编译后,原来的java程序会以smali文件呈现.这就需要补充smali的知识.依旧参考官方文档,择日我将把官方文档做一下翻译.今日先贴出链接地址: 1:了解smali字节码的寄存器 请参 ...

  9. Laravel 5 基础(一)- Laravel入门和新建项目

    此系列文章是 laracasts.com 中的入门系列视频的笔记,我做了一些修改,可以参考此系列文章来学习 Laravel 5.原视频作者是 Jeffrey Way, 在此感谢.本人使用的系统是Mac ...

  10. Delphi XE5教程4:程序和单元概述

    内容源自Delphi XE5 UPDATE 2官方帮助<Delphi Reference>,本人水平有限,欢迎各位高人修正相关错误!也欢迎各位加入到Delphi学习资料汉化中来,有兴趣者可 ...