#include <WinApp.h>
#include <Lights.h>
#include <AppUtil.h>
#include <GeometryGens.h>
#include "Inputs.h"
#include "Effects.h"
#include <vector>
#include <string>
#include <RenderStates.h>
using namespace std;
enum RenderOptions
{
Light3Texture = 0,
Light3TextureClip = 1,
Light3TextureClipFog = 2,
Light3TextureClipFogClip = 4
};
class BlendDemo: public WinApp
{
public:
BlendDemo(HINSTANCE hInst, std::wstring title = L"D3D11学习 雾效的实现", int width = 640, int height = 480);
~BlendDemo();
bool Init();
bool Update(float delta);
bool Render();
void OnMouseDown(WPARAM btnState, int x, int y);
void OnMouseUp(WPARAM btnState, int x, int y);
void OnMouseMove(WPARAM btnState, int x, int y);
private:
//创建顶点、索引缓冲区
bool BuildBuffers();
//创建ShaderResourceView
bool BuildSRVs();
private:
ID3D11Buffer *m_VB;
ID3D11Buffer *m_IB;
//3个平行光源(三点式照明)
Lights::DirLight m_dirLights[3];
GeoGen::MeshData m_basin; //水池(包括池壁、池底)
GeoGen::MeshData m_water; //水面
GeoGen::MeshData m_box; //箱子
Lights::Material m_materialWater; //水面材质
Lights::Material m_materialBasin; //水池材质
Lights::Material m_materialBox; //箱子材质
ID3D11ShaderResourceView *m_SRVBasin; //水池壁纹理
ID3D11ShaderResourceView *m_SRVBasinB; //水池底纹理
ID3D11ShaderResourceView *m_SRVWater; //水面纹理
ID3D11ShaderResourceView *m_SRVBox; //箱子纹理
XMFLOAT4X4 m_worldBasin; //世界变换矩阵
XMFLOAT4X4 m_worldViewProjBasin; //世界+视角+投影矩阵
XMFLOAT4X4 m_worldInvTransposeBasin; //世界矩阵的逆+转置,用于法线转换
XMFLOAT4X4 m_texTransBasin; //纹理坐标变换矩阵
XMFLOAT4X4 m_worldBasinB; //同上
XMFLOAT4X4 m_worldViewProjBasinB;
XMFLOAT4X4 m_worldInvTransposeBasinB;
XMFLOAT4X4 m_texTransBasinB;
XMFLOAT4X4 m_worldBox; //同上
XMFLOAT4X4 m_worldViewProjBox;
XMFLOAT4X4 m_worldInvTransposeBox;
XMFLOAT4X4 m_texTransBox;
XMFLOAT4X4 m_worldWater; //同上
XMFLOAT4X4 m_worldViewProjWater;
XMFLOAT4X4 m_worldInvTransposeWater;
XMFLOAT4X4 m_texTransWater;
//用来标记各物体在顶点、索引缓冲区中的位置信息
UINT m_basinVStart, m_basinIStart; //水池壁的顶点、索引开始处
UINT m_basinBVStart, m_basinBIStart; //水池底的顶点、索引开始处
UINT m_basinICount, m_basinBICount; //水池壁、水池底的索引个数
UINT m_boxVStart, m_boxIStart; //箱子的顶点、索引开始处
UINT m_waterVStart, m_waterIStart; //水面的顶点、索引开始处
//雾效参数
float m_fogStart;
float m_fogRange;
XMFLOAT4 m_fogColor;
RenderOptions m_options;
//鼠标控制参数
float m_theta, m_phy;
float m_radius;
POINT m_lastPos;
};
BlendDemo::BlendDemo(HINSTANCE hInst, std::wstring title, int width, int height):WinApp(hInst,title,width,height),
m_VB(NULL),
m_IB(NULL),
m_SRVBasin(NULL),
m_SRVBasinB(NULL),
m_SRVBox(NULL),
m_theta(0.25f*XM_PI),
m_phy(XM_PI*0.45f),
m_radius(8.f),
m_fogStart(0.f),
m_fogRange(20.f),
m_fogColor(reinterpret_cast<const float*>(&Colors::Silver)),
m_options(Light3TextureClipFogClip)
{
//"三点式"照明
//主光源
m_dirLights[0].ambient = XMFLOAT4(0.3f, 0.3f, 0.3f, 1.0f);
m_dirLights[0].diffuse = XMFLOAT4(0.5f, 0.5f, 0.5f, 1.0f);
m_dirLights[0].specular = XMFLOAT4(0.5f, 0.5f, 0.5f, 1.0f);
m_dirLights[0].dir = XMFLOAT3(0.57735f, -0.57735f, 0.57735f);
//侧光源
m_dirLights[1].ambient = XMFLOAT4(0.0f, 0.0f, 0.0f, 1.0f);
m_dirLights[1].diffuse = XMFLOAT4(0.20f, 0.20f, 0.20f, 1.0f);
m_dirLights[1].specular = XMFLOAT4(0.25f, 0.25f, 0.25f, 1.0f);
m_dirLights[1].dir = XMFLOAT3(-0.57735f, -0.57735f, 0.57735f);
//背光源
m_dirLights[2].ambient = XMFLOAT4(0.0f, 0.0f, 0.0f, 1.0f);
m_dirLights[2].diffuse = XMFLOAT4(0.2f, 0.2f, 0.2f, 1.0f);
m_dirLights[2].specular = XMFLOAT4(0.0f, 0.0f, 0.0f, 1.0f);
m_dirLights[2].dir = XMFLOAT3(0.0f, -0.707f, -0.707f);
//材质
m_materialBasin.ambient = XMFLOAT4(0.5f, 0.5f, 0.5f, 1.0f);
m_materialBasin.diffuse = XMFLOAT4(1.f, 1.f, 1.f, 1.0f);
m_materialBasin.specular = XMFLOAT4(0.3f, 0.3f, 0.3f, 16.0f);
m_materialBox.ambient = XMFLOAT4(0.5f, 0.5f, 0.5f, 1.0f);
m_materialBox.diffuse = XMFLOAT4(1.f, 1.f, 1.f, 1.0f);
m_materialBox.specular = XMFLOAT4(0.3f, 0.3f, 0.3f, 16.0f);
m_materialWater.ambient = XMFLOAT4(0.5f, 0.5f, 0.5f, 1.0f);
m_materialWater.diffuse = XMFLOAT4(1.0f, 1.0f, 1.0f, 0.5f);
m_materialWater.specular = XMFLOAT4(0.8f, 0.8f, 0.8f, 32.0f);
//初始化各自的世界变换矩阵及其逆+转置矩阵、纹理坐标变换矩阵
//这些矩阵是固定不变的,因此一次初始化
XMMATRIX I = XMMatrixIdentity();
XMStoreFloat4x4(&m_worldBasin,I);
XMStoreFloat4x4(&m_worldInvTransposeBasin,InverseTranspose(I));
XMStoreFloat4x4(&m_worldBasinB,I);
XMStoreFloat4x4(&m_worldInvTransposeBasinB,InverseTranspose(I));
XMMATRIX wBox = XMMatrixTranslation(0.f,-0.9f,0.f);
XMStoreFloat4x4(&m_worldBox,wBox);
XMStoreFloat4x4(&m_worldInvTransposeBox,InverseTranspose(wBox));
XMMATRIX wWater = XMMatrixTranslation(0.f,-1.f,0.f);
XMStoreFloat4x4(&m_worldWater,wWater);
XMStoreFloat4x4(&m_worldInvTransposeWater,InverseTranspose(wWater));
XMMATRIX texTransBasin = XMMatrixScaling(10.f,1.f,1.f);
XMMATRIX texTransWater = XMMatrixScaling(5.f,5.f,1.f);
//纹理坐标变换矩阵
XMStoreFloat4x4(&m_texTransBasin,texTransBasin);
XMStoreFloat4x4(&m_texTransBasinB,XMMatrixIdentity());
XMStoreFloat4x4(&m_texTransWater,texTransWater);
XMStoreFloat4x4(&m_texTransBox,XMMatrixIdentity());
}
BlendDemo::~BlendDemo()
{
SafeRelease(m_IB);
SafeRelease(m_VB);
SafeRelease(m_SRVBasin);
SafeRelease(m_SRVBasinB);
SafeRelease(m_SRVWater);
SafeRelease(m_SRVBox);
RenderStates::ReleaseAll();
InputLayouts::ReleaseAll();
Effects::ReleaseAll();
}
bool BlendDemo::BuildBuffers()
{
//创建水池壁的顶点、索引(圆柱的侧壁)
GeoGen::CreateCylinder(10.f,10.f,4.f,50,10,m_basin);
m_basinVStart = 0;
m_basinIStart = 0;
m_basinICount = m_basin.indices.size();
m_basinBVStart = m_basin.vertices.size();
m_basinBIStart = m_basin.indices.size();
//添加水池底顶点、索引(圆柱的底)
GeoGen::AddCylinderBottomCap(10.f,10.f,4.f,50,10,m_basin);
m_basinBICount = m_basin.indices.size()-m_basinICount;
//创建水面的顶点、索引(网格)
GeoGen::CreateGrid(20.f,20.f,1,1,m_water);
m_waterIStart = m_basin.indices.size();
m_waterVStart = m_basin.vertices.size();
//创建箱子的顶点、索引
GeoGen::CreateBox(2.f,2.f,2.f,m_box);
m_boxIStart = m_waterIStart + m_water.indices.size();
m_boxVStart = m_waterVStart + m_water.vertices.size();
UINT totalV = m_basin.vertices.size()+m_water.vertices.size()+m_box.vertices.size();
UINT totalI = m_basin.indices.size()+m_water.indices.size()+m_box.indices.size();
//开始创建顶点缓冲区
D3D11_BUFFER_DESC vDesc = {0};
vDesc.ByteWidth = sizeof(Vertex::Basic32)*totalV;
vDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
vDesc.Usage = D3D11_USAGE_IMMUTABLE;
std::vector<Vertex::Basic32> vertices(totalV);
for(UINT i=0; i<m_basin.vertices.size(); ++i)
{
vertices[i].pos = m_basin.vertices[i].pos;
//法线方向取反
//对于水池壁,法线指向水池内侧;对于水池底,法线指向上方
XMFLOAT3 normal = m_basin.vertices[i].normal;
vertices[i].normal = XMFLOAT3(-normal.x,-normal.y,-normal.z);
vertices[i].tex = m_basin.vertices[i].tex;
}
for(UINT i=0; i<m_water.vertices.size(); ++i)
{
vertices[i+m_waterVStart].pos = m_water.vertices[i].pos;
vertices[i+m_waterVStart].normal = m_water.vertices[i].normal;
vertices[i+m_waterVStart].tex = m_water.vertices[i].tex;
}
for(UINT i=0; i<m_box.vertices.size(); ++i)
{
vertices[i+m_boxVStart].pos = m_box.vertices[i].pos;
vertices[i+m_boxVStart].normal = m_box.vertices[i].normal;
vertices[i+m_boxVStart].tex = m_box.vertices[i].tex;
}
D3D11_SUBRESOURCE_DATA vData;
vData.pSysMem = &vertices[0];
vData.SysMemPitch = 0;
vData.SysMemSlicePitch = 0;
if(FAILED(m_d3dDevice->CreateBuffer(&vDesc,&vData,&m_VB)))
{
Message
没有合适的资源?快使用搜索试试~ 我知道了~
D3D11雾效示例程序
共28个文件
cpp:8个
h:8个
dds:4个
4星 · 超过85%的资源 需积分: 20 203 下载量 201 浏览量
2013-01-10
04:06:45
上传
评论 1
收藏 442KB ZIP 举报
温馨提示
该示例用来演示用D3D11实现雾效。该文件包含所示源代码(包括一个d3d11程序框架),及可执行程序。如果exe程序无法执行,请自行手动编译。 相关操作: 要通过'1','2','3','4'数字键来打开、关闭雾效等一些功能。 鼠标左键按下旋转镜头,右键按下调整镜头远近。 程序难免有些错误,欢迎指正~
资源推荐
资源详情
资源评论
收起资源包目录
D3D11雾效示例程序.zip (28个子文件)
D3D11雾效示例程序
Main.cpp 17KB
Inputs.cpp 1KB
FX
Basic.fx 8KB
Light.fx 4KB
Basic.fxo 138KB
Basic.cod 414KB
Blend.sln 876B
textures
water2.dds 43KB
checkboard.dds 128KB
WireFence.dds 341KB
Wood.dds 341KB
Inputs.h 699B
Effects.cpp 4KB
Blend.vcxproj.filters 3KB
Blend.vcxproj 6KB
Effects.h 5KB
Common
Timer.h 908B
AppUtil.h 1KB
Timer.cpp 2KB
RenderStates.cpp 3KB
WinApp.h 2KB
WinApp.cpp 11KB
AppUtil.cpp 434B
GeometryGens.cpp 14KB
RenderStates.h 514B
GeometryGens.h 1KB
Lights.h 1KB
FogDemo.exe 269KB
共 28 条
- 1
Brother灬Nam
- 粉丝: 801
- 资源: 21
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
前往页