DirectX 10 شبكة العازلة غير محاذاة مشكلة؟ كيفية حساب موجي obj مؤشر؟

StackOverflow https://stackoverflow.com/questions/968276

  •  13-09-2019
  •  | 
  •  

سؤال

كتبت برنامجا لتقديم نموذج Wavefront OBJ في DirectX 10

قمت بتحميل بيانات Vertexes كما يلي DESC

D3D10_INPUT_ELEMENT_DESC defaultLayout[] =
{
    {"POSITION",    0, DXGI_FORMAT_R32G32B32_FLOAT,     0, 0,                               D3D10_INPUT_PER_VERTEX_DATA, 0},  
    {"NORMAL",      0, DXGI_FORMAT_R32G32B32_FLOAT,     0, D3D10_APPEND_ALIGNED_ELEMENT,    D3D10_INPUT_PER_VERTEX_DATA, 0}, 
    {"COLOR",       0, DXGI_FORMAT_R32G32B32A32_FLOAT,  0, D3D10_APPEND_ALIGNED_ELEMENT,    D3D10_INPUT_PER_VERTEX_DATA, 0}, 
    {"TEXCOORD",    0, DXGI_FORMAT_R32G32_FLOAT,        0, D3D10_APPEND_ALIGNED_ELEMENT,    D3D10_INPUT_PER_VERTEX_DATA, 0}, 
}; 
r = D3DX10CreateMesh(Graphics()->GetDevice(),defaultLayout,4,
                        "POSITION",NumVerts(),12,D3DX10_MESH_32_BIT,
                        &mpMesh);
    if(FAILED(r))
    {
        throw cGameError(L"Can not create mesh");
    }
    r= mpMesh->SetVertexData(0,&m_verts[0]);
    if(FAILED(r))
    {
        throw cGameError(L"Can not Set VertexData");
    }
    //mpMesh->SetIndexData(&m_tris[0],m_tris.size()*3);
    mpMesh->CommitToDevice();

كما ترون، لم أقوم بإعداد مؤشر مخزن مؤقت ل MPMESH. أنا لا أعرف كيفية حساب فهرس Vertexes. كما ترون، فإن تنسيق Vertex الخاص بي يتضمن طبيعيا، مما يعني أن نفس موضع Vertex قد يكون له طبيعي مختلف. على سبيل المثال، يحتوي مكعب على 36 رأسا ولكن 8 موقف مختلف فقط. يستخدم ملف Wavefront OBJ فقط مؤشر 8 موضع.

يقوم البرنامج بإنشاء الخطأ التالي في وقت التشغيل

DrawIndexed: Vertex Buffer Stride (15) at the input vertex slot 0 is not aligned properly. The current Input Layout imposes an alignment of (4) because of the Formats used with this slot.

EXECUTION ERROR #367: DEVICE_DRAW_VERTEX_STRIDE_UNALIGNED 

لست متأكدا مما إذا كان السبب من خلال عدم إعداد مؤشر شبكة أو مشاكل أخرى. أي تعليق هو موضع ترحيب.

شكرا لكم جميعا.

هل كانت مفيدة؟

المحلول

لا يمكنك استخدام بيانات OBJ في شكلها الأصلي، لأن بعض البيانات مشتركة بين القمم كما ذكرت. يسمح D3D فقط بمؤشر واحد لكل قمة، وليس فهرس واحد لكل سمة لكل قمة. لذلك أثناء تحميل البيانات، لكل إخراج Vertex تحتاج إلى نسخ جميع البيانات التي يستخدمها (هناك خيارات أخرى ولكن هذا أبسط). بمجرد القيام بذلك، لا توجد حاجة إلى مخزن مؤقت مؤشر، لأنك لا تعيد إعادة استخدام أي قوس - استخدم السحب ().

الخطأ المحدد يرجع إلى عنوان محدد به في مكالمة ID3D10DEVICE :: SETVERTEXBUFFERS ()، والتي لم تظهرها. وهذا يدعي أنك وضعت خطوة بين القمم ليكون 15 بايت. هذا ليس مضاعف 4 (مطلوب بواسطة تنسيقات العناصر التي تستخدمها)، وهي أيضا ليست بحجم بيانات رأسك. من الإعلان، حجم قمة الرأس الخاص بك هو 48 بايت.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top