|
发表于 2009-11-29 22:20:00
|
显示全部楼层
Re:谁有D3D天空盒子的代码?
#pragma once
#include "node.h"
struct VertexSkyBox{
float m_x,m_y,m_z;
float m_nx,m_ny,m_nz;
float m_u,m_v;
//D3DCOLOR m_color;
VertexSkyBox(){m_x=0;m_y=0;m_z=0;}
VertexSkyBox(float x,float y,float z,float nx,float ny,float nz,float u,float v){
m_x=x; m_y=y; m_z=z;
m_nx=nx; m_ny=ny; m_nz=nz;
m_u=u; m_v=v;
//m_color=color;
}
};
class CSkyBox :
public CNode
{
private:
IDirect3DVertexBuffer9 *m_PVB;
IDirect3DIndexBuffer9 *m_PIB;
D3DMATERIAL9 m_material;
IDirect3DTexture9* m_pTexture;
public:
CSkyBox(IDirect3DDevice9 *pDevice);
~CSkyBox(void);
void Render(IDirect3DDevice9 *pDevice);
};
#include "StdAfx.h"
#include "SkyBox.h"
CSkyBox::CSkyBox(IDirect3DDevice9 *pDevice)
{
pDevice->CreateVertexBuffer((24 * sizeof(VertexSkyBox)),D3DUSAGE_WRITEONLY,D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1,D3DPOOL_MANAGED,&m_PVB,0);
pDevice->CreateIndexBuffer(36*sizeof(WORD),D3DUSAGE_WRITEONLY,D3DFMT_INDEX16,D3DPOOL_MANAGED,&m_PIB,0);
VertexSkyBox *pV;
float size=20.0f;
m_PVB->Lock(0,0,(void**)&pV,0);
//TOP上表面
pV[0]=VertexSkyBox(-size,size,size,0.0f,1.0f,0.0f,0.0f,0.0f);//0
pV[1]=VertexSkyBox(-size,size,-size,0.0f,1.0f,0.0f,0.0f,1.0f);//1
pV[2]=VertexSkyBox(size,size,-size,0.0f,1.0f,0.0f,1.0f,1.0f);//2
pV[3]=VertexSkyBox(size,size,size,0.0f,1.0f,0.0f,1.0f,0.0f);//3
//FRONT 前表面
pV[4]=VertexSkyBox(-size,size,-size,0.0f,0.0f,-1.0f,0.0f,0.0f);//1
pV[5]=VertexSkyBox(size,size,-size,0.0f,0.0f,-1.0f,1.0f,0.0f);//2
pV[6]=VertexSkyBox(-size,-size,-size,0.0f,0.0f,-1.0f,0.0f,1.0f);//5
pV[7]=VertexSkyBox(size,-size,-size,0.0f,0.0f,-1.0f,1.0f,1.0f);//6
//BUTTON 下表面
pV[8]=VertexSkyBox(-size,-size,-size,0.0f,-1.0f,0.0f,0.0f,0.0f);//5
pV[9]=VertexSkyBox(size,-size,-size,0.0f,-1.0f,0.0f,1.0f,0.0f);//6
pV[10]=VertexSkyBox(size,-size,size,0.0f,-1.0f,0.0f,1.0f,1.0f);//7
pV[11]=VertexSkyBox(-size,-size,size,0.0f,-1.0f,0.0f,0.0f,1.0f);//4
//BACK 背面
pV[12]=VertexSkyBox(-size,size,size,0.0f,0.0f,1.0f,0.0f,0.0f);//0
pV[13]=VertexSkyBox(size,size,size,0.0f,0.0f,1.0f,1.0f,0.0f);//3
pV[14]=VertexSkyBox(size,-size,size,0.0f,0.0f,1.0f,1.0f,1.0f);//7
pV[15]=VertexSkyBox(-size,-size,size,0.0f,0.0f,1.0f,0.0f,1.0f);//4
//LEFT 左面
pV[16]=VertexSkyBox(-size,size,size,-1.0f,0.0f,0.0f,0.0f,0.0f);//0
pV[17]=VertexSkyBox(-size,size,-size,-1.0f,0.0f,0.0f,1.0f,0.0f);//1
pV[18]=VertexSkyBox(-size,-size,-size,-1.0f,0.0f,0.0f,1.0f,1.0f);//5
pV[19]=VertexSkyBox(-size,-size,size,-1.0f,0.0f,0.0f,0.0f,1.0f);//4
//RIGHT 右面
pV[20]=VertexSkyBox(size,size,-size,1.0f,0.0f,0.0f,0.0f,0.0f);//2
pV[21]=VertexSkyBox(size,size,size,1.0f,0.0f,0.0f,1.0f,0.0f);//3
pV[22]=VertexSkyBox(size,-size,size,1.0f,0.0f,0.0f,1.0f,1.0f);//7
pV[23]=VertexSkyBox(size,-size,-size,1.0f,0.0f,0.0f,0.0f,1.0f);//6
m_PVB->Unlock();
WORD *pW;
m_PIB->Lock(0,0,(void**)&pW,0);
pW[0]=1;pW[1]=3;pW[2]=0;
pW[3]=2;pW[4]=3;pW[5]=1;
pW[6]=6;pW[7]=5;pW[8]=4;
pW[9]=6;pW[10]=7;pW[11]=5;
pW[12]=9;pW[13]=8;pW[14]=11;
pW[15]=10;pW[16]=9;pW[17]=11;
pW[18]=14;pW[19]=15;pW[20]=12;
pW[21]=13;pW[22]=14;pW[23]=12;
pW[24]=16;pW[25]=19;pW[26]=18;
pW[27]=17;pW[28]=16;pW[29]=18;
pW[30]=23;pW[31]=21;pW[32]=20;
pW[33]=22;pW[34]=21;pW[35]=23;
m_PIB->Unlock();
ZeroMemory(&m_material,sizeof(D3DMATERIAL9));
m_material.Diffuse=D3DXCOLOR(1.0f,1.0f,1.0f,1.0f);
m_material.Emissive=D3DXCOLOR(1.0f,1.0f,1.0f,1.0f);
: 3DXCreateTextureFromFile(pDevice,"Sky.jpg",&m_pTexture);
pDevice->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
pDevice->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);
}
void CSkyBox::Render(IDirect3DDevice9 *pDevice){
D3DXMATRIX mWorld;
this->getWorldMatrix(&mWorld);
pDevice->SetTransform(D3DTS_WORLD,&mWorld);
pDevice->SetStreamSource(0,m_PVB,0,sizeof(VertexSkyBox));
pDevice->SetFVF(D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1);
pDevice->SetIndices(m_PIB);
pDevice->SetMaterial(&m_material);
pDevice->SetTexture(0,m_pTexture);
pDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,24,0,12);
}
CSkyBox::~CSkyBox(void)
{
m_PVB->Release();
m_PIB->Release();
m_pTexture->Release();
}
|
|