2 skripio skripio 于 2016.02.13 14:05 提问

Direct3d9绘制的图形不能显示,求解! 5C

小弟初学d3d,代码是完全按照教材来的,原本目的是显示一个正方形,可是最终只显示了蓝色的背景,其他的d3d代码也有此问题,急求大神解惑!

以下是源代码:

 //--------------------------------------------------------------------------------------
// File: VertexBuffer.cpp
//--------------------------------------------------------------------------------------
#include <d3d9.h>                   // Direct3D头文件

#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }

wchar_t *g_pClassName  = L"VertexBuffer";   // 窗口类名
wchar_t *g_pWindowName = L"顶点缓存示例";   // 窗口标题名

LPDIRECT3DDEVICE9       g_pd3dDevice = NULL;    // Direct3D设备接口
LPDIRECT3DVERTEXBUFFER9 g_pVertexBuf = NULL;    // 顶点缓存接口

struct CUSTOMVERTEX 
{
    FLOAT _x, _y, _z, _rhw;         // 顶点的位置
    DWORD _color;                   // 顶点的颜色
    CUSTOMVERTEX(FLOAT x, FLOAT y, FLOAT z, FLOAT rhw, DWORD color)
        : _x(x), _y(y), _z(z), _rhw(rhw), _color(color) {}
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)


HRESULT InitDirect3D(HWND hWnd);    // 初始化Direct3D
VOID Direct3DRender();              // 渲染图形
VOID Direct3DCleanup();             // 清理Direct3D资源

// 窗口消息处理函数声明
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

//--------------------------------------------------------------------------------------
// Name: WinMain();
// Desc: Windows应用程序入口函数
//--------------------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, int nShowCmd)
{
    // 初始化窗口类
    WNDCLASS wndclass;
    wndclass.cbClsExtra     = 0;
    wndclass.cbWndExtra     = 0;
    wndclass.hbrBackground  = (HBRUSH)GetStockObject(WHITE_BRUSH);  // 窗口背景
    wndclass.hCursor        = LoadCursor(NULL, IDC_ARROW);          // 光标形状
    wndclass.hIcon          = LoadIcon(NULL, IDI_APPLICATION);      // 窗口小图标
    wndclass.hInstance      = hInstance;
    wndclass.lpfnWndProc    = WndProc;
    wndclass.lpszClassName  = g_pClassName;
    wndclass.lpszMenuName   = NULL;
    wndclass.style          = CS_HREDRAW | CS_VREDRAW;

    // 注册窗口类
    if (!RegisterClass(&wndclass))
        return 0;

    // 创建窗口
    HWND hWnd = CreateWindow(g_pClassName, g_pWindowName, WS_OVERLAPPEDWINDOW, 
        100, 100, 640, 480, NULL, NULL, wndclass.hInstance, NULL);

    // 初始化Direct3D
    InitDirect3D(hWnd);

    // 显示、更新窗口
    ShowWindow(hWnd, SW_SHOWDEFAULT); 
    UpdateWindow(hWnd); 

    // 消息循环
    MSG msg;
    ZeroMemory(&msg, sizeof(msg));
    while (msg.message!=WM_QUIT)
    {
        if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else
        {
            Direct3DRender();       // 绘制3D场景
        }
    }

    UnregisterClass(g_pClassName, wndclass.hInstance);
    return 0;
}

//--------------------------------------------------------------------------------------
// Name: WndProc()
// Desc: 窗口消息处理函数
//--------------------------------------------------------------------------------------
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{
    switch (message) 
    {
    case WM_PAINT:                  // 客户区重绘消息
        Direct3DRender();           // 渲染图形
        ValidateRect(hWnd, NULL);   // 更新客户区的显示
        break;
    case WM_KEYDOWN:                // 键盘按下消息
        if (wParam == VK_ESCAPE)    // ESC键
            DestroyWindow(hWnd);    // 销毁窗口, 并发送一条WM_DESTROY消息
        break;
    case WM_DESTROY:                // 窗口销毁消息
        Direct3DCleanup();          // 清理Direct3D
        PostQuitMessage(0);         // 退出程序
        break;
    }
    // 默认的消息处理
    return DefWindowProc( hWnd, message, wParam, lParam );
}

