游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2686|回复: 5

3D画三角形不显示

[复制链接]

45

主题

126

帖子

126

积分

注册会员

Rank: 2

积分
126
发表于 2008-11-5 13:48:00 | 显示全部楼层 |阅读模式
大家看一下我的代码,哪里有问题,为什么老是显示不出来啊,调了很久了,连死的心都有了。

#include <d3d9.h>
#include <d3dx9.h>

struct CUSTOMVERTEX
{
        float x,y,z;
        D3DCOLOR color;
};

#define D3DFVF_CUSTOM (D3DFVF_XYZ|D3DFVF_DIFFUSE)

LPDIRECT3DDEVICE9 m_pD3dDevice=NULL;
LPDIRECT3DVERTEXBUFFER9 m_pVB=NULL;
LPDIRECT3D9 m_pD3d=NULL;
HWND hWnd;

bool InitDevice(HWND hwnd)
{
        if (NULL==(m_pD3d=Direct3DCreate9(D3D_SDK_VERSION)))
        {
                MessageBox(NULL,"Direct3DCreate9()---FAILED","Alert",MB_OK);
                return false;
        }

        D3DDISPLAYMODE pm;
        if (FAILED(m_pD3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&pm)))
        {
                MessageBox(NULL,"GetAdapterDisplayMode()---FAILED","Alert",MB_OK);
                return false;
        }

        D3DPRESENT_PARAMETERS pp;
        ZeroMemory(&pp,sizeof(D3DPRESENT_PARAMETERS));
        pp.hDeviceWindow=hwnd;
        pp.Windowed=true;
        pp.BackBufferFormat=pm.Format;
        pp.BackBufferCount=1;
        pp.BackBufferHeight=600;
        pp.BackBufferWidth=800;
        pp.EnableAutoDepthStencil=true;
        pp.AutoDepthStencilFormat=D3DFMT_D24S8;
        pp.SwapEffect=D3DSWAPEFFECT_FLIP;
        pp.PresentationInterval=D3DPRESENT_INTERVAL_DEFAULT;
        pp.MultiSampleQuality=0;

        if (FAILED(m_pD3d->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&pp,&m_pD3dDevice)))
        {
                MessageBox(NULL,"CreateDevice()---FAILED","Alert",MB_OK);
                return false;
        }
       
        return true;
}

bool InitDot()
{
        if (FAILED(m_pD3dDevice->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX),0,D3DFVF_CUSTOM,D3DPOOL_DEFAULT,&m_pVB,NULL)))
        {
                MessageBox(NULL,"CreateVertexBuffer()---FAILED","Alert",MB_OK);
                return false;
        }
       
        CUSTOMVERTEX Vertices[]={{-10.0f,-10.0f,1.0f,D3DCOLOR_XRGB(255,0,0)},
                                                        { 0.0f,10.0f,1.0f,D3DCOLOR_XRGB(0,0,255)},
                                                        {10.0f,-10.0f,1.0f,D3DCOLOR_XRGB(0,255,0)}};
                                               
        void *pVertices;
        if (FAILED(m_pVB->Lock(0,3*sizeof(CUSTOMVERTEX),(void**)&pVertices,0)))
        {
                MessageBox(NULL,"Lock()---FAILED","Alert",MB_OK);
                return false;
        }
        memcpy(pVertices,Vertices,sizeof(Vertices));
        m_pVB->Unlock();
       
        return true;
}

void SetCamera()
{
        D3DXMATRIX matWorld,matView,matProj;
    D3DXMatrixIdentity( &matWorld );    //单位化矩阵
    m_pD3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
    D3DXMatrixLookAtLH( &matView,&D3DXVECTOR3( 0.0f, 0.0f,-3.0f),&D3DXVECTOR3( 0.0f, 0.0f,0.0f ),&D3DXVECTOR3( 0.0f, 1.0f,0.0f ) );
    m_pD3dDevice->SetTransform( D3DTS_VIEW, &matView );
    D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/3, 1.0f, 0.0f, 100.0f );
    m_pD3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
}

void Render()
{
        m_pD3dDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0,0);
        m_pD3dDevice->BeginScene();
        SetCamera();
        m_pD3dDevice->SetStreamSource(0,m_pVB,sizeof(CUSTOMVERTEX),0);
        m_pD3dDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
        m_pD3dDevice->SetRenderState(D3DRS_LIGHTING,false);
        m_pD3dDevice->SetFVF(D3DFVF_CUSTOM);
        m_pD3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,1);
        m_pD3dDevice->EndScene();
        m_pD3dDevice-&gtresent(NULL,NULL,NULL,NULL);
}

void ClearUp()
{
        if (m_pD3d!=NULL)
                m_pD3d->Release();
        if (m_pD3dDevice!=NULL)
                m_pD3dDevice->Release();
        if (m_pVB!=NULL)
                m_pVB->Release();
}


LRESULT CALLBACK WinProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
        switch (uMsg)
        {
        case WM_DESTROY:
                PostQuitMessage(0);
                return 0;
        }
        return DefWindowProc(hWnd,uMsg,wParam,lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
        WNDCLASSEX wndclass={sizeof(WNDCLASSEX),CS_CLASSDC,WinProc,0,0,GetModuleHandle   (NULL),NULL,NULL,NULL,NULL,"SoftStar",NULL};
        RegisterClassEx(&wndclass);
    hWnd=CreateWindow("SoftStar","SoftStar",WS_OVERLAPPEDWINDOW,0,0,800,600,
                GetDesktopWindow(),NULL,wndclass.hInstance,NULL);
        if (SUCCEEDED(InitDevice(hWnd)))
        {
                if (SUCCEEDED(InitDot()))
                {
                        ShowWindow(hWnd,nShowCmd);
                        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
                                        Render();
                        }
                }
        }
        ClearUp();
        UnregisterClass("SoftStar",wndclass.hInstance);
        return 0;
}

各位大虾,多谢了!

5

主题

686

帖子

697

积分

高级会员

Rank: 4

积分
697
QQ
发表于 2008-11-5 19:05:00 | 显示全部楼层

Re:3D画三角形不显示

lz太强了..直接把整个cpp贴上来..有这功夫还不如自己把渲染的地方跟sdk里面的tutorial好好对比一下,看哪里不一样.....

0

主题

1

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2008-11-5 21:12:00 | 显示全部楼层

Re:3D画三角形不显示

D3DXMatrixLookAtLH 参数2:z值设到-30。0f就可以了
SetStreamSource(0,m_pVB,sizeof(CUSTOMVERTEX),0)后两个参数反啦

45

主题

126

帖子

126

积分

注册会员

Rank: 2

积分
126
 楼主| 发表于 2008-11-5 21:17:00 | 显示全部楼层

Re:3D画三角形不显示

affly2008谢了,我一直都SetStreamSource(0,m_pVB,sizeof(CUSTOMVERTEX),0)这么写,为什么都能显示呢?奇怪啊!

0

主题

9

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2008-11-8 07:55:00 | 显示全部楼层

Re:3D画三角形不显示

根据你的顶点矩阵 应该是一个平行于Z坐标轴的三角形,这样 在lookat里第二个参数是你的视点位置,改的靠后一点就好。
关于SetStreamSource声明是这样的
public:
void SetStreamSource(
    int streamNumber,
    VertexBuffer^ streamData,
    int stride
)

0

主题

15

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2008-11-30 18:33:00 | 显示全部楼层

Re:3D画三角形不显示

没仔细看呢...以上方法没解决的话..看看你的背面消隐方式.看是不是把摄影机放到你的三角形后面去了.
默认情况是逆时针.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-20 19:30

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表