⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shader_fog.cpp

📁 游戏编程精华02-含有几十个游戏编程例子
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/******************************************************************************

  Copyright (C) 1999, 2000 NVIDIA Corporation
  This file is provided without support, instruction, or implied warranty of any
  kind.  NVIDIA makes no guarantee of its fitness for a particular purpose and is
  not liable under any circumstances for any damages or loss whatsoever arising
  from the use or inability to use this file or items derived from it.
  
    Comments:
    
      
        
******************************************************************************/
#include "eb_effect.h"
#include "nvdevice.h"
#include "nvfile.h"
#include "shader_Fog.h"
#include "nvfile.h"
#include "fog.h"

using namespace nv_objects;
using namespace std;

static D3DXVECTOR3 CameraStart(0.0f, -2.0f, -5.0f);
DECLARE_EFFECT_MAIN()

extern "C"
{

__declspec(dllexport) unsigned int GetNumEffects() { return 1; }

__declspec(dllexport) EBEffect* CreateEffect(unsigned int EffectNum)
{	
	switch(EffectNum)
	{
		case 0:
			return new CShaderFog();
			break;
		default:
			return NULL;
	}
}

}

// Old-style D3D vertices
class Vertex
{
public:
	Vertex(const D3DXVECTOR3& Pos, const D3DXVECTOR3& Norm, const D3DXVECTOR2& Tex)
		: Position(Pos), Normal(Norm), Texture(Tex)
	{}

	Vertex()
	{}

	D3DXVECTOR3 Position;
	D3DXVECTOR3 Normal;
	D3DXVECTOR2 Texture;
};

class TLVertex
{
public:
	D3DXVECTOR4 Position;
	DWORD Diffuse;
	DWORD Specular;
	D3DXVECTOR2 Texture;
};

#define D3DFVF_VERTEX (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1)
#define D3DFVF_TLVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1)

CShaderFog::CShaderFog()
	: m_vecRoomDimensions(15.0f, 7.0f, 15.0f),
	m_vecChairDimensions(0.75f, 1.5f, 0.75f),
	m_vecTableDimensions(3.5f, 1.2f, 3.5f),
	m_pRoom(NULL),
	m_pChair(NULL),
	m_pTable(NULL),
	m_pWorldBoxVertices(NULL),
	m_pWorldBoxIndices(NULL),
	m_dwFogShader(0),
	m_dwWorldShader(0),
	m_pFogMap(0),
	m_pFogMapVB(NULL),
	m_pNVDevice(NULL),
	m_bShowFogMap(false),
	m_bEnableFog(true),
	m_bWireframe(false),
	m_dwFogMapWidth(64),
	m_dwFogMapHeight(64),
	m_pCamera(NULL),
	m_CameraLookDirection(0.0f, 0.0f, 1.0f)

{
	for (int i = 0; i < 6; i++)
	{
		m_pWorldTextures[i] = NULL;
	}

	m_strEffectLocation = "Vertex Shaders\\Texture Coordinate Generation";
	m_strEffectName = "Height Fog";
	m_strEffectVertexShader = GetFilePath("fog.nvv");
	m_strEffectPixelShader = "";

 
}

CShaderFog::~CShaderFog()
{
	Free();	
}

void CShaderFog::UpdateProperties()
{
	EBEffect::UpdateProperties();
	AddProperty(new EBProperty("Show FogMap", OBJECT_MEMBER(m_bShowFogMap), EBTYPE_BOOL_PROP));
	AddProperty(new EBProperty("Enable Fog", OBJECT_MEMBER(m_bEnableFog), EBTYPE_BOOL_PROP));
	AddProperty(new EBProperty("Wireframe", OBJECT_MEMBER(m_bWireframe), EBTYPE_BOOL_PROP));

	// Vertex shaders
	m_pVertexShaderEnum->AddEnumerant(new EBEnumValue(m_pVertexShaderEnum, "Texture Coordinates from Distances", GetFilePath("fog.nvv"), EBTYPE_STRING_PROP));

}

