zoukankan      html  css  js  c++  java
  • Direct3D采样器声明Direct3D Sampler States

    设置纹理采样属性

    HRESULT  SetSamplerState(      
                      DWORD   Sampler,   
    //指定纹理采样属性的纹理层ID0~7
                     D3DSAMPLERSTATETYPE   Type,                //纹理过滤类型
                      DWORD   Value               //设置纹理采样属性值
    );
    第二个参数D3DSAMPLERSTATETYPE  Type取值:
    D3DSAMP_MAGFILTER           //处理放大过滤
    D3DSAMP_MINFILTER                      //处理缩小过滤
    D3DSAMP_MIPFILTER                      //多纹理过滤
    D3DSAMP_MIPMAPLODBIAS           //多级纹理级数偏移值,初始值为0
    D3DSAMP_MAXMIPLEVEL                //最大多纹理级别,初始值为0
    D3DSAMP_MAXANISOTROPY           //各向异性,初始为1
    第三个参数Value取值:
    D3DTEXF_NONE                     //不使用特殊的采样方式
    D3DTEXF_POINT                                               //最近点采样
    D3DTEXF_LINEAR                                             //线性纹理采样
    D3DTEXF_ANISOTROPIC                                 //各向异性纹理采样
    
    

     Default Values

         默认值

         Sampler State                          Default Value

         采样器声明                               默认数值

         * ADDRESSU                           D3DTADDRESS_WRAP
         * ADDRESSV                           D3DTADDRESS_WRAP
         * ADDRESSW                          D3DTADDRESS_WRAP
         * BORDERCOLOR                  0x00000000
         * MAGFILTER                          D3DTEXF_POINT
         * MINFILTER                            D3DTEXF_POINT
         * MIPFILTER                            D3DTEXF_NONE
         * MIPMAPLODBIAS                  0.0f
         * MAXMIPLEVEL                      0
         * MAXANISOTROPY                1
         * SRGBTEXTURE                    0
         * ELEMENTINDEX                    0
         * DMAPOFFSET                      256
       

    由于我们是将图像渲染到一个有限大小的像素网格中(网格的大小就是屏幕的分辨率),这种尺寸的限制将会导致一些问题。例如,将一个16X16的纹理渲染到一个靠近摄像机的物体时可能占用100X100个屏幕像素,因次需要拉伸这个纹理。这样的效果将会得到一个难看的块状纹理。为了解决这个问题我们可以采用过滤器技术,比如线性过滤。

     HRESULT SetSamplerState(DWORD Sampler, D3DSAMPERSTATETYPE State, DWORD Value);

         * Samper - the sampler stage index (you can have a number of stages).

            采样器 - 采样器阶段索引(可以有多个阶段)。

         * State - this is a flag representing one of states that you want to change.

            声明 - 你想要改变的状态的标志。

         * Value - each state can have a value. What goes here depends totally on the State value.

            值 - 每种状态有一个值。该值取决于阶段的值。

    e.g. to turn on bilinear filtering for texturing:

    例如,打开线形纹理过滤:

         device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
         device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
         device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR); 

    纹理选址模式
      纹理采用UV值映射到几何体上。UV值(0, 0)是纹理的左上角,(1, 1)是纹理的右下角。U值向右增长,V值向下增长。若数值大于1则表明对纹理进行重复或平铺。可由这些值来决定如何处理这些情况。
     D3DSAMP_ADDRESSU - U轴选址模式。D3DTADDRESS_WRAP表明若数值大于1,将重复应用纹理。所以如果我们设置U值为10,意味着纹理将在U轴重复10次。D3DTADDRESS_MIRROR与wrap类似,但是每次平铺的是前面一个纹理的镜像。D3DTADDRESS_CLAMP将纹理坐标限制为0到1.数值大于1的地方,纹理颜色依然是数值为1处的颜色。查看DirectX帮助文档获取各种数值情况。

         * D3DSAMP_ADDRESSV - as above but for the V co-ordinate.

           D3DSAMP_ADDRESSV - 如上所述,但针对V轴。

         * D3DSAMP_ADDRESSW - as above but for the W co-ordinate.

           D3DSAMP_ADDRESSW - 如上所述,但针对W轴。

         All the above default to D3DTADDRESS_WRAP.

         上述所有情况的默认值是D3DTADDRESS_WRAP。

    过滤器

      当一个纹理渲染以大于原先的尺寸渲染到屏幕上去,我们说它被放大了。若以小于原先的尺寸渲染,我们说它被缩小了。

     D3DSAMP_MAGFILTER - 若纹理以大于原先的尺寸渲染,看上去将呈块状。通过设置一个过滤器可以改善这种效果。D3DTEXF_POINT选择最近的像素,D3DTEXF_LINEAR应用线性过滤(一种对像素周围2X2的纹理像素取平均值的方法),D3DTEXF_ANISOTROPIC则兼顾考虑图元渲染时的角度,D3DTEXF_PY-RAMIDALQUAD采样4次并使用一个遮罩过滤器,D3DTEXF_GAUSSIANQUAD同样采样4次但是使用一个高斯过滤器。

     D3DSAMP_MINFILTER - 若纹理以小于原先尺寸渲染,将产生收缩效应和其他一些令人讨厌的效果。我们可以应用上述的过滤器解决这个问题。

     D3DSAMP_MIPFILTER - 使用mip map既可以改善纹理视觉效果,又可以减少渲染数据的大小。当向显卡提供纹理时同样提供了该纹理的不同尺寸的一系列纹理。Direct3D在渲染时会选择最接近屏幕渲染尺寸的纹理。同样可以通过对最佳尺寸mip map纹理两边的mip map进行采样来进一步改善效果。该值定义这样一种过滤器--对于放大过滤器来说有同样的选择。

      注意: 并不是所有的显卡都支持所有的采样方法。所有显卡都支持点采样,当前大部分显卡支持线形采样。至于其他采样,你需要检查你的显卡是否支持。可以使用CheckDeviceFormat函数来查看是否支持某种纹理采样。

      例如,检查某个显卡是否支持硬件纹理采样:

        device->CheckDeviceFormat(D3DADPTER_DEFAULT, D3DDEVTYPE_HAL, adapterFormat, D3DUSAGE_QUERY_FILTER, D3DRTYPE_TEXTURE, textureFormat);

     若函数调用成功,说明支持该纹理采样。检测什么样的采样方法受支持需要查询device caps(设备性能)--可使用GetDeviceCaps设备函数做到这一点。


  • 相关阅读:
    springboot 获取enviroment.Properties的几种方式
    Spring Boot加载配置文件的完整步骤
    SpringBoot测试Controller层
    SpringBoot集成测试
    PowerMockito模拟private static final类变量
    玩转Spring JUnit+mockito+powermock单元测试
    Junit测试Controller(MockMVC使用),传输@RequestBody数据解决办法
    spring boot 使用@ConfigurationProperties加载配置文件到类中
    Rsync命令参数详解
    Linux PS 命令详解
  • 原文地址:https://www.cnblogs.com/kex1n/p/2217297.html
Copyright © 2011-2022 走看看