• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            還沒想好
            還沒想好
            posts - 4,comments - 6,trackbacks - 0
            http://www.gamedev.net/community/forums/topic.asp?topic_id=412504

            No... In true, PVWp is wrong because P,V and W (as Direct3D defines) were created to satisfy the [row vector]*[matrix] multiplying order. In other words, the content of a transformation matrix could be different depending on the multiplying rule.

            For example, consider a translation matrix:

            For a [row vector]*[matrix] multiplying order, it is described as:
            1 0 0 0
            0 1 0 0
            0 0 1 0
            x y z 1
            

            For a [matrix]*[column vector] multiplying order, it is described as:
            1 0 0 x
            0 1 0 y
            0 0 1 z
            0 0 0 1
            

             


            I don't know the math details you're attempting to work out... I'm really bad at formal math theory. I do however know the D3D details of what's going on. Perhaps if I explain what D3D is doing, it'll help you.

            Matrix in memory normally.
            11 12 13 14
            21 22 23 24
            31 32 33 34
            41 42 43 44

            Normally a vector * matrix such a D3DXMatrixTransform will do:
            outx = vec dot (11,21,31,41)
            outy = vec dot (12,22,32,42)
            outz = vec dot (13,23,33,43)
            outw = vec dot (14,24,34,44)

            When you give a matrix to a shader, it is transposed, which offers a small optimization for most matrices, which I'll explain in a bit. After it's transposed, it's stored in 4 constant registers (or 3... I'll get to that).

            c0 = 11,21,31,41
            c1 = 12,22,32,42
            c2 = 13,23,33,43
            c3 = 14,24,34,44

            Next, in the shader performing a "mul(vec,mat)" will do this:
            v0 = input register containing position
            r0 = temp register
            dp4 r0.x, v0, c0 // (r0.x = v0 dot c0)
            dp4 r0.y, v0, c1
            dp4 r0.z, v0, c2
            dp4 r0.w, v0, c3

            As you can see, this is the same as D3DXMatrixTransform. Why does D3D perform a hidden transpose? To save precious constant space. You can declare your matrix as float4x3 and the transformation becomes:
            dp4 r0.x, v0, c0
            dp4 r0.y, v0, c1
            dp4 r0.z, v0, c2
            mov r0.w, (some constant holding 1)

            Any time the matrix isn't a projection, ie: for world, worldview, view, and bones especially, you can drop a constant without affecting the results, as it's always a (0,0,0,1) vector. Back in shader 1.1 with only 96 constants, it was a big deal. If you had 20 bone matrices, that would be either 80 or 60 constants. Personally, I'd take the 60, leaving more room for lights, fog, texture transforms, etc. It also takes time to upload all those useless (0,0,0,1) vectors to the video card, which is another small savings.

            posted on 2010-07-20 11:25 MDnullWHO 閱讀(516) 評論(0)  編輯 收藏 引用
            久久91亚洲人成电影网站| 91久久福利国产成人精品| 久久福利资源国产精品999| 久久久久久精品免费看SSS| 久久精品国产亚洲AV麻豆网站| 久久精品亚洲中文字幕无码麻豆| 97超级碰碰碰久久久久| 国产精品岛国久久久久| 国产成人久久精品麻豆一区| 老司机午夜网站国内精品久久久久久久久| 亚洲国产天堂久久综合| 久久国产精品成人片免费| 亚洲午夜久久久| 亚洲乱亚洲乱淫久久| 人妻精品久久无码专区精东影业| 中文字幕久久欲求不满| 亚洲va中文字幕无码久久| 久久精品一区二区影院| 久久精品成人免费网站| 伊人久久精品无码二区麻豆| 国产综合成人久久大片91| 久久精品蜜芽亚洲国产AV| 亚洲欧洲久久av| 热久久国产欧美一区二区精品| 97久久精品无码一区二区| 成人久久免费网站| 欧美一区二区久久精品| 午夜精品久久久久成人| 久久精品无码一区二区日韩AV| 久久精品国产亚洲av高清漫画 | 2021最新久久久视精品爱| 国产精品无码久久四虎| 99久久99久久精品国产片果冻| 久久香蕉国产线看观看精品yw| 久久久久久曰本AV免费免费| 色婷婷噜噜久久国产精品12p | 亚洲AV乱码久久精品蜜桃| 中文字幕精品无码久久久久久3D日动漫 | 久久久久久久久无码精品亚洲日韩 | 一级做a爱片久久毛片| 日韩一区二区久久久久久|