none
D3D9中SetVertexShaderConstantF的使用方法 RRS feed

  • 问题

  • --------背景------------------------------

    我在开发一个的sdk,其中有一个模块使用了D3D9的hlsl硬件加速渲染,提供给用户的是以dll的形式,但是代码中并非纯粹的D3D9,带入了D3DX43.dll,主要使用了D3DXCompileShader函数和D3DXSaveTexturetoMem函数

    ----------问题----------------------------

    问题1:如果在我发布的sdk中携带了D3DX9_43.dll,是否属于侵犯了微软的私有财产

    问题2:如果不使用D3DXCompileShader,转而使用D3DCompile函数,那么将携带D3DCompiler_43.dll,

              这个dll是否侵犯了微软的私有财产

    =================分析与描述========================

    为了不使用这两个DLL,我采用了事先编译HLSL成二进制码的方法,将二进制码和hlsl的源代码(char*格式),直接放在源代码中

    但是没有了D3DX的ID3DXConstantTable,只能直接使用D3D9Device的SetVertexShaderConstantF接口。

    同时自己也需要对hlsl的代码进行解析

    ------hlsl code--------------------------------------------

            

    char* g_cBaseVert =
        "struct VS_INPUT"
        "{"
        "    float4 iPos       : POSITION0;"
        "    float2 iTex       : TEXCOORD0;"
        "};"

        "struct VS_OUTPUT"
        "{"
        "    float4 oPos       : POSITION0;"
        "    float2 oTex       : TEXCOORD0;"
        "};"

        //"float4x4 MVP;"


        "float4x4 Model;"
        "float4x4 View;"
        "float4x4 Proj;"

        "VS_OUTPUT Main(VS_INPUT input)"
        "{"
        "     VS_OUTPUT output  = (VS_OUTPUT)0;"

        //"     output.oPos       = mul(input.iPos, MVP);"


        "     output.oPos       = mul(input.iPos, Model);"
        "     output.oPos       = mul(output.oPos, View);"
        "     output.oPos       = mul(output.oPos, Proj);"

        "   output.oTex    = input.iTex;"
        "    return output;"

        "}";

    -----------------------------------------------------

    以上是一段简单的顶点着色器代码,那么我该如何调用SetVertexShaderConstantF接口呢

    我尝试直接在外部计算MVP矩阵,传入着色器SetVertexShaderConstantF(0,mvp,4),是没问题的

    但是使用以下代码,分别传入Model View Proj就会有问题

    SetVertexShaderConstantF(0,Model,4)

    SetVertexShaderConstantF(4,View,4)

    SetVertexShaderConstantF(8,Proj,4)

    我无法得知内部的寄存器和矩阵的对应关系:

    https://msdn.microsoft.com/en-us/library/windows/desktop/bb172943(v=vs.85).aspx

    阅读了MSDN变得更加困惑了,里面的StartRegister似乎毫无规律

    而就算我自己指定register,还是有问题。

    ================最终问题====================

    使用SetVertexShaderConstantF传1个矩阵进入顶点着色器是没问题的,传入2个以上就会有问题。

    应该如何配置StartRegister?

    2017年11月27日 6:46

全部回复

  • Hi,

    感谢在MSDN论坛发帖。

    >>我尝试直接在外部计算MVP矩阵,传入着色器SetVertexShaderConstantF(0,mvp,4),是没问题的

    但是使用以下代码,分别传入Model View Proj就会有问题

    请提供一些具体的错误信息。你有没有检查过SetVertexShaderConstantF的返回值?

    这里有篇文章,关于Writing HLSL Shaders in Direct3D 9。你可以参考一下。

    https://msdn.microsoft.com/en-us/library/windows/desktop/bb944006(v=vs.85).aspx

    >>问题1:如果在我发布的sdk中携带了D3DX9_43.dll,是否属于侵犯了微软的私有财产

    问题2:如果不使用D3DXCompileShader,转而使用D3DCompile函数,那么将携带D3DCompiler_43.dll,

    该论坛是关于c++开发问题讨论。对于是否侵权的问题,建议你connect到Microsoft来询问。

    谢谢你的理解与支持。

    Best Regards,

    Baron Bi


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已建议为答案 Baron Bi 2017年12月12日 7:11
    2017年11月27日 9:53