• <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精品国产91久久久久久青草| 成人免费网站久久久| 91久久精品无码一区二区毛片| 久久激情五月丁香伊人| 亚洲精品久久久www| 潮喷大喷水系列无码久久精品| 99久久国产热无码精品免费久久久久 | 久久久噜噜噜久久中文字幕色伊伊| 久久亚洲AV成人无码电影| 亚洲国产精品久久久久| 中文精品99久久国产| 久久亚洲国产欧洲精品一| 伊人久久精品无码av一区| 91久久精品电影| MM131亚洲国产美女久久| 久久男人中文字幕资源站| 久久久久久久久无码精品亚洲日韩 | 久久久久一级精品亚洲国产成人综合AV区| 亚洲国产一成久久精品国产成人综合| 久久久精品人妻一区二区三区四| 伊人久久无码精品中文字幕| 国产免费久久久久久无码| 国产精品久久久久9999高清| 亚洲AV无一区二区三区久久 | 久久久久久午夜精品| 国内精品久久久久久久涩爱| 99久久99这里只有免费的精品| 亚洲中文字幕无码久久2020| 伊人伊成久久人综合网777| 久久一本综合| 武侠古典久久婷婷狼人伊人| 久久露脸国产精品| 久久er国产精品免费观看8| 精品久久人人做人人爽综合| 久久国产午夜精品一区二区三区| 久久精品国产99久久香蕉| 久久国产视频网| 波多野结衣久久精品| 久久精品国产99国产精品亚洲|