原文:Directx11教程39 纹理映射(9)

    在myTutorialD3D11_32中,我们在PlaneModelClass中增加一个纹理TextureClass* m_Texture;读入一个grass的纹理,程序执行后的效果如下:

完整的代码请参考:

工程文件myTutorialD3D11_32

代码下载:

http://files.cnblogs.com/mikewolf2002/d3d1127-28.zip

http://files.cnblogs.com/mikewolf2002/pictures.zip

      在myTutorialD3D11_33中,我们移去了Model类中的纹理资源视图成员变量,同时也移去了textureclass类,而用一个纹理管理类TexManagerClass管理所有的纹理资源,这样的话,可以更方便的管理纹理,之前把纹理资源放在每个Model 类中,这样每个模型只能对应一个纹理,很不方便。

     纹理管理类很简单,就是用一个vector存储所有的纹理资源视图std::vector<ID3D11ShaderResourceView*> m_TextureRVs;资源管理类会存储资源的名字,以及资源本身,通过createTex函数返回纹理资源,如果纹理资源不存在,创建纹理资源。

ID3D11ShaderResourceView* TexManagerClass::createTex(ID3D11Device* device,string filename)
    {

    // 如果纹理资源已经存在,则返回,否则创建
    for(int i = 0; i < m_TextureRVs.size(); ++i)
        if(! m_TextureNames[i].compare(filename) )
            return m_TextureRVs[i];

    HRESULT result;
    D3DX11_IMAGE_LOAD_INFO loadInfo;
    ZeroMemory( &loadInfo, sizeof(D3DX11_IMAGE_LOAD_INFO) );
    loadInfo.BindFlags = D3D11_BIND_SHADER_RESOURCE;
    loadInfo.Format = DXGI_FORMAT_BC3_UNORM;
    loadInfo.MipLevels = D3DX11_DEFAULT; //这时会产生最大的mipmaps层
    loadInfo.MipFilter = D3DX11_FILTER_LINEAR;

    ID3D11ShaderResourceView* rv = 0;

    // 从一个文件创建纹理资源视图.
    result = D3DX11CreateShaderResourceViewFromFile(device, stringToLPCWSTR(filename), &loadInfo, NULL, &rv, NULL);
    if(FAILED(result))
        {
        HR(result);
        return false;
        }

    m_TextureNames.push_back(filename);
    m_TextureRVs.push_back(rv);

    return rv;
    }

    在GraphicsClass中,我们定义成员变量TexManagerClass*  m_TexManager;在渲染函数中,最后一个参数直接用m_TexManager->createTex(m_D3D->GetDevice(),string("grass.dds"))这样的方式得到纹理资源。

//把plane顶点和索引数据放入缓冲区,准备渲染
m_PlaneModel->Render(m_D3D->GetDeviceContext());
//用light shader texture渲染

result = m_LightTexShader->Render(m_D3D->GetDeviceContext(), m_PlaneModel->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix,
    light, material, camera,m_TexManager->createTex(m_D3D->GetDevice(),string("grass.dds")));
if(!result)
    {
    return false;
    }

//执行平移操作,得到最终的模型世界矩阵
D3DXMatrixRotationX(&worldMatrix1, -1.57); //pai/2
D3DXMatrixTranslation(&worldMatrix2, 0.0, 0.0, 8.0);
D3DXMatrixMultiply(&worldMatrix3, &worldMatrix1, &worldMatrix2);
result = m_LightTexShader->Render(m_D3D->GetDeviceContext(), m_PlaneModel->GetIndexCount(), worldMatrix3, viewMatrix, projectionMatrix,
    light, material, camera,m_TexManager->createTex(m_D3D->GetDevice(),string("stone01.dds")));
if(!result)
    {
    return false;
    }

程序执行后界面如下,因为两个平面使用的是同一个model,漫反射系数一样,所以正面的墙也有绿色。

   在myTutorialD3D11_34中,我们改变ps代码,直接使用纹理做为Kd,这样效果就好很多。

  

完整的代码请参考:

工程文件myTutorialD3D11_33

工程文件myTutorialD3D11_34

代码下载:

http://files.cnblogs.com/mikewolf2002/d3d1127-28.zip

http://files.cnblogs.com/mikewolf2002/pictures.zip

