• <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 閱讀(509) 評論(0)  編輯 收藏 引用
            日产精品久久久久久久| 99久久www免费人成精品| 国内精品久久久久久99蜜桃 | 欧美久久亚洲精品| 久久久久久精品免费看SSS| 国产精品久久久久久一区二区三区| 久久99国产精品成人欧美| 久久这里只有精品首页| 久久久久四虎国产精品| 亚洲欧美日韩久久精品| 久久夜色精品国产亚洲| 亚洲va久久久噜噜噜久久男同| 国内精品久久久久国产盗摄| 久久精品a亚洲国产v高清不卡| 亚洲日韩欧美一区久久久久我 | 久久婷婷成人综合色综合| 亚洲欧洲精品成人久久曰影片| 久久精品国产一区| 九九久久自然熟的香蕉图片| 青青青青久久精品国产h久久精品五福影院1421 | 日产精品99久久久久久| 久久久久国产视频电影| 国产91久久精品一区二区| 亚洲午夜久久久影院伊人| 久久国产成人午夜AV影院| 国产精品18久久久久久vr| 久久亚洲AV成人无码| 天堂无码久久综合东京热| 久久久久99精品成人片三人毛片| 亚洲一本综合久久| 91精品国产高清91久久久久久| 狠狠色婷婷久久一区二区| 久久91精品国产91| 伊人久久大香线蕉成人| 精品国产乱码久久久久久人妻| 日韩影院久久| 亚洲一级Av无码毛片久久精品| 亚洲国产小视频精品久久久三级 | 久久亚洲综合色一区二区三区| 久久91精品国产91久久户| 久久免费美女视频|