【问题标题】:Most basic transformed vertex-drawing with Direct3D使用 Direct3D 进行最基本的转换顶点绘图
【发布时间】:2009-08-28 21:20:23
【问题描述】:

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

提前致谢!

编辑:现在我明白了,照明已启用,愚蠢的初学者的错误。无论如何感谢您的帮助!

【问题讨论】:

    标签: directx drawing direct3d primitive vertices


    【解决方案1】:

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

    x 的范围是 -1 到 1
    y 的范围为 -1 到 1
    z 的范围为 0 到 1(此位可能会导致问题)。

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

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

    编辑:您是否启用了 Z 缓冲?因为您没有清除可能导致奇怪问题的 Z 缓冲区。一切都会在它后面渲染,因此永远不会渲染。

    设置

    pd3dDevice->SetRenderState( D3DRS_ZFUNC, D3DCMP_ALWAYS );
    

    pd3dDevice->SetRenderState( D3DRS_ZENABLE, D3DZB_FALSE );
    

    检验这个假设。

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

    编辑2:

    您的问题可能来自照明。试试关灯

    pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
    

    还可以尝试将您的 Clear 更改为:

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

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

    【讨论】:

    • 好点,我禁用了 z-buffer 测试,但问题仍然存在。
    【解决方案2】:

    这基本上就是我所做的:

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

    【讨论】:

    • 这不是答案,而是问题的一部分!应将文本编辑到问题中,并删除答案。
    • 同意,但没有删除链接。
    猜你喜欢
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    • 2017-09-25
    相关资源
    最近更新 更多