skybox.cpp

来自「用directx实现的天空盒 使用纹理贴图」· C++ 代码 · 共 117 行

CPP
117
字号
#include "SkyBox.h"

CSkyBox::CSkyBox(LPDIRECT3DDEVICE9 pd3dDevice)
{
	m_pd3dDevice = pd3dDevice;
	m_pVB		 = NULL;
}

CSkyBox::~CSkyBox()
{
	REL(m_pVB);
	for(int i = 0; i < 8; i++)
	{
		REL(m_pTexture[i]);
	}
}

HRESULT CSkyBox::InitVB()
{
	VERTEX	g_Vertices[] = 
	{	//Front
		{-1.0f, 1.0f,-1.0f,	 0.0f, 0.0f, 0.0f,0.0f},
		{ 1.0f, 1.0f,-1.0f,	 1.0f, 0.0f, 1.0f,0.0f},
		{-1.0f,-1.0f,-1.0f,	 0.0f, 1.0f, 0.0f,1.0f},
		{ 1.0f,-1.0f,-1.0f,	 1.0f, 1.0f, 1.0f,1.0f},

		//Back
		{-1.0f, 1.0f, 1.0f,  1.0f,0.0f,  1.0f,0.0f },
		{-1.0f,-1.0f, 1.0f,  1.0f,1.0f,  1.0f,1.0f },
		{ 1.0f, 1.0f, 1.0f,  0.0f,0.0f,  0.0f,0.0f },
		{ 1.0f,-1.0f, 1.0f,  0.0f,1.0f,  0.0f,1.0f },

		//Up
		{-1.0f, 1.0f, 1.0f,  0.0f,0.0f,  0.0f,0.0f },
		{ 1.0f, 1.0f, 1.0f,  1.0f,0.0f,  1.0f,0.0f },
		{-1.0f, 1.0f,-1.0f,  0.0f,1.0f,  0.0f,1.0f },
		{ 1.0f, 1.0f,-1.0f,  1.0f,1.0f,  1.0f,1.0f },

		//Down
		{-1.0f,-1.0f, 1.0f,  0.0f,1.0f,  0.0f,1.0f },
		{-1.0f,-1.0f,-1.0f,  0.0f,0.0f,  0.0f,0.0f },
		{ 1.0f,-1.0f, 1.0f,  1.0f,1.0f,  1.0f,1.0f },
		{ 1.0f,-1.0f,-1.0f,  1.0f,0.0f,  1.0f,0.0f },

		//Right
		{ 1.0f, 1.0f,-1.0f,  0.0f,0.0f,  0.0f,0.0f },
		{ 1.0f, 1.0f, 1.0f,  1.0f,0.0f,  1.0f,0.0f },
		{ 1.0f,-1.0f,-1.0f,  0.0f,1.0f,  0.0f,1.0f },
		{ 1.0f,-1.0f, 1.0f,  1.0f,1.0f,  1.0f,1.0f },

		//Left
		{-1.0f, 1.0f,-1.0f,  1.0f,0.0f,  1.0f,0.0f },
		{-1.0f,-1.0f,-1.0f,  1.0f,1.0f,  1.0f,1.0f },
		{-1.0f, 1.0f, 1.0f,  0.0f,0.0f,  0.0f,0.0f },
		{-1.0f,-1.0f, 1.0f,  0.0f,1.0f,  0.0f,1.0f }

	};

	if (FAILED(m_pd3dDevice->CreateVertexBuffer(
										24 * sizeof(VERTEX),
										0,
										VERTEXFVF,
										D3DPOOL_DEFAULT,
										&m_pVB,
										NULL)))
	{
		return E_FAIL;
	}

	void * pVertices = NULL;

	if (FAILED(m_pVB->Lock( 0, sizeof(g_Vertices), (void**)&pVertices, 0)))
	{
		return E_FAIL;
	}

	memcpy( pVertices, g_Vertices, sizeof(g_Vertices) );
	m_pVB->Unlock();

	return S_OK;
}

bool CSkyBox::SetTexture(const char *TextureFile, int ps)
{
	if (FAILED(D3DXCreateTextureFromFile( m_pd3dDevice,
											TextureFile,
											&m_pTexture[ps])))
	{
		return false;
	}
	
	return true;
}

void CSkyBox::Render()
{
	D3DXMATRIX	matWorld;
	D3DXMatrixScaling(&matWorld, 10.0f, 10.0f, 10.0f);
	m_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld);

	m_pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
	m_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
	m_pd3dDevice->SetStreamSource(0, m_pVB, 0, sizeof(VERTEX));
	m_pd3dDevice->SetFVF(VERTEXFVF);
	m_pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
	m_pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
	
    m_pd3dDevice->SetSamplerState(0,D3DSAMP_ADDRESSU,D3DTADDRESS_CLAMP);
	m_pd3dDevice->SetSamplerState(0,D3DSAMP_ADDRESSV,D3DTADDRESS_CLAMP);

	for(int i = 0; i < 6; i++)
	{
		m_pd3dDevice->SetTexture(0, m_pTexture[i]);
		m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, i*4, 2);
	}

}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?