zoukankan      html  css  js  c++  java
  • D3D中的纹理映射

    注:这里讲的纹理指的是贴在3D物体表面的一层像素,并不涉及问题的其他用途。

    在篇文档《D3D中的光照》中,我们为每个顶点指定了材质(漫反射材质和高光材质)。

    在这里,我们放弃顶点材质的做法,使用纹理作为物体的材质(即对应的漫反射纹理贴图,高光纹理贴图)。

    在程序中使用纹理,可以大致分为两个阶段。第一阶段,从硬盘中读取文件(C++程序),第二阶段在着色器程序中使用纹理进行一系列计算。

    一、

    1)从硬盘中创建漫反射,高光纹理图。

    ID3D10ShaderResourceView* mDiffuseMapRV;
    ID3D10ShaderResourceView* mSpecMapRV;
    D3DX10CreateShaderResourceViewFromFile(md3dDevice, 
            L"WoodCrate01.dds", 0, 0, &mDiffuseMapRV, 0 );
    D3DX10CreateShaderResourceViewFromFile(md3dDevice, 
            L"defaultspec.dds", 0, 0, &mSpecMapRV, 0 );

    2)将纹理资源视图与效果文件中的纹理变量关联起来

    //guan lian 
    mfxDiffuseMapVar = mFX->GetVariableByName("gDiffuseMap")->AsShaderResource();
    mfxSpecMapVar    = mFX->GetVariableByName("gSpecMap")->AsShaderResource();
    //geng xin
    mfxDiffuseMapVar->SetResource(mDiffuseMapRV);
    mfxSpecMapVar->SetResource(mSpecMapRV);

    二、

    1)效果文件中的纹理变量

    Texture2D gDiffuseMap;
    Texture2D gScepMap;

    2)纹理采样器,用于处理分辨率不同的纹理。

    SamplerState gTriLinearSam
    {
        Filter = MIN_MAG_MIP_LINEAR;//这只是一个例子
    //可选的寻址模式
    //    AddressU = MIRROR;
    //    AddressV = MIRROR;
    };

    3)像素着色器中纹理的处理过程

    (注意:纹理实际上可以在任何着色器中使用,不只是像素着色器。另外,顶点中的纹理坐标进入像素着色器前要先经过纹理坐标变换)

    vOut.texC  = mul(float4(vIn.texC, 0.0f, 1.0f), gTexMtx);
    //不做复杂处理,直接转换输出

    在像素着色器中:

    //使用对应的纹理采样器和纹理坐标,Sample输出
    float4 diffuse = gDiffuseMap.Sample( gTriLinearSam, pIn.texC );
    float4 spec    = gSpecMap.Sample( gTriLinearSam, pIn.texC );
    
    //光照处理..
  • 相关阅读:
    APACHE POI教程 --java应用程序用POI与Excel交互
    Java8初体验(一)lambda表达式语法
    使用Struts 2框架实现文件下载
    常用的MIME类型
    Java8初体验(二)Stream语法详解
    XStream使用总结
    Criteria 和 DetachedCriteria的区别与使用
    Class.isAssignableFrom(Class clz)与instanceof与Class.isInstance(Object obj) 的区别和联系
    xStream完美转换XML、JSON
    spring之BeanFactoryAware接口
  • 原文地址:https://www.cnblogs.com/CAION/p/2922593.html
Copyright © 2011-2022 走看看