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

    本篇教程中,我们尝试在myTutorialD3D_27中改变采样状态描述符的各种设置,看纹理贴图的方式有什么变化。

原始的代码是:

   

// 创建纹理采样描述符
samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
samplerDesc.MipLODBias = 0.0f;
samplerDesc.MaxAnisotropy = 1;
samplerDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
samplerDesc.BorderColor[0] = 0;
samplerDesc.BorderColor[1] = 0;
samplerDesc.BorderColor[2] = 0;
samplerDesc.BorderColor[3] = 0;
samplerDesc.MinLOD = 0;
samplerDesc.MaxLOD = D3D11_FLOAT32_MAX;

// 创建纹理采样状态.
result = device->CreateSamplerState(&samplerDesc, &m_sampleState);

1、首先我们尝试改变u,v的寻址模式(因为我们现在用的是二维纹理,w暂时忽略),

    改为D3D11_TEXURE_ADDRESS_CLAMP,能够看到在x,y方向,纹理坐标不在[0,1]范围内的像素点会采用离它最近的纹理单元颜色。

    改为D3D11_TEXTURE_ADDRESS_BORDER,可以看到纹理坐标不在[0,1]的像素点都是黑色,这是因为我们设置了border的颜色为黑色,[0]…[3]表示border颜色的RGBA值,A的值好像没什么作用,随便改对结果没有影响。

samplerDesc.BorderColor[0] = 0;
samplerDesc.BorderColor[1] = 0;
samplerDesc.BorderColor[2] = 0;
samplerDesc.BorderColor[3] = 0
  

 

改为D3D11_TEXTURE_ADDRESS_MIRROR,则会有镜面的效果:

D3D11_TEXTURE_ADDRESS_MIRROR_ONCE,则会是下面的效果。对负的u,v坐标取绝对值,所以左,上是镜像的效果,对超过[0,1]范围的正的坐标,使用clamp方式。

下面我们看看不同的滤波设置会对最终图像有什么影响:

     缺省我们设置的是samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR,这也是应用程序中最常采用的方式。

    首先我们用D3D11_FILTER_MIN_MAG_MIP_POINT,这时没有用插值方式得到像素颜色,而是取纹理上最近似的纹理单元颜色做为像素颜色。在图像大小差不多的时候,明显可以看出效果要比线性方法差很多。

还可以分别对magnification,minification,mipmaps采用线性或者point方式,就不一一贴图了。

     这儿要提的是D3D11_FILTER_ANISOTROPIC,这种各向异性的滤波方式主要是对于三维空间的立体贴图有效果,防止贴图畸变,在myTutorialD3D_27中,我们的摄像机在正前方,使用正交投影,没有立体的效果,所以在后面的教程中,我们再尝试各向异性滤波的效果。

   其它的一些参数,平时用的不多,暂不讨论。

时间: 2024-09-20 14:31:51

Directx11教程(34) 纹理映射(4)的相关文章

Directx11教程(31) 纹理映射(1)

        在前面的例子中,我们要么是直接给顶点赋颜色值,要么是在顶点属性中设置Diffuse和Specular系数,从而根据光照参数计算得到物体表面颜色,但这样得到的颜色真实感要差很多.如果我们直接把一副图像映射到三角形面上,从而得到物体表面颜色值,效果会好很多,比如下面的两幅图,右边的图是把一副图片映射到2个三角形上.         甚至,我们还可以直接使用图像的颜色值做为顶点(或者pixel)的diffuse值,融合光照计算公式,得到最终的表面颜色值,这样会有更好的效果.     

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

     本篇教程中,我们将在前面基于光照的地形与水面程序里面加上纹理映射,而且我们会基于时间动态改变水面的纹理坐标,实现水面纹理波动的效果.       地形(山谷)以及水面都是基于网格的平面.       对于地形,修改顶点类型为: struct VertexType     {     D3DXVECTOR3 position;     D3DXVECTOR3 normal;     D3DXVECTOR2 texture; //纹理坐标     D3DXVECTOR4 Kd; //材质的

Directx11教程37 纹理映射(7)

    本章是在教程35.36的基础上来实现一个光照纹理结合的程序,就是把场景中旋转的cube加上纹理.    lighttex.vs中顶点的结构现在为: struct VertexInputType {     float4 position : POSITION;     float3 normal : NORMAL;     float2 tex : TEXCOORD0; //纹理坐标     float4 Kd : DIFFUSE;     float4 Ks: SPECULAR; };

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

    到现在为止,我们的TextureClass初始化函数非常简单,说白了就是一行代码: result = D3DX11CreateShaderResourceViewFromFile(device, filename, NULL, NULL, &m_texture, NULL);       这行代码装入一个dds文件,而且其它选项都设置为NULL,这时系统会使用装入文件本身的格式,比如我们装入的tong.dds, 前面我们为其产生了mipmaps层,并且设置surface格式为DXT5(对

Directx11教程40 纹理映射(10)

     本章尝试使用纹理行列式,或者说纹理数组,在ps中,使用2个纹理,最终的像素颜色,是光照颜色*纹理1采样颜色*纹理2采样颜色,主要是想达到如下的效果:    把这两个图像以及光照产生的颜色融合生成以下图像:   为此我们新建一个lighttex2.ps文件,在其中定义: //两个纹理,可用于纹理混合,bump mapping等等 Texture2D shaderTexture[2]; SamplerState SampleType; - float4 textureColor1 = sh

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

       有时候,我们只有一个粗糙的模型,但是我们想渲染纹理细节,比如一个砖墙,我们如何在只有一个平面的时候,渲染出砖墙凹凸的效果.    比如只有这样的墙:   但是我们想要这样的效果: 怎么办呢?这时候,我们可以考虑对第一张图进行处理,生成它的法向图,存储在一张纹理中,生成法向图的主要算法是:         对于一张图片,假设像素排列如上图所示,Hg,Hr,Ha分别表示这些点的RGB(或灰度)值,我们得到第一个向量(1,0,Hr-Hg),第二个向量(0,1,Ha-Hg),则法向可以通过

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个.    我们可以用上下

Directx11教程36 纹理映射(6)

   本章主要是整理代码,做以下两件事情: 1.把世界坐标矩阵的计算,放在GraphicsClass的渲染函数中,之前放在D3DClass中,而且只是返回一个单位矩阵,没任何作用.如果要使其起作用,就要对每个model类都单独设置,很麻烦,比如我要画两个颜色立方体,岂不是要建立两个model类,而只是世界坐标矩阵不同.     放在Render函数中后,我们主要通过一些D3D的矩阵变化函数来计算世界坐标系.比如:     //执行平移操作,得到最终的模型世界矩阵     D3DXMatrixTr

Directx11教程38 纹理映射(8)

     上篇日志中,我们用纹理和光照颜色调制的方式得到最终颜色,本章我们尝试用纹理采样的颜色,直接做为材质的漫反射系数Kd,并用它来做光照计算,最后再做个gamma校正,如果不做的话,效果会偏亮.      lighttex.ps主要改动代码: float4 textureColor = shaderTexture.Sample(SampleType, input.tex); float4 Kd = textureColor; - finalcolor = saturate(finalcolo