代码之家  ›  专栏  ›  技术社区  ›  Pau

用Direct3D绘制最基本的变换顶点

  •  0
  • Pau  · 技术社区  · 15 年前

    我是DirectX的新手,我想用最基本的Direct3D配置绘制一些未转换的原语(用于学习目的)。我已经用转换后的顶点绘制了一些基本体,即带有d3dfvf_xyzrhw标志集的顶点。

    现在,我试图用未转换的顶点获得相同的输出,但屏幕上没有任何视觉效果。我更改了fvf并调整了顶点,但还没有设置任何变换矩阵(世界、视图、投影)。有必要设置这些矩阵吗?我假设在没有设置矩阵的情况下,所有的事情都会像处理转换后的顶点一样工作,但显然情况并非如此。

    默认情况下,哪些区域(在世界坐标中)可见?我要做什么才能让它工作?

    这基本上就是我要做的:

    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);
    

    事先谢谢!

    编辑:现在我明白了,照明被启用了,愚蠢的初学者的错误。不管怎样,谢谢你的帮助!

    2 回复  |  直到 15 年前
        1
  •  1
  •   Goz    15 年前

    如果你将你的世界,视图和投影矩阵设置为同一个,那么你将得到一个简单的传递。

    X的范围为-1到1
    Y的范围为-1到1
    Z的范围为0到1(该位可能导致问题)。

    然后,如果定义标准的未转换顶点并在该范围内传递它们,它们将显示在屏幕上。

    如果这对发布一些代码没有帮助,我会看看我能提出什么建议。

    编辑:是否启用了Z缓冲?因为你不清除Z缓冲区,这会导致一些奇怪的问题。一切都将在此之后呈现,因此永远不会呈现。

    集合

    pd3dDevice->SetRenderState( D3DRS_ZFUNC, D3DCMP_ALWAYS );
    

    pd3dDevice->SetRenderState( D3DRS_ZENABLE, D3DZB_FALSE );
    

    来检验这个假设。

    它也非常值得学习如何使用像素,然后看看在你的三角形穿过场景时会发生什么。

    编辑2:

    你的问题可能来自照明。尝试关闭照明

    工业工程

    pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
    

    同时尝试将“清除”更改为:

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

    检查多边形是否呈现黑色。

        2
  •  0
  •   Pau    15 年前

    这基本上就是我要做的:

    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);
    
    推荐文章