//--------------------------------------------------------------------------------------
// Name: InitDirect3D()
// Desc: 初始化Direct3D
//--------------------------------------------------------------------------------------
HRESULT InitDirect3D(HWND hWnd) 
{
    // 创建IDirect3D接口
    LPDIRECT3D9 pD3D = NULL;                    // IDirect3D9接口
    pD3D = Direct3DCreate9(D3D_SDK_VERSION);    // 创建IDirect3D9接口对象
    if (pD3D == NULL) return E_FAIL;

    // 获取硬件设备信息
    D3DCAPS9 caps; int vp = 0;
    pD3D->GetDeviceCaps( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps );
    if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
        vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
    else
        vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;

    // 创建Direct3D设备接口
    D3DPRESENT_PARAMETERS d3dpp; 
    ZeroMemory(&d3dpp, sizeof(d3dpp));
    d3dpp.BackBufferWidth            = 640;
    d3dpp.BackBufferHeight           = 480;
    d3dpp.BackBufferFormat           = D3DFMT_A8R8G8B8;
    d3dpp.BackBufferCount            = 1;
    d3dpp.MultiSampleType            = D3DMULTISAMPLE_NONE;
    d3dpp.MultiSampleQuality         = 0;
    d3dpp.SwapEffect                 = D3DSWAPEFFECT_DISCARD; 
    d3dpp.hDeviceWindow              = hWnd;
    d3dpp.Windowed                   = true;
    d3dpp.EnableAutoDepthStencil     = true; 
    d3dpp.AutoDepthStencilFormat     = D3DFMT_D24S8;
    d3dpp.Flags                      = 0;
    d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
    d3dpp.PresentationInterval       = D3DPRESENT_INTERVAL_IMMEDIATE;

    pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, 
        hWnd, vp, &d3dpp, &g_pd3dDevice);
    pD3D->Release();

    // 创建顶点缓存
    g_pd3dDevice->CreateVertexBuffer(6 * sizeof(CUSTOMVERTEX), 0, 
        D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVertexBuf, NULL); 

    // 填充顶点数据
    CUSTOMVERTEX *pVertices = NULL;
    g_pVertexBuf->Lock(0, 0, (void**)&pVertices, 0);
    pVertices[0] = CUSTOMVERTEX( 220.0f, 120.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(255, 0, 0));     // V0
    pVertices[1] = CUSTOMVERTEX( 420.0f, 120.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 255, 0));     // V1
    pVertices[2] = CUSTOMVERTEX( 220.0f, 320.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(255, 255, 0));   // V2

    pVertices[3] = CUSTOMVERTEX( 420.0f, 120.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 255, 0));     // V1
    pVertices[4] = CUSTOMVERTEX( 420.0f, 320.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 0, 255));     // V3
    pVertices[5] = CUSTOMVERTEX( 220.0f, 320.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(255, 255, 0));   // V2
    g_pVertexBuf->Unlock();
    return S_OK;
}

//--------------------------------------------------------------------------------------
// Name: Direct3DRender()
// Desc: 绘制3D场景
//--------------------------------------------------------------------------------------
VOID Direct3DRender() 
{
    g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(45, 50, 170), 1.0f, 0);
    g_pd3dDevice->BeginScene();                     // 开始绘制

    // 渲染正方形
    g_pd3dDevice->SetStreamSource(0, g_pVertexBuf, 0, sizeof(CUSTOMVERTEX));
    g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
    g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);

    g_pd3dDevice->EndScene();                       // 结束绘制
    g_pd3dDevice->Present(NULL, NULL, NULL, NULL);  // 翻转
}

