Directx11教程37 纹理映射(7)

简介: 本章是在教程35、36的基础上来实现一个光照纹理结合的程序,就是把场景中旋转的cube加上纹理。    lighttex.vs中顶点的结构现在为: struct VertexInputType {     float4 position : POSITION; ...

    本章是在教程35、36的基础上来实现一个光照纹理结合的程序,就是把场景中旋转的cube加上纹理。

   lighttex.vs中顶点的结构现在为:

struct VertexInputType
{
    float4 position : POSITION;
    float3 normal : NORMAL;
    float2 tex : TEXCOORD0; //纹理坐标
    float4 Kd : DIFFUSE;
    float4 Ks: SPECULAR;
};

//纹理坐标
output.tex = input.tex
;

纹理坐标不做任何变化,只是单纯的从vs输出到ps中。

lighttex.ps中,现在多了2个变量:

Texture2D shaderTexture;
SamplerState SampleType;

分别表示纹理和纹理采样状态。

    纹理的颜色可以用hlsl函数float4 textureColor = shaderTexture.Sample(SampleType, input.tex);计算得到,最后我们把光照计算得到颜色和纹理采样的颜色用模式调制的方式(就是相乘)调和在一起,得到最终颜色。 finalcolor = finalcolor * textureColor;

  

    现在对CubeModelClass类做一些变化:

struct VertexType
    {
    D3DXVECTOR3 position;
    D3DXVECTOR3 normal; //法向
    D3DXVECTOR2 texture;//纹理坐标
    D3DXVECTOR4 Kd;  //材质漫反射系数
    D3DXVECTOR4 Ks;  //材质的高光系数
    };

    定义一个私有成员变量TextureClass* m_Texture;用它来读取纹理,产生需要的纹理资源视图数据。在初始化函数中,我们装入纹理数据:

bool CubeModelClass::Initialize(ID3D11Device* device, char* modelFilename,WCHAR* textureFilename)
    {
    bool result;

    // 装入模型数据,
    result = LoadModel(modelFilename);
    if(!result)
        {
        return false;
        }

    // 装入纹理数据.
    result = LoadTexture(device, textureFilename);
    if(!result)
        {
        return false;
        }


    // 初始化顶点缓冲和顶点索引缓冲.
    result = InitializeBuffers(device);
    if(!result)
        {
        return false;
        }

    return true;
    }

    接下来,我们就是新写一个LightTexShaderClass,用来处理纹理光照混合的shader处理,这个类和LightShaderClass的区别是多了一个采样状态的变量。

//采样状态
ID3D11SamplerState* m_sampleState
;

这个状态设置后,会被传入ps中

//设置采样状态
deviceContext->PSSetSamplers(0, 1, &m_sampleState);

程序运行后界面如下:

image

完整的代码请参考:

工程文件myTutorialD3D11_30

代码下载:

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

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

 

相关文章
|
数据建模
Directx11教程(43) 纹理映射(13)-动态纹理映射
本篇教程中,我们将在前面基于光照的地形与水面程序里面加上纹理映射,而且我们会基于时间动态改变水面的纹理坐标,实现水面纹理波动的效果。       地形(山谷)以及水面都是基于网格的平面。
973 0
|
索引
Directx11教程36 纹理映射(6)
本章主要是整理代码,做以下两件事情: 1、把世界坐标矩阵的计算,放在GraphicsClass的渲染函数中,之前放在D3DClass中,而且只是返回一个单位矩阵,没任何作用。如果要使其起作用,就要对每个model类都单独设置,很麻烦,比如我要画两个颜色立方体,岂不是要建立两个model类,而只是世界坐标矩阵不同。
840 0
Directx11教程(32) 纹理映射(2)
在写代码之前,我们先制作一个dds文件。从网上找到了一张照片,处理成为512*512,保存为jpg格式。     启动微软的directx texture tool后,把图片拖到其内:      选择文件Format->Generate Mip Maps,可以在图像的标题栏看到Mip 1 of 10的字样,这是因为我们原始图像大小为512*512,生成MipMaps时,会产生256*256, 128*128,…, 1*1,一系列下采样的图像,加上原始图像总共10个。
864 0
Directx11教程41 纹理映射(11)
1、第一副图我们采用各性异性的滤波方式,并设置最大各性异性值为8.     samplerDesc.Filter =  D3D11_FILTER_ANISOTROPIC;     samplerDesc.MaxAnisotropy = 8;      第二副图我们用了常用的3线性差值滤波方式   samplerDesc.Filter =  D3D11_FILTER_MIN_MAG_MIP_LINEAR;         按道理说,对于远处的纹理贴图,第一副图要好些,但我看起来,似乎这两个效果差不多,第二副效果也还可以,对于远处的贴图,我并没有发现模糊的效果。
940 0
Directx11教程38 纹理映射(8)
上篇日志中,我们用纹理和光照颜色调制的方式得到最终颜色,本章我们尝试用纹理采样的颜色,直接做为材质的漫反射系数Kd,并用它来做光照计算,最后再做个gamma校正,如果不做的话,效果会偏亮。      lighttex.
846 0
Directx11教程(35) 纹理映射(5)
到现在为止,我们的TextureClass初始化函数非常简单,说白了就是一行代码: result = D3DX11CreateShaderResourceViewFromFile(device, filename, NULL, NULL, &m_texture, NULL);       这行代码装入一个dds文件,而且其它选项都设置为NULL,这时系统会使用装入文件本身的格式,比如我们装入的tong.dds, 前面我们为其产生了mipmaps层,并且设置surface格式为DXT5(对应于D3D11中BC3压缩格式)。
906 0
Directx11教程(34) 纹理映射(4)
本篇教程中,我们尝试在myTutorialD3D_27中改变采样状态描述符的各种设置,看纹理贴图的方式有什么变化。 原始的代码是:     // 创建纹理采样描述符 samplerDesc.
895 0
|
存储 索引
Directx11教程39 纹理映射(9)
在myTutorialD3D11_32中,我们在PlaneModelClass中增加一个纹理TextureClass* m_Texture;读入一个grass的纹理,程序执行后的效果如下: 完整的代码请参考: 工程文件myTutorialD3D11_32 代码下载: http://files.
927 0
|
图形学
Directx11教程40 纹理映射(10)
本章尝试使用纹理行列式,或者说纹理数组,在ps中,使用2个纹理,最终的像素颜色,是光照颜色*纹理1采样颜色*纹理2采样颜色,主要是想达到如下的效果:    把这两个图像以及光照产生的颜色融合生成以下图像:   为此我们新建一个lighttex2.
1062 0
Directx11教程(31) 纹理映射(1)
在前面的例子中,我们要么是直接给顶点赋颜色值,要么是在顶点属性中设置Diffuse和Specular系数,从而根据光照参数计算得到物体表面颜色,但这样得到的颜色真实感要差很多。如果我们直接把一副图像映射到三角形面上,从而得到物体表面颜色值,效果会好很多,比如下面的两幅图,右边的图是把一副图片映射到2个三角形上。
967 0