Directx11教程39 纹理映射(9)的更多相关文章

  1. Directx11教程(43) 纹理映射(13)-动态纹理映射

    原文:Directx11教程(43) 纹理映射(13)-动态纹理映射      本篇教程中,我们将在前面基于光照的地形与水面程序里面加上纹理映射,而且我们会基于时间动态改变水面的纹理坐标,实现水面纹理 ...

  2. Directx11教程(42) 纹理映射(12)-简单的bump mapping

    原文:Directx11教程(42) 纹理映射(12)-简单的bump mapping        有时候,我们只有一个粗糙的模型,但是我们想渲染纹理细节,比如一个砖墙,我们如何在只有一个平面的时候 ...

  3. Directx11教程41 纹理映射(11)

    原文:Directx11教程41 纹理映射(11)     1.第一副图我们采用各性异性的滤波方式,并设置最大各性异性值为8.     samplerDesc.Filter =  D3D11_FILT ...

  4. Directx11教程40 纹理映射(10)

    原文:Directx11教程40 纹理映射(10)      本章尝试使用纹理行列式,或者说纹理数组,在ps中,使用2个纹理,最终的像素颜色,是光照颜色*纹理1采样颜色*纹理2采样颜色,主要是想达到如 ...

  5. Directx11教程38 纹理映射(8)

    原文:Directx11教程38 纹理映射(8)      上篇日志中,我们用纹理和光照颜色调制的方式得到最终颜色,本章我们尝试用纹理采样的颜色,直接做为材质的漫反射系数Kd,并用它来做光照计算,最后 ...

  6. Directx11教程37 纹理映射(7)

    原文:Directx11教程37 纹理映射(7)     本章是在教程35.36的基础上来实现一个光照纹理结合的程序,就是把场景中旋转的cube加上纹理.    lighttex.vs中顶点的结构现在 ...

  7. Directx11教程36 纹理映射(6)

    原文:Directx11教程36 纹理映射(6)    本章主要是整理代码,做以下两件事情: 1.把世界坐标矩阵的计算,放在GraphicsClass的渲染函数中,之前放在D3DClass中,而且只是 ...

  8. Directx11教程(35) 纹理映射(5)

    原文:Directx11教程(35) 纹理映射(5)     到现在为止,我们的TextureClass初始化函数非常简单,说白了就是一行代码: result = D3DX11CreateShader ...

  9. Directx11教程(34) 纹理映射(4)

    原文:Directx11教程(34) 纹理映射(4)     本篇教程中,我们尝试在myTutorialD3D_27中改变采样状态描述符的各种设置,看纹理贴图的方式有什么变化. 原始的代码是:     ...

随机推荐

  1. php连接数据库插入数据

    <form action="updata.php" method="post"> 姓名:<input type="text" ...

  2. JS的同步和异步加载

    引言 JS的“加载”不能理解为下载,它是分为两个部分:下载,执行.默认的JS加载是同步的,因为浏览器需要一个稳定的DOM结构,而执行JS时可能会对DOM造成改变,所以在执行JS时一定会阻塞HTML的渲 ...

  3. CSS样式汇总(转载)

    1.字体属性:(font) 大小 {font-size: x-large;}(特大) xx-small;(极小) 一般中文用不到,只要用数值就可以,单位:PX.PD 样式 {font-style: o ...

  4. 观察者模式(Observer、Subject、ConcreteSubject、ConcreteObserver)(监护、订阅)

    建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应的作出反应. 在此发生改变的对象称之为观察目标(被观察者),而被通知的对象称为观察者,一个观察者目标可以对应多个观 ...

  5. ConnectionString连接字符串-密码丢失的解决方法

    今天遇到一个问题,EF,asp.net  web端登录成功,退出,再登录就异常了, 登出成功时, EF 中 dbcontext.Database.Connection.ConnectionString ...

  6. T2483 电梯(模拟题)

    https://www.luogu.org/problem/show?pid=T2483 题目背景 开启了升降梯的动力之后,探险队员们进入了升降梯运行的那条竖直的隧道,映入眼帘的是一条直通塔顶的轨道. ...

  7. nslookup获取域名对应的的ip地址

    1.先用nslookup获得域名对应的主机ip:nslookup 域名 2.再根据主机ip获得对应的主机名称: host ip $ nslookup baidu.com Server: 127.0.1 ...

  8. Django项目:CRM(客户关系管理系统)--44--36PerfectCRM实现King_admin密码修改

    # king_urls.py # ————————02PerfectCRM创建ADMIN页面———————— from django.conf.urls import url from king_ad ...

  9. vmware三种网络模式配置(转载)

    虚拟机系统安装的是Linux系统 首先,在本机上查看所有网络配置连接,使用命令:ipconfig Microsoft Windows [版本 6.1.7600]版权所有 (c) 2009 Micros ...

  10. COOK50小结

    题目链接 很遗憾.看到第五题的通过人数就不敢做了.待日后补上. A题 求最长的连续子序列,使得他们满足gcd为1. 如果有相邻的两个数的gcd为1,那么整个序列的gcd值也就是1, 否则就是该序列不存 ...