//-----------------------------------------------------------------------------
// File: Matrices.cpp
// 各种光源的着色器模拟
// ajohn
// Copyright (c) 2000 Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
#include <d3dx8.h>
#include <mmsystem.h>
#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code)& 0x8000)?1:0)
#define KEYUP(vk_code) ((GetAsyncKeyState(vk_code)& 0x8000)?0:1)
#define VK_D 0x44
#define VK_S 0x53
#define VK_A 0x41
//-----------------------------------------------------------------------------
// Global variables
//-----------------------------------------------------------------------------
LPDIRECT3D8 g_pD3D = NULL; // Used to create the D3DDevice
LPDIRECT3DDEVICE8 g_pd3dDevice = NULL; // Our rendering device
HWND hWnd = NULL;
LPDIRECT3DVERTEXBUFFER8 g_pVB = NULL; //顶点缓冲,索引顶点缓冲 ,属性缓冲
LPDIRECT3DINDEXBUFFER8 g_pIB = NULL;
LPD3DXMESH g_pMesh = NULL; //mesh
D3DMATERIAL8* g_pMeshMaterials = NULL; //材质数组
DWORD g_NumMaterials; //材质数量
D3DXMATRIX matProj;
D3DXMATRIX matWorld;
D3DXMATRIX matView;
//渲染到纹理的纹理
LPDIRECT3DTEXTURE8 g_pDisplayTexture;
//纹理的颜色表面
LPDIRECT3DSURFACE8 g_pDisplayTextureSurface;
//渲染文理的Zbuff
LPDIRECT3DSURFACE8 g_pDisplayZSurface;
//后缓冲的表面
LPDIRECT3DSURFACE8 g_pBackBuffer;
//后缓冲的zbuff
LPDIRECT3DSURFACE8 g_pZBuffer;
//顶点buff用来贴渲染纹理
LPDIRECT3DVERTEXBUFFER8 g_pDisplayVertexBuffer;
//翻页信息参数
D3DPRESENT_PARAMETERS g_PresentParameters;
//设备创建参数
D3DDEVICE_CREATION_PARAMETERS g_CreationParameters;
DWORD g_pVS = 1;
DWORD g_pVSDirLight = NULL; //着色器
DWORD g_pVSPointLight = NULL;
DWORD g_pVSSpotLight = NULL;
DWORD choise = NULL;
//DWORD g_pPixelShader = NULL;
// A structure for our custom vertex type
struct CUSTOMVERTEX
{
FLOAT x, y, z; // The untransformed, 3D position for the vertex
FLOAT nx,ny,nz;
DWORD color;
};
struct DISPLAY_VERTEX
{
float x, y, z, rhw;
DWORD color;
float u, v;
};
DWORD Declaration[] =
{
D3DVSD_STREAM(0),
D3DVSD_REG(D3DVSDE_POSITION, D3DVSDT_FLOAT3),
D3DVSD_REG(D3DVSDE_NORMAL, D3DVSDT_FLOAT3),
D3DVSD_REG(D3DVSDE_DIFFUSE, D3DVSDT_D3DCOLOR),
D3DVSD_END()
};
// Our custom FVF, which describes our custom vertex structure
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_DIFFUSE)
#define D3DFVF_DISPLAYVERTEX (D3DFVF_XYZRHW | D3DFVF_TEX1 | D3DFVF_DIFFUSE)
HRESULT LoadMesh()
{
LPD3DXBUFFER pD3DXMtrlBuffer;
LPD3DXMESH pOriginalMesh;
if(FAILED(D3DXLoadMeshFromX("skullocc.x",D3DXMESH_MANAGED,g_pd3dDevice,NULL,&pD3DXMtrlBuffer,&g_NumMaterials,&pOriginalMesh)))
{
MessageBox(0,"载入x模型出错","error",MB_OK);
return FALSE;
}
D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();
g_pMeshMaterials = new D3DMATERIAL8[g_NumMaterials];
for(DWORD MatCount = 0;MatCount<g_NumMaterials;MatCount++)
{
g_pMeshMaterials[MatCount]=d3dxMaterials[MatCount].MatD3D;
}
pD3DXMtrlBuffer->Release();
DWORD MeshFVF = pOriginalMesh->GetFVF();
if(MeshFVF!=D3DFVF_CUSTOMVERTEX)//如果顶点格式不相符合
{
if(FAILED(pOriginalMesh->CloneMeshFVF(D3DXMESH_MANAGED,D3DFVF_CUSTOMVERTEX,g_pd3dDevice,&g_pMesh)))
{
MessageBox(0,"克隆FVF出错","Error",MB_OK);
}
pOriginalMesh->Release();
pOriginalMesh = NULL;
}
else
g_pMesh = pOriginalMesh;
return S_OK;
}
BOOL PostInitialize()
{
D3DDISPLAYMODE CurrentMode;
if(SUCCEEDED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&CurrentMode)))
{
ZeroMemory((void*)&g_PresentParameters,sizeof(D3DPRESENT_PARAMETERS));
g_PresentParameters.Windowed = TRUE;
g_PresentParameters.SwapEffect = D3DSWAPEFFECT_COPY;
g_PresentParameters.BackBufferFormat = CurrentMode.Format;
g_PresentParameters.EnableAutoDepthStencil = TRUE;
g_PresentParameters.AutoDepthStencilFormat = D3DFMT_D24S8;
g_CreationParameters.AdapterOrdinal = D3DADAPTER_DEFAULT;
g_CreationParameters.DeviceType = D3DDEVTYPE_HAL;
g_CreationParameters.hFocusWindow = hWnd;
D3DCAPS8 Caps;
g_pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &Caps);
if (Caps.VertexShaderVersion >= D3DVS_VERSION(1,1))
g_CreationParameters.BehaviorFlags = D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
g_CreationParameters.BehaviorFlags = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
if(FAILED(g_pD3D->CreateDevice( g_CreationParameters.AdapterOrdinal,
g_CreationParameters.DeviceType,
g_CreationParameters.hFocusWindow,
g_CreationParameters.BehaviorFlags,
&g_PresentParameters,
&g_pd3dDevice)))
return FALSE;
}
RECT WindowRect; //当前屏幕
GetClientRect(hWnd, &WindowRect);
D3DXMatrixPerspectiveFovLH(&matProj,
D3DX_PI / 4,
1.0,
1.0f, 1000.0f);
//世界矩阵归一化
D3DXMatrixIdentity(&matWorld);
//创建渲染目标纹理
if (FAILED(D3DXCreateTexture(g_pd3dDevice, 1024, 1024, 1,
D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8,
D3DPOOL_DEFAULT, &g_pDisplayTexture)))
return E_FAIL;
//创建渲染目标纹理深度
if (FAILED(g_pd3dDevice->CreateDepthStencilSurface(1024,
1024,
D3DFMT_D24S8,
D3DMULTISAMPLE_NONE,
&g_pDisplayZSurface)))
return E_FAIL;
//得到后缓冲指针
if (FAILED(g_pd3dDevice->GetRenderTarget(&g_pBackBuffer)))
return E_FAIL;
//得到深度缓冲指针
if (FAILED(g_pd3dDevice->GetDepthStencilSurface(&g_pZBuffer)))
return E_FAIL;
//得到渲染目标纹理的最高页面为颜色缓冲区
if (FAILED(g_pDisplayTexture->GetSurfaceLevel(0, &g_pDisplayTextureSurface)))
return E_FAIL;
return true;
}
HRESULT ExtractBuffers()
{
g_pMesh->GetVertexBuffer(&g_pVB);
g_pMesh->GetIndexBuffer(&g_pIB);
CUSTOMVERTEX* pMeshVertices;
short* pIndices;
DWORD* pAttribs;
g_pVB->Lock(0,g_pMesh->GetNumVertices()*sizeof(CUSTOMVERTEX),(BYTE**)&pMeshVertices,0);
g_pIB->Lock(0,3*g_pMesh->GetNumFaces()*sizeof(short),(BYTE**)&pIndices,D3DLOCK_READONLY);
g_pMesh->LockAttributeBuffer(D3DLOCK_READONLY,&pAttribs);
for(DWORD face = 0;face<g_pMesh->GetNumFaces();face++)
{
D3DXCOLOR diffuse = RGB(255,255,255);
pMeshVertices[pIndices[face*3+0]].color = diffuse;
float a = pMeshVertices[pIndices[face*3+0]].nx;
pMeshVertices[pIndices[face*3+1]].color = diffuse;
pMeshVertices[pIndices[face*3+2]].color = diffuse;
}
g_pVB->Unlock();
g_pIB->Unlock();
g_pMesh->UnlockAttributeBuffer();
if(FAILED(D3DXComputeNormals(g_pMesh)))
{
MessageBox(0,"计算法线出错","error",MB_OK);
return FALSE;
}
g_pd3dDevice->SetStreamSource(0,g_pVB,sizeof(CUSTOMVERTEX));
g_pd3dDevice->SetIndices(g_pIB,0);
//载入卡通纹理
return S_OK;
}
HRESULT CreateShalders()
{
ID3DXBuffer* pShaderBuffer;
ID3DXBuffer* pShaderErrors;
//编译shader.vs 如果编译通过,指令保存在shaderbuffer里面
if (FAILED(D3DXAssembleShaderFromFile("directionlight.vs",
0, NULL, &pShaderBuffer, &pShaderErrors)))
{
MessageBox(0,"着色器编译出错","error",MB_OK);
return E_FAIL;
}
//创建着色器,包含顶点申明
if (FAILED(g_pd3dDevice->CreateVertexShader(Declaration,
(DWORD *)pShaderBuffer->GetBufferPointer(),
&g_pVSDirLight, 0)))
{
MessageBox(0,"着色器创建出错","error",MB_OK);
return E_FAIL;
}
//释放顶点着色器指令
pShaderBuffer->Release();
if (FAILED(D3DXAssembleShaderFromFile("PointLight.vs",
0, NULL, &pShaderBuffer, &pShaderErrors)))
{
MessageBox(0,"着色器编译出错","error",MB_OK);
return E_FAIL;
}
全屏运动模糊后处理渲染(基于DirectX8.1实现)
5星 · 超过95%的资源 需积分: 16 173 浏览量
2008-11-17
16:10:42
上传
评论
收藏 1.12MB RAR 举报
shenghanzhouyou
- 粉丝: 1
- 资源: 10
最新资源
- BLOCK_TYPE_HEARTBEAT_D70A3465D4EE4E9_046141_dump_1st.dmp
- 项目方法测试调用接口工具
- studyupdate
- 基于西瓜数据集的决策树实现.zip
- 60套HTML网站源码-响应式-涵盖(简历&作品展示&商业&科技&培训&商城&课设等)-适配移动设备-解压即用.zip
- 贪心算法要点和难点实例代码解析
- 65套HTML网站源码-响应式-涵盖(简历&作品展示&商业&科技&培训&商城&课设等)-适配移动设备-解压即用.zip
- 多因素决策树的Python实现.zip
- 使用Python在莺尾花数据集上实现了决策树算法,文件里有数据集.zip
- python实现决策树.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