zoukankan      html  css  js  c++  java
  • 转 关于 D3D的 SetRenderState 以及AlphaBlend 和AlphaTest

    改变D3D中的渲染状态

    1). 设置着色模式:                                                         

    SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT //设置平面着色模式

    SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD //设置格劳德着色模式

    2). 设置多边形填充模式:

    SetRenderStateD3DRS_FILLMODE, D3DFILL_POINT //点填充模式,D3D在多边形的每个顶点绘制一个像素

    SetRenderStateD3DRS_FILLMODE, D3DFILL_WIREFRAME //线填充模式,D3D在多边形的每个边绘制一条线

    SetRenderStateD3DRS_FILLMODE, D3DFILL_SOLID   //面模式,D3D默认模式,对多边形的面进行填充

    3). 设置全景图形抗锯齿:

    SetRenderState(D3DRS_MUTISAMPLEANTIALIAS, TRUE)   //抗锯齿

    SetRenderState(D3DRS_MUTISAMPLEANTIALIAS, FALSE)   //不抗锯齿

    4). 设置剔除模式:


    SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE) //不剔除任何面

    5). 设置光照模式:
    SetRenderState(D3DRS_AMBIENT, D3DCOLOR ambientColor); //为整个场景设置环境光
    SetRenderState(D3DRS_SPECULARENABLE, TRUE);   //激活镜面反射计算(D3D默认情况下关闭)

    6). 启动/关闭深度测试:
    SetRenderState( D3DRS_ZENABLE, TRUE );    //启用深度测试

     

    7) 设置纹理过滤器

      //线性纹理

    SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);

    SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);

      //最近点采样

    SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_ POINT);

    SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);

      //各向异性纹理过滤

    SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC)

    SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_ ANISOTROPIC);

    8)

    SetRenderState( D3DRS_POINTSCALEENABLE, TRUE ); //打开缩放功能

    9)

    SetRenderState( D3DRS_POINTSCALE_A , FtoDW( 1.00f ));//设置因子,下同

    SetRenderState( D3DRS_POINTSCALE_B , FtoDW( 1.00F ));

    SetRenderState( D3DRS_POINTSCALE_C , FtoDW( 1.00f ));

    10)

    SetRenderState( D3DRS_POINTSIZE_MAX, FtoDW( 5.00f ));//设置点大小上限,下类似

    SetRenderState( D3DRS_POINTSIZE_MAX, FtoDW( 5.00f ));

    SetRenderState( D3DRS_POINTSPRITEENABLE , TRUE ) ;  //打开点精灵效果

    SetRenderState( D3DRS_AMBIENT,  0xffffffff );  //设置环境光颜色开启ALPHA混合效果

    11)

    设置混合因子:

    源:SetRenderState( D3DRS_SRCBLEND , D3DBLEND_SRCALPHA );

    目的:SetRenderState( D3DRS_DESTBLEND , D3DBLEND_INVSRCALPHA);

    第二个参数是 D3DBLEND的枚举结构

     

     

     

    1.       深度测试
    a)         深度缓冲区:屏幕上每个像素点的深度信息的一块内存缓冲区.D3D通过比较当前绘制的像素点的深度和对应深度缓冲区的点的深度值来决定是否绘制当前像素.
    b)        D3DPRESENT_PARAMETERS. AutoDepthStencilFormat = D3DFMT_D16
    示深度值由16位二进制表示
    开启深度测试:pDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
    深度测试函数:D3DRS_ZFUNC:
    D3DCMP_NEVER
    总是返回FALSE
    D3DCMP_LESS (常用)
    小于深度缓冲区的相应值时返回TRUE
    D3DCMP_EQUAL
    等于
    D3DCMP_LESSEQUAL
    小于等于
    D3DCMP_GREATER
    大于
    D3DCMP_NOTEQUAL
    不等于
    D3DCMP_GREATEREQUAL
    大于等于
    D3DCMP_ALWAYS
    总是返回TRUE
    更新缓冲区:保持深度缓冲区不变还是用当前像素的深度值更新
    pDevice->SetRenderState( D3DRS_ZWRITEENABLE, TRUE );
    2.       Alpha混合
    a)         原理:Color = (RGBsrc * Ksrc) OP (RGBdst * Kdst)
    最常用的方法:Color = (RGBsrc * Alphasrc) + (RGBdst * (1 – Alphasrc)
     
    b)        应用
    启用:pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
    Blend mode factor
    Description
    D3DBLEND_ZERO
    (0, 0, 0, 0)
    D3DBLEND_ONE
    (1, 1, 1, 1)
    D3DBLEND_SRCCOLOR
    (Rs, Gs, Bs, As)
    D3DBLEND_INVSRCCOLOR
    (1-Rs, 1-Gs, 1-Bs, 1-As)
    D3DBLEND_SRCALPHA
    (As, As, As, As)
    D3DBLEND_INVSRCALPHA
    (1-As, 1-As, 1-As, 1-As)
    D3DBLEND_DESTALPHA
    (Ad, Ad, Ad, Ad)
    D3DBLEND_INVDESTALPHA
    (1-Ad, 1-Ad, 1-Ad, 1-Ad)
    D3DBLEND_DESTCOLOR
    (Rd, Gd, Bd, Ad)
    D3DBLEND_INVDESTCOLOR
    (1-Rd, 1-Gd, 1-Bd, 1-Ad)
    D3DBLEND_SRCALPHASAT
    (f, f, f, 1); f = min(As, 1-Ad)
    Alpha混合方法
    D3DBLENDOP_ADD
    源计算结果与颜色缓冲区计算结果相加
    D3DBLENDOP_SUBTRACT
    源计算结果减去颜色缓冲区计算结果
    D3DBLENDOP_REVSUBTRACT
    颜色缓冲区计算结果减去源计算结果
    D3DBLENDOP_MIN
    MIN(源计算结果, 颜色缓冲区计算结果)
    D3DBLENDOP_MAX
    MAX(源计算结果, 颜色缓冲区计算结果)
    Color = (RGBsrc * Alphasrc) + (RGBdst * (1 – Alphasrc) )的设置示例:
    pDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
    pDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
    pDevice->SetRenderState( D3DBLENDOP, D3DBLENDOP_ADD );(默认值,可选)
    3.       Alpha测试
    a)         原理
    根据Alpha测试条件来决定当前像素是否绘制,并不需要对颜色缓冲进行操作,所以速度比Alpha混合要快.
    b)        应用
    启用:pDevice->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE );
    Alpha测试函数
    D3DCMP_FUNC枚举,默认为D3DCMP_ALWAYS
    参考值:
    pDevice->SetRenderState( D3DRS_ALPHAREF, 0x00000081);

     

  • 相关阅读:
    返回一个整数数组中子数组的最大值
    软工概论第二周个人项目四则运算二(改进)
    构建之法阅读笔记01
    单例模式
    .net基础加强
    使用jquery easy ui
    抽象工厂类
    System.Linq.Expressions.Expression
    创建上下文对象
    DBSesson
  • 原文地址:https://www.cnblogs.com/SHGF/p/3070360.html
Copyright © 2011-2022 走看看