演示程序下载地址:http://download.csdn.net/detail/jiangcaiyang123/4091157
这次给大家奉献的是我最近学习DirectX基础的一些内容:进行Alpha混合。虽然我在很多的游戏中看到了美轮美奂的半透明效果,但是能够自己制作出半透明的效果还是一件非常欣慰的事情。因为这不仅仅是自己目的的达成,还是自己自学能力的提升。
Alpha是像素颜色中的一个值,但是改变它并不能改变任何颜色,而是改变它的透明度。它占一个字节,也就是说它的取值范围为从0到255。0代表完全看不见,255表示完全不透明。为此我记住了两个英文单词:transparent和opaque。为了能够使用Alpha制作出半透明的效果,要在D3D设备上调用一个函数来启用它。这个函数就是SetRenderState。下面就是启用Alpha混合的典型用法:
// 设置Alpha混合
m_pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
m_pDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
m_pDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
//其它复杂的我也没有看懂,反正Alpha混合是在光栅化(Rasterization)上进行的。其中还有很多其它的操作,但是在初级阶段是用不着啦。所以我也暂时不研究了。它在《Real Time Rendering》这本书里有。这里是我的修改的项目,就是将以前的项目稍微进行了修改,就可以显示这样的效果了:
// RenderByFileDialog.cpp Alpha半透明效果的实现文件
// 2012年2月26日13:35:02 最后编辑
#include <atlbase.h> // ATL应用程序基础库
#include <atlapp.h> // ATL应用程序必须有的文件
#include <atldlgs.h> // 包含WTL打开文件的对话框
#include "RenderByFileDialog.h"
#include "resource.h" // 资源头文件
#define SAFE_RELEASE( p ) if ( p ) { p->Release( ); p = 0; }
CRenderByFileDialog::CRenderByFileDialog( HINSTANCE hInst, HWND hWnd,
LPDIRECT3DDEVICE9 pDevice,
int width, int height )// 构造函数
{
// 成员赋值
m_pDevice = pDevice;
m_MoveFact = 0.01f;
m_CurImageFile = TEXT( "" );
// 设置视角
ZeroMemory( &m_Viewport, sizeof( m_Viewport ) );// 清零
m_Viewport.X = 0;
m_Viewport.Y = 0;
m_Viewport.Width = width;
m_Viewport.Height = height;
m_Viewport.MinZ = 0.0f;
m_Viewport.MaxZ = 1.0f;
m_pDevice->SetViewport( &m_Viewport );
// 创建顶点缓存
HRESULT hr;
hr = m_pDevice->CreateVertexBuffer( 8 * sizeof( STVertex ), D3DUSAGE_WRITEONLY,
TEXTURE_FVF, D3DPOOL_MANAGED, &m_pBuffer, NULL );
ThrowIfFailed( hr, "不会吧,这都无法创建顶点缓存。⊙﹏⊙