سؤال

أنا جديدة تماما DirectX و أود أن ألفت بعض تناظري الأوليات مع أبسط Direct3D التكوين (لأغراض التعلم).وقد سبق لي أن وجهت بعض الأوليات مع تحويل القمم ، وهذا هو القمم مع D3DFVF_XYZRHW مجموعة العلم.

الآن أنا أحاول أن تحصل على نفس الناتج مع تناظري القمم, ولكن أنا لا أحصل على أي صور على الشاشة.لقد غيرت بلدي ففف وتعديلها القمم ولكن لم يحدد أي مصفوفة التحويل (العالم, إطلالة, الإسقاط) حتى الآن.هل من الضروري تعيين أي من تلك المصفوفات?أود أن نفترض أن كل شيء يعمل تماما مثل مع تحويل القمم عندما لا المصفوفات ، ولكن من الواضح أن هذا ليس هو الحال.

منطقة ما (في العالم-إحداثيات) مرئيا من قبل الافتراضي ؟ ماذا يجب القيام به من أجل جعل هذا العمل ؟

هذا هو أساسا ما أقوم به:

struct Vertex
{
    float x, y, z;
    D3DCOLOR color;

    static const DWORD format = D3DFVF_XYZ | D3DFVF_DIFFUSE;
};


const Vertex vertices[] =  {
                           {0.0f, 0.8f, 0.5f, D3DCOLOR_XRGB(255, 255, 255)},
                           {0.8f, -0.8f, 0.5f, D3DCOLOR_XRGB(255, 255, 255)},
                           {-0.8f, -0.8f, 0.5f, D3DCOLOR_XRGB(255, 255, 255)}
                           };


pd3dDevice->CreateVertexBuffer(sizeof(vertices), 0, Vertex::format, D3DPOOL_DEFAULT, &pVB, NULL);

VOID* vertexData = 0;
pVB->Lock(0, sizeof(vertices), &vertexData, 0);
memcpy(vertexData, vertices, sizeof(vertices));
pVB->Unlock();



D3DMATRIX matrixIdentitiy;
ZeroMemory(&matrixIdentitiy, sizeof(matrixIdentitiy));
matrixIdentitiy._11 = 1.0f;
matrixIdentitiy._22 = 1.0f;
matrixIdentitiy._33 = 1.0f;
matrixIdentitiy._44 = 1.0f;

pd3dDevice->SetTransform(D3DTS_WORLD, &matrixIdentitiy);
pd3dDevice->SetTransform(D3DTS_VIEW, &matrixIdentitiy);
pd3dDevice->SetTransform(D3DTS_PROJECTION, &matrixIdentitiy);



pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 0.0f, 0);
pd3dDevice->BeginScene();

pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
pd3dDevice->SetRenderState(D3DRS_CLIPPING, FALSE);
pd3dDevice->SetRenderState( D3DRS_ZFUNC, D3DCMP_ALWAYS );

pd3dDevice->SetStreamSource(0, pVB, 0, sizeof(Vertex));
pd3dDevice->SetFVF(Vertex::format);
pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);

pd3dDevice->EndScene();
pd3dDevice->Present(NULL, NULL, NULL, NULL);

شكرا مقدما!

تحرير:الآن فهمت, إضاءة داخلية غبية فاشلة.شكرا على مساعدتك على أي حال!

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

المحلول

حسنا إذا قمت بتعيين الخاص بك العالم ، وعرض الإسقاط على الهوية ثم ما سوف تحصل عليه هو بسيط تمرير من خلال.

× مجموعة من -1 إلى 1
y مجموعة من -1 إلى 1
z سوف تتراوح من 0 إلى 1 (هذا الشيء يمكن أن يسبب مشاكل).

إذا كنت ثم تحديد معيار تناظري verts وتمريرها داخل هذا النطاق سوف تعرض على الشاشة.

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

تحرير:هل لديك Z-التخزين المؤقت تمكين?لأنك لا واضح Z-buffer التي يمكن أن تسبب الغريب القضايا.كل شيء سوف تجعل وراء هذا وبالتالي لن تقدم.

مجموعة

pd3dDevice->SetRenderState( D3DRS_ZFUNC, D3DCMP_ALWAYS );

أو

pd3dDevice->SetRenderState( D3DRS_ZENABLE, D3DZB_FALSE );

لاختبار هذه الفرضية.

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

Edit2:

ممكن أن المشكلة تأتي من الإضاءة.حاول إيقاف الإضاءة قبالة

أي

pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );

أيضا محاولة تغيير واضح على هذا:

pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255, 255, 255), 0.0f, 0);

وتحقق لمعرفة ما إذا كان بوليس يتم تقديم الأسود.

نصائح أخرى

وهذا هو في الأساس ما أقوم به:

struct Vertex
{
    float x, y, z;
    D3DCOLOR color;

    static const DWORD format = D3DFVF_XYZ | D3DFVF_DIFFUSE;
};


const Vertex vertices[] =  {
                           {0.0f, 0.8f, 0.5f, D3DCOLOR_XRGB(255, 255, 255)},
                           {0.8f, -0.8f, 0.5f, D3DCOLOR_XRGB(255, 255, 255)},
                           {-0.8f, -0.8f, 0.5f, D3DCOLOR_XRGB(255, 255, 255)}
                           };


pd3dDevice->CreateVertexBuffer(sizeof(vertices), 0, Vertex::format, D3DPOOL_DEFAULT, &pVB, NULL);

VOID* vertexData = 0;
pVB->Lock(0, sizeof(vertices), &vertexData, 0);
memcpy(vertexData, vertices, sizeof(vertices));
pVB->Unlock();



D3DMATRIX matrixIdentitiy;
ZeroMemory(&matrixIdentitiy, sizeof(matrixIdentitiy));
matrixIdentitiy._11 = 1.0f;
matrixIdentitiy._22 = 1.0f;
matrixIdentitiy._33 = 1.0f;
matrixIdentitiy._44 = 1.0f;

pd3dDevice->SetTransform(D3DTS_WORLD, &matrixIdentitiy);
pd3dDevice->SetTransform(D3DTS_VIEW, &matrixIdentitiy);
pd3dDevice->SetTransform(D3DTS_PROJECTION, &matrixIdentitiy);



pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 0.0f, 0);
pd3dDevice->BeginScene();

pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
pd3dDevice->SetRenderState(D3DRS_CLIPPING, FALSE);

pd3dDevice->SetStreamSource(0, pVB, 0, sizeof(Vertex));
pd3dDevice->SetFVF(Vertex::format);
pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);

pd3dDevice->EndScene();
pd3dDevice->Present(NULL, NULL, NULL, NULL);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top