#define NUM_CUBE_VERTICES (4*6)
#define NUM_CUBE_INDICES  (6*6)
HRESULT CShaderFog::CreateCube(WorldBoxVertex* pVertices, WORD* pIndices)
{
    // Set up the vertices for the cube. Note: to prevent tiling problems,
    // the u/v coords are knocked slightly inwards.

    // Front face
    *pVertices++ = WorldBoxVertex(D3DXVECTOR3(-1.0f, 1.0f,-1.0f), D3DXVECTOR2(0.0f, 0.0f));
    *pVertices++ = WorldBoxVertex(D3DXVECTOR3( 1.0f, 1.0f,-1.0f), D3DXVECTOR2(1.0f, 0.0f ));
    *pVertices++ = WorldBoxVertex(D3DXVECTOR3( 1.0f,-1.0f,-1.0f), D3DXVECTOR2(1.0f, 1.0f ));
    *pVertices++ = WorldBoxVertex(D3DXVECTOR3(-1.0f,-1.0f,-1.0f), D3DXVECTOR2(0.0f, 1.0f ));

    // Back face
    *pVertices++ = WorldBoxVertex(D3DXVECTOR3(-1.0f, 1.0f, 1.0f), D3DXVECTOR2(1.0f, 0.0f ));
    *pVertices++ = WorldBoxVertex(D3DXVECTOR3(-1.0f,-1.0f, 1.0f), D3DXVECTOR2(1.0f, 1.0f ));
    *pVertices++ = WorldBoxVertex(D3DXVECTOR3( 1.0f,-1.0f, 1.0f), D3DXVECTOR2(0.0f, 1.0f ));
    *pVertices++ = WorldBoxVertex(D3DXVECTOR3( 1.0f, 1.0f, 1.0f), D3DXVECTOR2(0.0f, 0.0f ));

    // Top face
    *pVertices++ = WorldBoxVertex(D3DXVECTOR3(-1.0f, 1.0f, 1.0f), D3DXVECTOR2(1.0f, 1.0f ));
    *pVertices++ = WorldBoxVertex(D3DXVECTOR3( 1.0f, 1.0f, 1.0f), D3DXVECTOR2(0.0f, 1.0f ));
    *pVertices++ = WorldBoxVertex(D3DXVECTOR3( 1.0f, 1.0f,-1.0f), D3DXVECTOR2(0.0f, 0.0f ));
    *pVertices++ = WorldBoxVertex(D3DXVECTOR3(-1.0f, 1.0f,-1.0f), D3DXVECTOR2(1.0f, 0.0f ));

    // Bottom face
	*pVertices++ = WorldBoxVertex(D3DXVECTOR3(-1.0f,-1.0f, 1.0f), D3DXVECTOR2(1.0f, 0.0f ));
    *pVertices++ = WorldBoxVertex(D3DXVECTOR3(-1.0f,-1.0f,-1.0f), D3DXVECTOR2(1.0f, 1.0f ));
    *pVertices++ = WorldBoxVertex(D3DXVECTOR3( 1.0f,-1.0f,-1.0f), D3DXVECTOR2(0.0f, 1.0f ));
    *pVertices++ = WorldBoxVertex(D3DXVECTOR3( 1.0f,-1.0f, 1.0f), D3DXVECTOR2(0.0f, 0.0f ));

    // Right face
    *pVertices++ = WorldBoxVertex(D3DXVECTOR3( 1.0f, 1.0f,-1.0f), D3DXVECTOR2(0.0f, 0.0f ));
    *pVertices++ = WorldBoxVertex(D3DXVECTOR3( 1.0f, 1.0f, 1.0f), D3DXVECTOR2(1.0f, 0.0f ));
    *pVertices++ = WorldBoxVertex(D3DXVECTOR3( 1.0f,-1.0f, 1.0f), D3DXVECTOR2(1.0f, 1.0f ));
    *pVertices++ = WorldBoxVertex(D3DXVECTOR3( 1.0f,-1.0f,-1.0f), D3DXVECTOR2(0.0f, 1.0f ));

    // Left face
    *pVertices++ = WorldBoxVertex(D3DXVECTOR3(-1.0f, 1.0f,-1.0f), D3DXVECTOR2(1.0f, 0.0f ));
    *pVertices++ = WorldBoxVertex(D3DXVECTOR3(-1.0f,-1.0f,-1.0f), D3DXVECTOR2(1.0f, 1.0f ));
    *pVertices++ = WorldBoxVertex(D3DXVECTOR3(-1.0f,-1.0f, 1.0f), D3DXVECTOR2(0.0f, 1.0f ));
    *pVertices++ = WorldBoxVertex(D3DXVECTOR3(-1.0f, 1.0f, 1.0f), D3DXVECTOR2(0.0f, 0.0f ));

    // Set up the indices for the cube
    *pIndices++ =  0+0;   *pIndices++ =  0+1;   *pIndices++ =  0+2;
    *pIndices++ =  0+2;   *pIndices++ =  0+3;   *pIndices++ =  0+0;
    *pIndices++ =  4+0;   *pIndices++ =  4+1;   *pIndices++ =  4+2;
    *pIndices++ =  4+2;   *pIndices++ =  4+3;   *pIndices++ =  4+0;
    *pIndices++ =  8+0;   *pIndices++ =  8+1;   *pIndices++ =  8+2;
    *pIndices++ =  8+2;   *pIndices++ =  8+3;   *pIndices++ =  8+0;
    *pIndices++ = 12+0;   *pIndices++ = 12+1;   *pIndices++ = 12+2;
    *pIndices++ = 12+2;   *pIndices++ = 12+3;   *pIndices++ = 12+0;
    *pIndices++ = 16+0;   *pIndices++ = 16+1;   *pIndices++ = 16+2;
    *pIndices++ = 16+2;   *pIndices++ = 16+3;   *pIndices++ = 16+0;
    *pIndices++ = 20+0;   *pIndices++ = 20+1;   *pIndices++ = 20+2;
    *pIndices++ = 20+2;   *pIndices++ = 20+3;   *pIndices++ = 20+0;

    return S_OK;
}