//--------------------------------------------------------------------------------------
// Name: Direct3DCleanup()
// Desc: 清理Direct3D, 并释放COM接口
//--------------------------------------------------------------------------------------
VOID Direct3DCleanup() 
{
    SAFE_RELEASE(g_pVertexBuf);     // 释放顶点缓存接口
    SAFE_RELEASE(g_pd3dDevice);     // 释放D3D设备接口
}

1个回答

caozhy
caozhy   Ds   Rxr 2016.02.14 07:08

不知道你在哪里抄的代码,代码是否完整,看看下面两个现成的代码:
http://download.csdn.net/detail/ml232528/3198011
http://download.csdn.net/detail/wulong710/1579684
另外检查下你的sdk的配置。

skripio
skripio 问题解决了,我把顶点的z轴坐标都设置为了0.0f然后可以正常显示,但是不知道为啥0.5f就显示不出
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
D3D中2D图片的绘制两种方法
2014/09/19 (转载自:http://blog.csdn.net/rabbit729/article/details/6388703) 想要在D3D中加载2D图片可以使用如下两种方法(我只想到这两种方法,如果有其他方法,请指教)。第一种就是把图片以纹理方式加载,然后以此为纹理绘制一个四边形即可;第二种就是使用2D点精灵,不解释,你懂得;下面分别给出两种方法的代码:   
使用Direct3D9播放视频,窗口放大到比初始化硬解参数时的尺寸还要大时,图像模糊
如题,由于本人以前没有接触过Direct3D,所以这个问题搞了好久才搞好,给我印象深刻,写篇博客记录下。   在代码中,使用了两种不同的绘图方式:软解时使用GDI,硬解时使用Direct3D9,因为实现硬解时Direct3D9的COM接口指针已经得到了,所以播放就用Direct3D9了。   由于Direct3D是为3D处理而生的,播放视频只是副业,里面很多名称都是与3D绘图有关。
opengl绘制的图形在前面不显示,绕到后面才显示
具体说一下情况,就是带相机漫游功能的场景中; 绘制的多边形物体,从z轴正向看的话,显然没有图像,但是把相机绕到z轴负方向就绘制出了图像 这个问题主要是因为在工程中glEnable( GL_CULL_FACE );造成的。注释掉即可。 下面摘抄自网上: void glCullFace(GLenum mode); 表示禁用多边形正面或者背面上的光照、阴影和颜色计算及操作,消除不必要的渲染计算。
DirectX9 示例:绘制三角形
////////////////////////////////////////////////////////////////////////////////////////////////// // // File: triangle.cpp // // Author: Frank Luna (C) All Rights Reserved // // System: AMD Athlon
Direct3D-空间物体旋转demo
Direct9 物体旋转demo
direct3d D3DXCreateTextureFromResource 加载png
png资源必须如下定义RCDATA DISCARDABLE,才能导入IDR_PNG1    RCDATA DISCARDABLE    "texture.png"
QT调用D3D绘制旋转三角形
我的环境是win7+Qt5.1 之前在网上找了一些例子, 怎么调试都不出来. 原来是窗口属性的问题. 解决方法: 网上的例子: setAttribute(Qt::WA_PaintOnScreen, true); Note: This flag is only supported on X11 and it disables double buffering. 看文档发现这个属性只能用于X
利用R和Octave绘制函数图像和求解方程
任务1、绘制函数图像1、利用R方法一:plot(x,y)lines(loess.smooth(x,y),col='red',lwd=2)方法二:2、利用Octave&amp;gt;&amp;gt; x = [-4:0.5:6]&amp;gt;&amp;gt; y = x.^2 - x - 6&amp;gt;&amp;gt; plot(y)任务2、求方程的根。利用R来求根:求最值:利用Octave绘制正弦函数图像&amp;gt;&amp;gt; x = lins...
三维图形绘制控件(非常好用)
三维图形绘制控件 可实现等高线,三维曲面,地形图的绘制 多种渲染方式可选
D3D学习笔记整理(五)
这一节是本系列最后一节,主要是介绍了CUDA如何与D3D实现互操作。到此为止,我个人对D3D的入门学习告一段落了!下一站又有什么等着呢?!