• <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)  編輯 收藏 引用
            伊人丁香狠狠色综合久久| 囯产极品美女高潮无套久久久| 国产精品久久毛片完整版| 91精品免费久久久久久久久| 亚洲精品无码久久不卡| 久久久久久人妻无码| 久久精品国产国产精品四凭| 亚洲av成人无码久久精品| 久久久精品一区二区三区| 亚洲午夜福利精品久久| 国产精品久久久久影视不卡| 亚洲欧美成人久久综合中文网| 人妻精品久久无码区| 久久免费观看视频| 久久精品国产精品青草app| 99久久无色码中文字幕人妻| 久久午夜福利电影| 久久777国产线看观看精品| 亚洲AV日韩精品久久久久久| 久久影视综合亚洲| 69久久夜色精品国产69| 久久综合久久自在自线精品自| 久久综合久久鬼色| 久久精品亚洲精品国产欧美| 国内精品伊人久久久久| 伊人久久大香线蕉亚洲| 久久亚洲熟女cc98cm| 亚洲精品无码专区久久同性男| 国产精品美女久久久久av爽| 国产精品久久久天天影视| 国产精品久久久久aaaa| 日韩av无码久久精品免费| 亚洲国产欧洲综合997久久| 久久WWW免费人成一看片| 久久综合久久美利坚合众国| 亚洲伊人久久成综合人影院 | 丁香五月网久久综合| 狠狠色丁香久久婷婷综合| 久久人妻无码中文字幕| 77777亚洲午夜久久多人| 亚洲精品无码久久久久|