战魂小筑

讨论群:309800774 知乎关注:http://zhihu.com/people/sunicdavy 开源项目:https://github.com/davyxu

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  257 随笔 :: 0 文章 :: 506 评论 :: 0 Trackbacks

完成自己的shader系统后,翻出之前写过的代码中发现有一个地方很奇怪

我的矩阵定义跟OGRE的没什么区别

        union 
        {
            struct
            {
                float m11, m12, m13, m14;
                float m21, m22, m23, m24;
                float m31, m32, m33, m34;
                float m41, m42, m43, m44;
            };
            float m[4][4];
        };

   乘法也跟OGRE的一模一样,但在将view及project乘好的矩阵送给HLSL时,却必须转置下,才能得到正确的结果

mSkinnedEffect.mMatrix.mValue = (camera.mViewMatrix * camera.mProjectMatrix).Transpose();

shader:

float4 localpos = mul(In.Position, skinTransform);

 

    OGRE中有这么一段代码及注释:

    const Matrix4& AutoParamDataSource::getProjectionMatrix(void) const
    {
        if (mProjMatrixDirty)
        {
            // NB use API-independent projection matrix since GPU programs
            // bypass the API-specific handedness and use right-handed coords
            if (mCurrentRenderable && mCurrentRenderable->getUseIdentityProjection())
            {
                // Use identity projection matrix, still need to take RS depth into account.
                RenderSystem* rs = Root::getSingleton().getRenderSystem();
                rs->_convertProjectionMatrix(Matrix4::IDENTITY, mProjectionMatrix, true);
            }
            else
            {
                mProjectionMatrix = mCurrentCamera->getProjectionMatrixWithRSDepth();
            }
            if (mCurrentRenderTarget && mCurrentRenderTarget->requiresTextureFlipping())
            {
                // Because we're not using setProjectionMatrix, this needs to be done here
                // Invert transformed y
                mProjectionMatrix[1][0] = -mProjectionMatrix[1][0];
                mProjectionMatrix[1][1] = -mProjectionMatrix[1][1];
                mProjectionMatrix[1][2] = -mProjectionMatrix[1][2];
                mProjectionMatrix[1][3] = -mProjectionMatrix[1][3];
            }
            mProjMatrixDirty = false;
        }
        return mProjectionMatrix;
    }

貌似是跟左右手这个恶心的东西有关系

回看DirectXSDK中提供的BasicHLSL例子

        mWorld = g_mCenterWorld * *g_Camera.GetWorldMatrix();
        mProj = *g_Camera.GetProjMatrix();
        mView = *g_Camera.GetViewMatrix();
 
        mWorldViewProjection = mWorld * mView * mProj;
 
        V( g_pEffect->SetMatrix( "g_mWorldViewProjection", &mWorldViewProjection ) );

shader:

Output.Position = mul(vAnimatedPos, g_mWorldViewProjection);

丝毫无需转置矩阵,Effect接口中也提供有SetMatrixTranspose这类方法。所以排除内部有自动转置的嫌疑。

询问过野猪这个问题,野猪答曰:"转置后传输至需要传3个vector, 最后一个是[0 0 0 1]”

有达人知道的,可以指点下迷津 :)

posted on 2010-03-17 11:08 战魂小筑 阅读(2639) 评论(2)  编辑 收藏 引用 所属分类: 渲染 Shader 引擎

评论

# re: 讨论:shader与矩阵转置[未登录] 2010-03-18 09:40 清风
OGRE使用的是列主矩阵,简单说就是左乘列向量,而你在HLSL中的写法是行向量左乘矩阵,自然需要转置  回复  更多评论
  

# re: 讨论:shader与矩阵转置 2010-03-18 10:50 Goteet
ogre和opengl一样用的列主矩阵吧  回复  更多评论
  

# re: 讨论:shader与矩阵转置 2010-07-02 16:03 ZealKing
行矩阵和列矩阵的区别吧

gl是右乘 列矩阵

dx是左乘 行矩阵  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理