7.1融合方程

1概念

融合技术将当前光栅化像素的颜色与以前已光栅化并处于同一个位置的像素颜色进行合成,即将当前要进行光栅化的三角形单元与已写入后台的像素进行融合

2需要遵循的原则:

(1)先绘制不需要融合的物体

(2)需要融合的物品按照摄像机的深度值进行排序

3融合方程

color = (RGBsrc * Ksrc) OP (RGBdst * Kdst)

Ksrc   OP    Kdst都为可以设置的参数

4开启融合运算

Device->SetRenderState(D3DRS_ALPHAENABLE,true);

7.2融合因子

设置融合因子

Device->SetRenderState(D3DRS_SRCBLEND,flag);

Device->SetRenderState(D3DRS_DESTBLEND,flag);

flag为D3DBLEND类型参数,可以为如下参数:

  1. typedef enum D3DBLEND
  2. {
  3. D3DBLEND_ZERO = 1,
  4. D3DBLEND_ONE = 2,
  5. D3DBLEND_SRCCOLOR = 3,
  6. D3DBLEND_INVSRCCOLOR = 4,
  7. D3DBLEND_SRCALPHA = 5,
  8. D3DBLEND_INVSRCALPHA = 6,
  9. D3DBLEND_DESTALPHA = 7,
  10. D3DBLEND_INVDESTALPHA = 8,
  11. D3DBLEND_DESTCOLOR = 9,
  12. D3DBLEND_INVDESTCOLOR = 10,
  13. D3DBLEND_SRCALPHASAT = 11,
  14. D3DBLEND_BOTHSRCALPHA = 12,
  15. D3DBLEND_BOTHINVSRCALPHA = 13,
  16. D3DBLEND_BLENDFACTOR = 14,
  17. D3DBLEND_INVBLENDFACTOR = 15,
  18. D3DBLEND_FORCE_DWORD = 0x7fffffff,
  19. } D3DBLEND, *LPD3DBLEND;
  1. 半透明效果可以将SRC设置为D3DBLEND_SRCALPHA Dst设置为D3DBLEND_INVDESTALPHA ,可以实现透明效果
  1. 参考网页:http://www.cnblogs.com/wonderKK/archive/2011/11/07/2240372.html
  1. 7.3透明度的来源
  1. HRESULT SetTextureStageState
  1. DWORD Stage,
  2. D3DTEXTURESTAGESTATETYPE Type,
  3. DWORD Value
  4. );
  1. typedef enum D3DTEXTURESTAGESTATETYPE
  2. {
  3. D3DTSS_COLOROP = 1,
  4. D3DTSS_COLORARG1 = 2,
  5. D3DTSS_COLORARG2 = 3,
  6. D3DTSS_ALPHAOP = 4,
  7. D3DTSS_ALPHAARG1 = 5,
  8. D3DTSS_ALPHAARG2 = 6,
  9. D3DTSS_BUMPENVMAT00 = 7,
  10. D3DTSS_BUMPENVMAT01 = 8,
  11. D3DTSS_BUMPENVMAT10 = 9,
  12. D3DTSS_BUMPENVMAT11 = 10,
  13. D3DTSS_TEXCOORDINDEX = 11,
  14. D3DTSS_BUMPENVLSCALE = 22,
  15. D3DTSS_BUMPENVLOFFSET = 23,
  16. D3DTSS_TEXTURETRANSFORMFLAGS = 24,
  17. D3DTSS_COLORARG0 = 26,
  18. D3DTSS_ALPHAARG0 = 27,
  19. D3DTSS_RESULTARG = 28,
  20. D3DTSS_CONSTANT = 32,
  21. D3DTSS_FORCE_DWORD = 0x7fffffff,
  22. } D3DTEXTURESTAGESTATETYPE, *LPD3DTEXTURESTAGESTATETYPE;
  1. 设置aphla收来源于alpha通道:
  1. Device->SetTextureStageState(0,D3DTSS_ALPHARG1,D3DDA_TEXTURE);
  1. Device->SetTextureStageState(0,D3DTSS_ALPHA_OP,D3DOP_SELECTARG1);
  1.  
  1. 7.4透明效果
  1. 1)设置融合因子 D3DRS_SRCBLEND D3DRS_DESTBLEND
  1. 2)设置alpha数据来源
  1. 3)启用融合状态
  1.  
  1.  
  1. #include "d3dUtility.h"
  1.  
  1. //
  1. // Globals
  1. //
  1.  
  1. IDirect3DDevice9* Device = 0;
  1.  
  1. const int Width = 640;
  1. const int Height = 480;
  1. ID3DXMesh* Teapot = 0;
  1. D3DMATERIAL9 TeapotMtrl;
  1.  
  1. IDirect3DVertexBuffer9* BkGndQuad = 0;
  1. IDirect3DTexture9* BkGndTex = 0;
  1. D3DMATERIAL9 BkGndMtrl;
  1.  
  1. //
  1. // Classes and Structures
  1. //
  1. struct Vertex
  1. {
  1. Vertex(){}
  1. Vertex(
  1. float x, float y, float z,
  1. float nx, float ny, float nz,
  1. float u, float v)
  1. {
  1. _x = x; _y = y; _z = z;
  1. _nx = nx; _ny = ny; _nz = nz;
  1. _u = u; _v = v;
  1. }
  1. float _x, _y, _z;
  1. float _nx, _ny, _nz;
  1. float _u, _v; // texture coordinates
  1.  
  1. static const DWORD FVF;
  1. };
  1. const DWORD Vertex::FVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1;
  1.  
  1. //
  1. // Framework Functions
  1. //
  1. bool Setup()
  1. {
  1. //
  1. // Init Materials
  1. //
  1.  
  1. TeapotMtrl = d3d::RED_MTRL;
  1. TeapotMtrl.Diffuse.a = 0.5f; // set alpha to 50% opacity
  1.  
  1. BkGndMtrl = d3d::WHITE_MTRL;
  1.  
  1. //
  1. // Create the teapot.
  1. //
  1.  
  1. D3DXCreateTeapot(Device, &Teapot, 0);
  1.  
  1. //
  1. // Create the background quad.
  1. //
  1.  
  1. Device->CreateVertexBuffer(
  1. 6 * sizeof(Vertex),
  1. D3DUSAGE_WRITEONLY,
  1. Vertex::FVF,
  1. D3DPOOL_MANAGED,
  1. &BkGndQuad,
  1. 0);
  1.  
  1. Vertex* v;
  1. BkGndQuad->Lock(0, 0, (void**)&v, 0);
  1.  
  1. v[0] = Vertex(-10.0f, -10.0f, 5.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f);
  1. v[1] = Vertex(-10.0f, 10.0f, 5.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f);
  1. v[2] = Vertex( 10.0f, 10.0f, 5.0f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f);
  1.  
  1. v[3] = Vertex(-10.0f, -10.0f, 5.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f);
  1. v[4] = Vertex( 10.0f, 10.0f, 5.0f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f);
  1. v[5] = Vertex( 10.0f, -10.0f, 5.0f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f);
  1.  
  1. BkGndQuad->Unlock();
  1.  
  1. //
  1. // Setup a directional light.
  1. //
  1.  
  1. D3DLIGHT9 dir;
  1. ::ZeroMemory(&dir, sizeof(dir));
  1. dir.Type = D3DLIGHT_DIRECTIONAL;
  1. dir.Diffuse = d3d::WHITE;
  1. dir.Specular = d3d::WHITE * 0.2f;
  1. dir.Ambient = d3d::WHITE * 0.6f;
  1. dir.Direction = D3DXVECTOR3(0.707f, 0.0f, 0.707f);
  1.  
  1. Device->SetLight(0, &dir);
  1. Device->LightEnable(0, true);
  1.  
  1. Device->SetRenderState(D3DRS_NORMALIZENORMALS, true);
  1. Device->SetRenderState(D3DRS_SPECULARENABLE, true);
  1.  
  1. //
  1. // Create texture and set texture filters.
  1. //
  1.  
  1. D3DXCreateTextureFromFile(
  1. Device,
  1. "crate.jpg",
  1. &BkGndTex);
  1.  
  1. Device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
  1. Device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
  1. Device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);
  1.  
  1. //
  1. // Set alpha blending states.
  1. //
  1.  
  1. // use alpha in material's diffuse component for alpha
  1. Device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);
  1. Device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
  1.  
  1. // set blending factors so that alpha component determines transparency
  1. Device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
  1. Device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
  1.  
  1. //
  1. // Set camera.
  1. //
  1.  
  1. D3DXVECTOR3 pos(0.0f, 0.0f, -3.0f);
  1. D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);
  1. D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);
  1. D3DXMATRIX V;
  1. D3DXMatrixLookAtLH(&V, &pos, &target, &up);
  1.  
  1. Device->SetTransform(D3DTS_VIEW, &V);
  1.  
  1. //
  1. // Set projection matrix.
  1. //
  1.  
  1. D3DXMATRIX proj;
  1. D3DXMatrixPerspectiveFovLH(
  1. &proj,
  1. D3DX_PI * 0.5f, // 90 - degree
  1. (float)Width / (float)Height,
  1. 1.0f,
  1. 1000.0f);
  1. Device->SetTransform(D3DTS_PROJECTION, &proj);
  1.  
  1. return true;
  1. }
  1.  
  1. void Cleanup()
  1. {
  1. d3d::Release<IDirect3DVertexBuffer9*>(BkGndQuad);
  1. d3d::Release<ID3DXMesh*>(Teapot);
  1. d3d::Release<IDirect3DTexture9*>(BkGndTex);
  1. }
  1.  
  1. bool Display(float timeDelta)
  1. {
  1. if( Device )
  1. {
  1. //
  1. // Update
  1. //
  1.  
  1. // increase/decrease alpha via keyboard input
  1. if( ::GetAsyncKeyState('A') & 0x8000f )
  1. TeapotMtrl.Diffuse.a += 0.01f;
  1. if( ::GetAsyncKeyState('S') & 0x8000f )
  1. TeapotMtrl.Diffuse.a -= 0.01f;
  1.  
  1. // force alpha to [0, 1] interval
  1. if(TeapotMtrl.Diffuse.a > 1.0f)
  1. TeapotMtrl.Diffuse.a = 1.0f;
  1. if(TeapotMtrl.Diffuse.a < 0.0f)
  1. TeapotMtrl.Diffuse.a = 0.0f;
  1.  
  1. //
  1. // Render
  1. //
  1.  
  1. Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0);
  1. Device->BeginScene();
  1.  
  1. // Draw the background
  1. D3DXMATRIX W;
  1. D3DXMatrixIdentity(&W);
  1. Device->SetTransform(D3DTS_WORLD, &W);
  1. Device->SetFVF(Vertex::FVF);
  1. Device->SetStreamSource(0, BkGndQuad, 0, sizeof(Vertex));
  1. Device->SetMaterial(&BkGndMtrl);
  1. Device->SetTexture(0, BkGndTex);
  1. Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
  1.  
  1. // Draw the teapot
  1. Device->SetRenderState(D3DRS_ALPHABLENDENABLE, true);
  1.  
  1. D3DXMatrixScaling(&W, 1.5f, 1.5f, 1.5f);
  1. Device->SetTransform(D3DTS_WORLD, &W);
  1. Device->SetMaterial(&TeapotMtrl);
  1. Device->SetTexture(0, 0);
  1. Teapot->DrawSubset(0);
  1.  
  1. Device->SetRenderState(D3DRS_ALPHABLENDENABLE, false);
  1.  
  1. Device->EndScene();
  1. Device->Present(0, 0, 0, 0);
  1. }
  1. return true;
  1. }
  1.  
  1.  
  1. //
  1. // WndProc
  1. //
  1. LRESULT CALLBACK d3d::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  1. {
  1. switch( msg )
  1. {
  1. case WM_DESTROY:
  1. ::PostQuitMessage(0);
  1. break;
  1. case WM_KEYDOWN:
  1. if( wParam == VK_ESCAPE )
  1. ::DestroyWindow(hwnd);
  1. break;
  1. }
  1. return ::DefWindowProc(hwnd, msg, wParam, lParam);
  1. }
  1.  
  1. //
  1. // WinMain
  1. //
  1. int WINAPI WinMain(HINSTANCE hinstance,
  1. HINSTANCE prevInstance,
  1. PSTR cmdLine,
  1. int showCmd)
  1. {
  1. if(!d3d::InitD3D(hinstance,
  1. Width, Height, true, D3DDEVTYPE_HAL, &Device))
  1. {
  1. ::MessageBox(0, "InitD3D() - FAILED", 0, 0);
  1. return 0;
  1. }
  1. if(!Setup())
  1. {
  1. ::MessageBox(0, "Setup() - FAILED", 0, 0);
  1. return 0;
  1. }
  1.  
  1. d3d::EnterMsgLoop( Display );
  1.  
  1. Cleanup();
  1.  
  1. Device->Release();
  1.  
  1. return 0;
  1. }

