资源简介

DirectX3D 旋转 彩色 球体 索引

资源截图

代码片段和文件信息

#include “d3d9.h“  
#include “d3dx9.h“  
  
#define  USE_INDEX_STRIP  
  
LPDIRECT3D9 g_pD3D=NULL;  
LPDIRECT3DDEVICE9 g_pd3dDevice=NULL;  
  
LPDIRECT3DVERTEXBUFFER9 g_pVB=NULL;  
LPDIRECT3DINDEXBUFFER9 g_pIB=NULL;  
  
int g_rings=10;//y方向的环数  
int g_segments=10;//xz平面的环数  
  
struct CUSTOMVERTEX   
{  
    float xyz;  
    D3DCOLOR color;  
    float nxnynz;  
};  
  
#ifndef USE_INDEX_STRIP  
struct MYINDEX  
{  
    WORD _0_1_2;  
};  
#endif  
  
  
#define D3DFVF_CUSTOM (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_NORMAL)  
  
HRESULT InitD3D(HWND hwnd)  
{  
  
    if (NULL==(g_pD3D=Direct3DCreate9(D3D_SDK_VERSION)))  
    {  
        return E_FAIL;  
    }  
  
    D3DPRESENT_PARAMETERS d3dpp;  
    ZeroMemory(&d3dppsizeof(d3dpp));  
    d3dpp.BackBufferFormat=D3DFMT_UNKNOWN;  
    d3dpp.Windowed=TRUE;  
    d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;  
    d3dpp.EnableAutoDepthStencil=TRUE;  
    d3dpp.AutoDepthStencilFormat=D3DFMT_D16;  
  
    if (FAILED(g_pD3D->CreateDevice( D3DADAPTER_DEFAULTD3DDEVTYPE_HAL hwndD3DCREATE_SOFTWARE_VERTEXPROCESSING&d3dpp&g_pd3dDevice)))  
    {  
        return E_FAIL;  
    }  
  
    g_pd3dDevice->SetRenderState(D3DRS_ZENABLETRUE);  
    g_pd3dDevice->SetRenderState(D3DRS_LIGHTINGFALSE);  
    g_pd3dDevice->SetRenderState(D3DRS_CULLMODED3DCULL_NONE);  
      
//  g_pd3dDevice->SetRenderState(D3DRS_FILLMODED3DFILL_WIREframe );  
  
    return S_OK;  
  
}  
  
  
HRESULT InitGeometry()  
{  
    //使用D3DPT_TRIANGLESTRIP来索引描绘球体比较简单,索引建立的空间也较小  
#ifdef USE_INDEX_STRIP  
    if (FAILED(g_pd3dDevice->CreateVertexBuffer((g_rings+1)*(g_segments+1)*sizeof(CUSTOMVERTEX)0D3DFVF_CUSTOMD3DPOOL_MANAGED&g_pVBNULL)))  
        return E_FAIL;  
  
    if (FAILED(g_pd3dDevice->CreateIndexBuffer(g_rings*(g_segments+1)*2*sizeof(WORD)0D3DFMT_INDEX16 D3DPOOL_MANAGED&g_pIBNULL)))  
    {  
        return E_FAIL;  
    }  
  
    CUSTOMVERTEX* vertics;  
    if (FAILED(g_pVB->Lock(00(VOID**)&vertics0)))  
        return E_FAIL;  
  
    WORD* indices=0;  
    WORD vindex=0;  
    if (FAILED(g_pIB->Lock(00(VOID**)&indices0)))  
    {  
        return E_FAIL;  
    }  
  
    float deltaRing=D3DX_PI/(g_rings);  
    float deltaSegment=2.0f*D3DX_PI/g_segments;  
  
    //经典的球体建立算法  
    for(int j=0;j    {  
        float radius=sinf(j*deltaRing);  
        float y0=cosf(j*deltaRing);  
  
        for (int i=0;i        {  
            float x0=radius*sinf(i*deltaSegment);  
            float z0=radius*cosf(i*deltaSegment);  
  
            vertics->x=x0;  
            vertics->y=y0;  
            vertics->z=z0;  
  
            vertics->nx=x0;  
            vertics->ny=y0;  
            vertics->nz=z0;  
            vertics->color=0xff4040;  
            vertics++;  
  
            if (j!=g_rings)//除了第一点和最后一点只有一次,其他都由点都有两次索引  
            {  
                *in

评论

共有 条评论