0

Direct3D 頂点バッファー (ID3D11Buffer) の初期化に使用されるメソッドに、頂点データ (基本クラス メンバー) の配列へのポインターを渡そうとしています。

配列へのポインターである変数「v4」を使用したいのですが、ポインターを正しく逆参照していないと思います。誰かが私を正しい方向に向けることができますか?

この割り当てを行うために多くの方法を試しましたが、基本的な配列しか機能しません (「const void *」エラーにキャストすることもあります)。

ポインターを使用するにはどうすればよいですか?

私が問題を抱えている行は... vertexSubResourceData.pSysMem = v1;です。

(ps Using the VS C++ Nov 2012 CTP コンパイラ.. まだリリースされていません..)

*回答済み: Visual Studio 2012 C++ Nov. CTP コンパイラのバグであることを確認しました。クラス外であっても、C++ 11 初期化構文を使用して宣言された Vector 構造体の配列は、正しく解釈されません (もちろん、間違った配列初期化構文を使用していない限り)。また、注意: これは、ポインタに関連付けられた初期化リストにのみ関係します。*

ありがとう!

// 簡略化されたコード

void Triangle::InitializeVertexBuffer()
{
    struct V
    {
        float X, Y, Z;    // vertex position
    };

    // Compiles But doesn't work as desired.
    // changed from V* v4 = new V[] // Compiled without range.
    // Pointer to this data would ideally come from base static pointer, or file.
    V* v4 = new V[3]     
    {
        { 0.50f, 0.5f, 0.0f },
        { 0.50f, -0.5f, 0.0f },
        { -0.50f, -0.5f, 0.0f },
    };

    // Compiles and Works to prove compiler issue with initialization lists. 
    V* vectorList = new V[3];
    vectorList[0].X = 0.5f;
    vectorList[0].Y = 0.5f;
    vectorList[0].Z = 0.00f;

    vectorList[1].X = 0.5f;
    vectorList[1].Y = -0.5f;
    vectorList[1].Z = 0.00f;

    vectorList[2].X = -0.5f;
    vectorList[2].Y = -0.5f;
    vectorList[2].Z = 0.00f;


    unsigned int size = sizeof(V) * 3; //sizeof(* Model::Vertices);

    // The Description of the Vertex Buffer
    D3D11_BUFFER_DESC vertexBufferDescription = {0};
    vertexBufferDescription.ByteWidth = size;
    vertexBufferDescription.BindFlags = D3D11_BIND_VERTEX_BUFFER; 

    // Model Data to be transferred to GPU Buffer.

    D3D11_SUBRESOURCE_DATA vertexSubResourceData = {0};
    vertexSubResourceData.SysMemPitch = 0;
    vertexSubResourceData.SysMemSlicePitch = 0;

    // Can't figure out how to dereference v4

    vertexSubResourceData.pSysMem = vectorList; // works, but using "v4" doesn't.

    // vertexSubResourceData.pSysMem = Model::Vertices; 
    // This is what I /really/ want .. Pointer to vertice array data from base class


    NS::DeviceManager::Device->CreateBuffer(
        &vertexBufferDescription, 
        &vertexSubResourceData, 
        &NS::ModelRenderer::VertexBuffer);
}
4

1 に答える 1

1

あなたが書くとき、V* v4 = new V[]{...};それは違法なC++です。CTP コンパイラが不正なコードを受け入れています。試すV* v4 = new V[3]{...};

5.3.4p1 からの C++ 標準の確認:

【式】属性指定子seqopt

そのため、 に式が必要なようです[]new V[]コンパイラの拡張機能だと思います(まだこれをチェックしています)。

そして、ildjarn が指摘しているように、配列ではなく、ポインタのアドレスを指定vertexSubResourceData.pSysMem = v4;したいのです。&4

アップデート

これはコンパイラのバグだと思います。古い C++03 構文V* v4 = new V[3]; v4[0] = ...;を試してみてください。それが機能する場合は、間違いなくバグです。

于 2013-01-22T01:17:32.720 に答える