• <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 閱讀(518) 評論(0)  編輯 收藏 引用
            久久久精品久久久久久| 色诱久久av| 91精品国产综合久久香蕉| 精品久久久久久无码中文字幕| 久久精品不卡| 国产精品女同久久久久电影院| 久久精品国产只有精品66| 97久久婷婷五月综合色d啪蜜芽| 香蕉久久夜色精品国产小说| 尹人香蕉久久99天天拍| www久久久天天com| 久久中文字幕人妻丝袜| 久久精品国内一区二区三区| 一本一本久久aa综合精品| 国产激情久久久久影院老熟女免费 | 国产精品9999久久久久| 久久精品国产一区二区电影| 狠狠色婷婷综合天天久久丁香| 久久久久久午夜精品| 久久精品不卡| 久久免费精品一区二区| 久久w5ww成w人免费| 久久久久久久久久久| 日韩中文久久| 久久天天婷婷五月俺也去 | 久久天天躁夜夜躁狠狠| 久久国产美女免费观看精品| 久久99热国产这有精品| 国产美女久久精品香蕉69| 久久午夜无码鲁丝片| 久久久久国产精品人妻| 人人妻久久人人澡人人爽人人精品| 欧美精品福利视频一区二区三区久久久精品 | 精品久久久久久久久午夜福利 | 99久久精品国产麻豆| 少妇久久久久久久久久| 久久久久亚洲AV无码麻豆| 亚洲AV无码久久精品狠狠爱浪潮| 亚洲中文字幕无码久久2017| 久久精品人人做人人爽97 | 午夜精品久久久久久久久|