DirectX基础学习系列5 融合技术的更多相关文章

  1. DirectX 基础学习系列5 纹理映射

    1 纹理坐标 类似BMP图像坐标系,左上为原点 纹理坐标为了规范化,范围限定在[0,1]之间,使用纹理的时候,需要修改顶点结构 struct ColorVetex { float x, y,z; fl ...

  2. DirectX基础学习系列8 渐进网格以及外接体

    1 IUnknown--> ID3DXBUFFER D3D泛型接口: GetBufferPointer Retrieves a pointer to the data in the buffer ...

  3. DirectX基础学习系列1

    1.3 基础 1.3.1表面 表面接口:     IDirect3DSurface9 获得表面信息:GetDesc(D3DSURFACE_DESC) 获得表面接口指针 :LockRect( D3DLO ...

  4. directX基础学习系列7 网格(自己创建)

    D3DXMesh 以及 D3DXPMesh都是从ID3DXBaseMesh类中集成,mesh基本是对三角单元进行操作 ID3DXBaseMesh主要函数: HRESULT DrawSubset( DW ...

  5. DirectX 基础学习系列6 字体

    DIRECTX9自带ID3DXFONT类 内部调用GDI的接口,效率一般,但能够处理一些复杂的字体 HRESULT D3DXCreateFontIndirect( LPDIRECT3DDEVICE9 ...

  6. DirectX基础学习系列4 颜色和光照

    4.1颜色表示 RGB颜色:D3DCOLOR  可以用宏D3DCOLOR_ARGB(a,r,g,b)  D3DCOLOR_XRGB(255,r,g,b) 另外一种浮点表示:D3DCOLORVALUE, ...

  7. DirectX基础学习系列2

    补充第一章矩阵内容 向量 1 3D空间向量,包含浮点数类型坐标 D3DXVECTOR-->D3DXVECTOR3 2向量的长度 D3DXVector3Length(const D3DXVECTO ...

  8. Linux基础学习系列目录导航

    Linux基础学习-通过VM安装RHEL7.4 Linux基础学习-命令行与图形界面切换 Linux基础学习-基本命令 Linux基础学习-RHEL7.4之YUM更换CentOS源 Linux基础学习 ...

  9. Bootstrap基础学习 ---- 系列文章

    [Bootstrap基础学习]05 Bootstrap学习总结 [Bootstrap基础学习]04 Bootstrap的HTML和CSS编码规范 [Bootstrap基础学习]03 Bootstrap ...

随机推荐

  1. Linux防火墙规则的查看、添加、删除和修改

    这里只列出比较常用的参数,详细的请查看man iptables 1.查看 iptables -nvL –line-number -L查看当前表的所有规则,默认查看的是filter表,如果要查看NAT表 ...

  2. 什么才是程序员的核心竞争力?zz

    原文出处: 知乎 姚冬的观点 学习能力,尤其是自学能力,你啥时看到那些有名的程序高手在论坛上问“学习 XX 该看什么书,如何快速学习 XXX,学习 XXX 有什么代码推荐”之类的问题,他们想学什么很快 ...

  3. hdu 1059 多重背包

    题意:价值分别为1,2,3,4,5,6的物品个数分别为a[1],a[2],a[3],a[4],a[5],a[6],问能不能分成两堆价值相等的. 解法:转化成多重背包 #include<stdio ...

  4. Android 在布局容器中动态添加控件

    这里,通过一个小demo,就可以掌握在布局容器中动态添加控件,以动态添加Button控件为例,添加其他控件同样道理. 1.addView 添加控件到布局容器 2.removeView 在布局容器中删掉 ...

  5. Android loading进度条使用简单总结

    在这里,总结一下loading进度条的使用简单总结一下. 一.说起进度条,必须说说条形进度条,经常都会使用到嘛,特别是下载文件进度等等,还有像腾讯QQ安装进度条一样,有个进度总给人良好的用户体验. 先 ...

  6. Spring的profile属性

    使用示例 //注解方式 public class DataSourceConfig { @Bean @Profile("prod") public DataSource dataS ...

  7. 10692 XYM-入门之道

    Description 在华农的ACM界中,也有一对闻名古今的双胖师徒组合—XYM和BM. BM师父有一个特殊的癖好,BM肚子很大,因为他很 喜欢吃西瓜,但是BM的嘴很小,一次只能吃下大小不超过K的西 ...

  8. HDU 2853 & 剩余系+KM模板

    题意: 给你一张二分图,给一个原匹配,求原匹配改动最少的边数使其边权和最大. SOL: 我觉得我的智商还是去搞搞文化课吧..这种题给我独立做我大概只能在暴力优化上下功夫.. 这题的处理方法让我想到了剩 ...

  9. 《为ipad而设计 打造畅销APP》读书笔记

    (1)应用应该对用户程序持ipad的变化做出响应 (2)要设计出确实出色的触摸屏交互界面需要能够触摸到自己的设计,反复触摸,直到找到感觉 (3)chipmunk physics 2D的物理图形库 (4 ...

  10. topcoder SRM 592 DIV2 LittleElephantAndBooks

    #include <iostream> #include <vector> #include <algorithm> using namespace std; cl ...