HRESULT CShaderFog::Initialize(IDirect3DDevice8* pDev)
{
	HRESULT hr;
	vector<DWORD> Declaration;

	m_pD3DDev = pDev;
	pDev->AddRef();

	m_pNVDevice = new NVFogDevice(pDev, this);

	// Clamp the viewer to the inside of the room.
	D3DXVECTOR3 vecMinExtents = D3DXVECTOR3((-m_vecRoomDimensions.x * 0.5f), (-m_vecRoomDimensions.y * 0.5f), (-m_vecRoomDimensions.z * 0.5f));
	D3DXVECTOR3 vecMaxExtents = D3DXVECTOR3((m_vecRoomDimensions.x * 0.5f), (m_vecRoomDimensions.y * 0.5f), (m_vecRoomDimensions.z * 0.5f));

#define WALL_OFFSET 1.6f
	vecMaxExtents -= D3DXVECTOR3(WALL_OFFSET, WALL_OFFSET - .8f, WALL_OFFSET);
	vecMinExtents +=  D3DXVECTOR3(WALL_OFFSET, WALL_OFFSET - .8f, WALL_OFFSET);

  	// Projection doesn't change
	D3DXMATRIX matProj;
	D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/2.5f, 1.0f, 0.3f, 35.0f );
	m_pCamera = new NVWalkCamera(matProj, CameraStart, 0.0f, 0.0f, vecMinExtents, vecMaxExtents);

	DWORD dwVBFlags = D3DUSAGE_WRITEONLY;

	Declaration.clear();
	Declaration.push_back(D3DVSD_STREAM(0));
	Declaration.push_back(D3DVSD_REG(0, D3DVSDT_FLOAT3));
	Declaration.push_back(D3DVSD_REG(1, D3DVSDT_FLOAT2));
	Declaration.push_back(D3DVSD_END());

	m_dwWorldShader = 0;
	hr = LoadAndCreateShader(GetFilePath("fog_world.vso"), &Declaration[0], 0, SHADERTYPE_VERTEX, &m_dwWorldShader);
	if (FAILED(hr))
		return hr;

	Declaration.clear();
	Declaration.push_back(D3DVSD_STREAM(0));
	Declaration.push_back(D3DVSD_REG(0, D3DVSDT_FLOAT3));
	Declaration.push_back(D3DVSD_REG(1, D3DVSDT_FLOAT3));
	Declaration.push_back(D3DVSD_REG(2, D3DVSDT_FLOAT2));
	Declaration.push_back(D3DVSD_END());

	m_dwFogShader = 0;
	hr = LoadAndCreateShader(GetFilePath("fog.vso"), &Declaration[0], 0, SHADERTYPE_VERTEX, &m_dwFogShader);
	if (FAILED(hr))
		return hr;

	// Setup constants
	m_pD3DDev->SetVertexShaderConstant(CV_ZERO, D3DXVECTOR4(0.0f, 0.0f, 0.0f, 0.0f), 1);
	m_pD3DDev->SetVertexShaderConstant(CV_ONE, D3DXVECTOR4(1.0f, 1.0f, 1.0f, 1.0f), 1);

    hr = m_pD3DDev->CreateVertexBuffer(NUM_CUBE_VERTICES * sizeof(WorldBoxVertex), D3DUSAGE_WRITEONLY, 0, D3DPOOL_MANAGED, &m_pWorldBoxVertices);
	if (FAILED(hr))
	{
		m_strLastError = "Could not create vertex buffer!";
		return hr;
	}

	hr = m_pD3DDev->CreateIndexBuffer(NUM_CUBE_INDICES * sizeof(WORD), D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED, &m_pWorldBoxIndices);
	if (FAILED(hr))
	{
		m_strLastError = "Could not create index buffer!";
		return hr;
	}

	WorldBoxVertex* pVertices = NULL;
	WORD* pIndices = NULL;
	hr = m_pWorldBoxVertices->Lock(0, sizeof(WorldBoxVertex) * NUM_CUBE_VERTICES,(BYTE**)&pVertices, 0);
	if (FAILED(hr))
	{
		m_strLastError = "Could not lock vertex buffer!";
		return hr;
	}

	hr = m_pWorldBoxIndices->Lock(0, sizeof(WORD) * NUM_CUBE_INDICES,(BYTE**)&pIndices, 0);
	if (FAILED(hr))
	{
		m_strLastError = "Could not lock vertex buffer!";
		return hr;
	}
	CreateCube(pVertices, pIndices);

	
	hr = D3DXCreateTextureFromFileEx(m_pD3DDev, 
		GetFilePath("sunol_back_mipmap.dds").c_str(),
		D3DX_DEFAULT,
		D3DX_DEFAULT,
		0,
		0,
		D3DFMT_UNKNOWN,
		D3DPOOL_MANAGED,
		D3DX_FILTER_LINEAR,
		D3DX_FILTER_LINEAR,
		0,
		NULL,
		NULL,
		&m_pWorldTextures[D3DCUBEMAP_FACE_NEGATIVE_Z]);
	if (FAILED(hr))
	{
		m_strLastError = "Could not create sunol_back_mipmap.dds";
		return hr;
	}
	hr = D3DXCreateTextureFromFileEx(m_pD3DDev, 
		GetFilePath("sunol_front_mipmap.dds").c_str(),
		D3DX_DEFAULT,
		D3DX_DEFAULT,
		0,
		0,
		D3DFMT_UNKNOWN,
		D3DPOOL_MANAGED,
		D3DX_FILTER_LINEAR,
		D3DX_FILTER_LINEAR,
		0,
		NULL,
		NULL,
		&m_pWorldTextures[D3DCUBEMAP_FACE_POSITIVE_Z]);
	if (FAILED(hr))
	{
		m_strLastError = "Could not create sunol_front_mipmap.dds";
		return hr;
	}
	hr = D3DXCreateTextureFromFileEx(m_pD3DDev, 
		GetFilePath("sunol_bottom_mipmap.dds").c_str(),
		D3DX_DEFAULT,
		D3DX_DEFAULT,
		0,
		0,
		D3DFMT_UNKNOWN,
		D3DPOOL_MANAGED,
		D3DX_FILTER_LINEAR,
		D3DX_FILTER_LINEAR,
		0,
		NULL,
		NULL,
		&m_pWorldTextures[D3DCUBEMAP_FACE_POSITIVE_Y]);
	if (FAILED(hr))
	{
		m_strLastError = "Could not create sunol_bottom_mipmap.dds";
		return hr;
	}
	hr = D3DXCreateTextureFromFileEx(m_pD3DDev, 
		GetFilePath("sunol_top_mipmap.dds").c_str(),
		D3DX_DEFAULT,
		D3DX_DEFAULT,
		0,
		0,
		D3DFMT_UNKNOWN,
		D3DPOOL_MANAGED,
		D3DX_FILTER_LINEAR,
		D3DX_FILTER_LINEAR,
		0,
		NULL,
		NULL,
		&m_pWorldTextures[D3DCUBEMAP_FACE_NEGATIVE_Y]);
	if (FAILED(hr))
	{
		m_strLastError = "Could not create sunol_top_mipmap.dds";
		return hr;
	}
	hr = D3DXCreateTextureFromFileEx(m_pD3DDev, 

⌨️ 快捷键说明

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