#include <WinApp.h>
#include <Lights.h>
#include <GeometryGens.h>
#include <RenderStates.h>
#include <AppUtil.h>
#include "Effects.h"
#include "Inputs.h"
using namespace std;
class MirrorDemo: public WinApp
{
public:
MirrorDemo(HINSTANCE hInst, std::wstring title = L"D3D11学习 模板缓冲区的使用->镜子、阴影的实现", int width = 800, int height = 600);
~MirrorDemo();
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();
bool BuildShaderResources();
private:
//两个顶点、索引缓冲冲
ID3D11Buffer *m_VBPlane;
ID3D11Buffer *m_IBPlane; //墙面、地面
ID3D11Buffer *m_VBBox;
ID3D11Buffer *m_IBBox; //箱子
GeoGen::MeshData m_box; //箱子对应mesh
Lights::DirLight m_dirLights[3]; //三个平行光源
ID3D11ShaderResourceView *m_SRVWall; //墙、地板、箱子、镜子对应的纹理
ID3D11ShaderResourceView *m_SRVFloor;
ID3D11ShaderResourceView *m_SRVBox;
ID3D11ShaderResourceView *m_SRVMirror;
Lights::Material m_materialWall; //材质
Lights::Material m_materialFloor;
Lights::Material m_materialBox;
Lights::Material m_materialMirror;
Lights::Material m_materialShadow;
XMFLOAT4X4 m_view; //视角、投影矩阵
XMFLOAT4X4 m_proj;
//每部分对应的变换矩阵
XMFLOAT4X4 m_worldWall;
XMFLOAT4X4 m_wvpWall;
XMFLOAT4X4 m_worldInvTransposeWall;
XMFLOAT4X4 m_texTransWall;
XMFLOAT4X4 m_worldFloor;
XMFLOAT4X4 m_wvpFloor;
XMFLOAT4X4 m_worldInvTransposeFloor;
XMFLOAT4X4 m_texTransFloor;
XMFLOAT4X4 m_worldBox;
XMFLOAT4X4 m_wvpBox;
XMFLOAT4X4 m_worldInvTransposeBox;
XMFLOAT4X4 m_texTransBox;
XMFLOAT4X4 m_worldMirror;
XMFLOAT4X4 m_wvpMirror;
XMFLOAT4X4 m_worldInvTransposeMirror;
XMFLOAT4X4 m_texTransMirror;
//鼠标控制参数
float m_theta, m_phy;
float m_radius;
POINT m_lastPos;
};
MirrorDemo::MirrorDemo(HINSTANCE hInst, std::wstring title, int width, int height):WinApp(hInst,title,width,height),
m_VBPlane(NULL),
m_IBPlane(NULL),
m_VBBox(NULL),
m_IBBox(NULL),
m_SRVWall(NULL),
m_SRVFloor(NULL),
m_SRVBox(NULL),
m_theta(1.5f*XM_PI),
m_phy(XM_PI*0.45f),
m_radius(8.f)
{
//"三点式"照明
//主光源
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_materialWall.ambient = XMFLOAT4(0.5f, 0.5f, 0.5f, 1.0f);
m_materialWall.diffuse = XMFLOAT4(1.f, 1.f, 1.f, 1.0f);
m_materialWall.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_materialFloor.ambient = XMFLOAT4(0.5f, 0.5f, 0.5f, 1.0f);
m_materialFloor.diffuse = XMFLOAT4(1.0f, 1.0f, 1.0f, 1.f);
m_materialFloor.specular = XMFLOAT4(0.8f, 0.8f, 0.8f, 32.0f);
m_materialMirror.ambient = XMFLOAT4(0.5f, 0.5f, 0.5f, 1.0f);
m_materialMirror.diffuse = XMFLOAT4(1.0f, 1.0f, 1.0f, 0.5f);
m_materialMirror.specular = XMFLOAT4(0.8f, 0.8f, 0.8f, 100.0f);
m_materialShadow.ambient = XMFLOAT4(0.f,0.f,0.f,1.f);
m_materialShadow.diffuse = XMFLOAT4(0.f,0.f,0.f,0.5f);
m_materialShadow.specular = XMFLOAT4(0.f,0.f,0.f,16.f);
XMStoreFloat4x4(&m_worldWall,XMMatrixIdentity());
XMStoreFloat4x4(&m_worldInvTransposeWall, XMMatrixIdentity());
XMStoreFloat4x4(&m_texTransWall,XMMatrixIdentity());
XMStoreFloat4x4(&m_worldFloor,XMMatrixIdentity());
XMStoreFloat4x4(&m_worldInvTransposeFloor, XMMatrixIdentity());
XMStoreFloat4x4(&m_texTransFloor, XMMatrixScaling(3.f,3.f,1.f));
XMStoreFloat4x4(&m_texTransBox,XMMatrixIdentity());
XMStoreFloat4x4(&m_worldMirror, XMMatrixIdentity());
XMStoreFloat4x4(&m_worldInvTransposeMirror,XMMatrixIdentity());
XMStoreFloat4x4(&m_texTransMirror,XMMatrixIdentity());
}
MirrorDemo::~MirrorDemo()
{
SafeRelease(m_SRVBox);
SafeRelease(m_SRVFloor);
SafeRelease(m_SRVWall);
SafeRelease(m_SRVMirror);
SafeRelease(m_VBPlane);
SafeRelease(m_IBPlane);
SafeRelease(m_VBBox);
SafeRelease(m_IBBox);
Effects::ReleaseAll();
InputLayouts::ReleaseAll();
RenderStates::ReleaseAll();
}
bool MirrorDemo::Init()
{
if(!WinApp::Init())
return false;
if(!Effects::InitAll(m_d3dDevice))
return false;
if(!InputLayouts::InitAll(m_d3dDevice))
return false;
if(!RenderStates::InitAll(m_d3dDevice))
return false;
if(!BuildBuffers())
return false;
if(!BuildShaderResources())
return false;
return true;
}
bool MirrorDemo::BuildBuffers()
{
//创建墙、地面对应顶点、索引
Vertex::Basic32 vertices[12];
vertices[0].pos = XMFLOAT3(-7.5f,-2.5f,7.5f);
vertices[0].normal = XMFLOAT3(0.f,0.f,-1.f);
vertices[0].tex = XMFLOAT2(0.f,1.f);
vertices[1].pos = XMFLOAT3(-7.5f,2.5f,7.5f);
vertices[1].normal = XMFLOAT3(0.f,0.f,-1.f);
vertices[1].tex = XMFLOAT2(0.f,0.f);
vertices[2].pos = XMFLOAT3(-2.5f,2.5f,7.5f);
vertices[2].normal = XMFLOAT3(0.f,0.f,-1.f);
vertices[2].tex = XMFLOAT2(1.f,0.f);
vertices[3].pos = XMFLOAT3(-2.5f,-2.5f,7.5f);
vertices[3].normal = XMFLOAT3(0.f,0.f,-1.f);
vertices[3].tex = XMFLOAT2(1.f,1.f);
vertices[4].pos = XMFLOAT3(2.5f,-2.5f,7.5f);
vertices[4].normal = XMFLOAT3(0.f,0.f,-1.f);
vertices[4].tex = XMFLOAT2(2.f,1.f);
vertices[5].pos = XMFLOAT3(2.5f,2.5f,7.5f);
vertices[5].normal = XMFLOAT3(0.f,0.f,-1.f);
vertices[5].tex = XMFLOAT2(2.f,0.f);
vertices[6].pos = XMFLOAT3(7.5f,2.5f,7.5f);
vertices[6].normal = XMFLOAT3(0.f,0.f,-1.f);
vertices[6].tex = XMFLOAT2(3.f,0.f);
vertices[7].pos = XMFLOAT3(7.5f,-2.5f,7.5f);
vertices[7].normal = XMFLOAT3(0.f,0.f,-1.f);
vertices[7].tex = XMFLOAT2(3.f,1.f);
vertices[8].pos = XMFLOAT3(-7.5f,-2.5f,-7.5f);
vertices[8].normal = XMFLOAT3(0.f,1.f,0.f);
vertices[8].tex = XMFLOAT2(0.f,1.f);
vertices[9].pos = XMFLOAT3(-7.5f,-2.5f,7.5f);
vertices[9].normal = XMFLOAT3(0.f,1.f,0.f);
vertices[9].tex = XMFLOAT2(0.f,0.f);
vertices[10].pos = XMFLOAT3(7.5f,-2.5f,7.5f);
vertices[10].normal = XMFLOAT3(0.f,1.f,0.f);
vertices[10].tex = XMFLOAT2(1.f,0.f);
vertices[11].pos = XMFLOAT3(7.5f,-2.5f,-7.5f);
vertices[11].normal = XMFLOAT3(0.f,1.f,0.f);
vertices[11].tex = XMFLOAT2(1.f,1.f);
D3D11_BUFFER_DESC vbPlaneDesc = {0};
vbPlaneDesc.ByteWidth = 12 * sizeof(Vertex::Basic32);
vbPlaneDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
vbPlaneDesc.Usage = D3D11_USAGE_IMMUTABLE;
D3D11_SUBRESOURCE_DATA planeData;
planeData.pSysMem = vertices;
planeData.SysMemPitch = 0;
planeData.SysMemSlicePitch = 0;
if(FAILED(m_d3dDevice->CreateBuffer(&vbPlaneDesc,&planeData,&m_VBPlane)))
return false;
UINT indices[24] =
{
0,1,2, 0,2,3,
3,2,5, 3,5,4,
4,5,6, 4,6,7,
8,9,10, 8,10,11
};
D3D11_BUFFER_DESC ibPlaneDesc = {0};
ibPlaneDesc.ByteWidth = 24*sizeof(UINT);
ibPlaneDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;
ibPlaneDesc.Usage = D3D11_USAGE_IMMUTABLE;
D3D11_SUBRESOURCE_DATA planeIData;
planeIData.pSysMem = indices;
planeIData.SysMemPitch = 0;
planeIData.SysMemSlicePitch = 0;
if(FAILED(m_d3dDevice->CreateBuffer(&ibPlaneDesc,&planeIData,&m_IBPlane)))
return false;
//创建箱子顶点、索引
GeoGen::
D3D11平面阴影实现
5星 · 超过95%的资源 需积分: 9 113 浏览量
2013-01-16
04:58:58
上传
评论 1
收藏 535KB ZIP 举报
Brother灬Nam
- 粉丝: 801
- 资源: 21
- 1
- 2
前往页