#include "Blur.h"
CBlur::CBlur(LPDIRECT3DDEVICE9 device):m_pD3DDevice(device), m_pSourceTexture(NULL),m_pCMesh(NULL),m_pCShader(NULL),m_pPixelShader(NULL),m_pVertexShader(NULL)
{
m_pFrameBuffer[0] = NULL;
m_pFrameBuffer[1] = NULL;
m_pFrameSurface[0] = NULL;
m_pFrameSurface[1] = NULL;
}
CBlur::~CBlur(void)
{
}
void CBlur::Init(){
//load shader
m_pCShader = new CShader(m_pD3DDevice);
m_pVertexShader = m_pCShader->LoadVertexShader("Posteffect_blur.hlsl", "VS", "vs_2_0");
m_pPixelShader = m_pCShader->LoadPixelShader("Posteffect_blur.hlsl", "PS", "ps_2_0");
//load texture
D3DXCreateTextureFromFile(m_pD3DDevice, "lena.tga",&m_pSourceTexture);
UINT width = 512;
UINT height = 512;
//create texture
m_pD3DDevice->CreateTexture(width, height, 1,
D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8,
D3DPOOL_DEFAULT, &m_pFrameBuffer[0], NULL);
m_pD3DDevice->CreateTexture(width, height, 1,
D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8,
D3DPOOL_DEFAULT, &m_pFrameBuffer[1], NULL);
//get surface
m_pFrameBuffer[0]->GetSurfaceLevel(0, &m_pFrameSurface[0]);
m_pFrameBuffer[1]->GetSurfaceLevel(0, &m_pFrameSurface[1]);
}
void CBlur::Render(float timeDelta){
Vertex_VT g_FullScreenQuad[4] =
{
{{-1.0f, -1.0f, 0.0f},{0.0f, 1.0f}},
{{ 1.0f, -1.0f, 0.0f},{1.0f, 1.0f}},
{{-1.0f, 1.0f, 0.0f},{0.0f, 0.0f}},
{{ 1.0f, 1.0f, 0.0f},{1.0f, 0.0f}}
};
m_pD3DDevice->BeginScene();
m_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0, 1.0f, 0);
m_pD3DDevice->SetRenderState(D3DRS_LIGHTING, false);
//pre render
// 计算贴图像素的贴图坐标间距
float texW= 1.0f/512.0f;
float texH = 1.0f/512.0f;
const int num = 9;
D3DXVECTOR4 vTexOffsetX[num], vTexOffsetY[num];
// 计算出邻近像素的贴图坐标间距
//旁边像素的权值
float weight_table[9] = {1.0f, 1.5f, 3.0f, 4.0f, 5.0f, 4.0f, 3.0f, 1.5f, 1.0f};
float sum = 0.0f;
for (int i=0; i<num; i++ )
{
sum += weight_table[i];
}
for (int i=0; i<num; i++ )
{
weight_table[i] /= sum;
}
//像素的位移值
float uv_offset_table[9] = {-4.0f,-3.0f, -2.0f, -1.0f, 0.0f, 1.0f, 2.0f, 3.0f, 4.0f};
for(int i=0; i != num; ++i){
vTexOffsetX[i] = D3DXVECTOR4(uv_offset_table[i] * texW, 0.0f, 0.0f, weight_table[i]);
vTexOffsetY[i] = D3DXVECTOR4(0.0f, uv_offset_table[i] * texH, 0.0f, weight_table[i]);
}
// Direct3D9会偏移1个像素, 代入一个偏移值把它修正回来.
D3DXVECTOR4 vTexOffset(texW * 0.5f, texH * 0.5f, 0.0f,1.0f);
//获取当前的TARGET和SURFACE
LPDIRECT3DSURFACE9 pRenderTargetBackup, pDepthStencilBackup;
m_pD3DDevice->GetRenderTarget(0, &pRenderTargetBackup);
m_pD3DDevice->GetDepthStencilSurface( &pDepthStencilBackup);
// 使用模糊化Shader
D3DXMATRIX trans;
D3DXMatrixIdentity(&trans);
//trans = CCamera::GetInstance()->GetViewMatrix() * CCamera::GetInstance()->GetProjMatrix();
m_pD3DDevice->SetVertexShaderConstantF(0, (float *)&trans, 4);
m_pD3DDevice->SetVertexShaderConstantF(4, (float *)&vTexOffset, 1);
m_pD3DDevice->SetPixelShader(m_pPixelShader);
m_pD3DDevice->SetVertexShader(m_pVertexShader);
// 设置顶点数据格式
m_pD3DDevice->SetFVF(D3DFVF_XYZ|D3DFVF_TEX1);
//use texture
m_pD3DDevice->SetTexture(0, m_pSourceTexture);
m_pD3DDevice->SetDepthStencilSurface(NULL);
//x_axis
m_pD3DDevice->SetRenderTarget(0, m_pFrameSurface[0]);
m_pD3DDevice->SetTexture(0, m_pSourceTexture);
m_pD3DDevice->SetPixelShaderConstantF(0, (float *)vTexOffsetX, num);
m_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, g_FullScreenQuad, sizeof(Vertex_VT));
//y-axis
m_pD3DDevice->SetRenderTarget(0, m_pFrameSurface[1]);
m_pD3DDevice->SetTexture(0, m_pFrameBuffer[0]);
m_pD3DDevice->SetPixelShaderConstantF(0, (float*)vTexOffsetY, num);
m_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, g_FullScreenQuad, sizeof(Vertex_VT));
//real render
m_pD3DDevice->SetRenderTarget(0, pRenderTargetBackup);
m_pD3DDevice->SetDepthStencilSurface(pDepthStencilBackup);
m_pD3DDevice->SetPixelShader(NULL);
m_pD3DDevice->SetVertexShader(NULL);
m_pD3DDevice->SetTexture(0, m_pFrameBuffer[1]);
m_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, g_FullScreenQuad, sizeof(Vertex_VT));
m_pD3DDevice->EndScene();
m_pD3DDevice->Present(0,0,0,0);
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
自己写的小Demo,用Shader实现的纹理模糊化效果,也是学会光晕效果很重要的一环。 基本原理如下: 纹理模糊化处理: 1.对每个像素的X方向上的旁边的九个像素点进行像素获取,然后根据权值加和,得到新的像素值; 2.对每个像素的Y方向上的旁边的九个像素点进行像素获取,然后根据权值加和,得到新的像素值;
资源推荐
资源详情
资源评论


























收起资源包目录











































共 40 条
- 1

waynewying
- 粉丝: 21
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 国家开放大学网络核心课程运行探究.docx
- XX软件有限公司人力资源规划(doc).doc
- 数学教学中如何运用计算机技术.docx
- 单片机任务书(寻迹小车设计).doc
- 云计算加速未来.pptx
- 物联网智慧社区云对讲系统技术方案.doc
- 机械手设计方案论文-关于PLC控制的智能机械手设计方案探究.doc
- 基于神经网络模型的空燃比非线性模型预测控制.docx
- 大学计算机考试试题.doc
- 电子商务行业发展研究报告.pptx
- 物联网与工业自动化的关系.ppt
- 计算机网络通信协议的分析研究.docx
- C语言课程设计方案:学生宿舍管理系统[].doc
- 基于RFID的传感器网络.doc
- 信息化教学设计实施方案高中语文《再别康桥》.doc
- 粉色花卉水彩卡通信纸word信纸模板.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制

- 1
- 2
- 3
前往页