【DirectX】23-使用贴图实现特殊效果

参考教程

Tutorial 18: Light Maps

Tutorial 19: Alpha Mapping

学习记录

  这篇文章主要会介绍使用多重贴图来实现的一些有趣的效果,包括使用光照纹理和透明纹理。

  第一个需要介绍的是 Light Maps ,它使得我们可以在某些情况下使用及其少的资源实现光照效果。其实介绍起来也很简单,就是使用一张渐变的黑白纹理来和我们的基础纹理混合,达到类似于光照的效果,渐变纹理如下:

1

  我们使用它来取代上一篇中完全不搭的那张纹理,同时修改像素着色器。

1
2
3
4
5
6
7
8
9
10
11
Texture2D tex[2];
SamplerState samp;

struct pixelInputType {
float4 pos : SV_POSITION;
float2 texcoord : TEXCOORD0;
};

float4 main(pixelInputType input) : SV_TARGET{
return tex[0].Sample(samp, input.texcoord) * (tex[1].Sample(samp, input.texcoord) + 0.1f);
}

  简单的对其相乘,可以达到光照的效果,如下:

2

  第二个要介绍的是 Alpha Mapping。这个则是使用一张透明贴图,来对另外两张图片进行混合。首先列出我们的贴图:

3

4

5

  分别将他们命名为 texture3.gif , texture4.gif , texture5.gif ,同时扩充我们的纹理数组:

1
2
3
4
5
6
7
8
const char * cubeTexs[] = {
"texture1.jpg",
"texture2.gif",
"texture3.gif",
"texture4.gif",
"texture5.gif"
};
const int nNumCubeTex = 5;

  最后,修改像素着色器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Texture2D tex[5];
SamplerState samp;

struct pixelInputType {
float4 pos : SV_POSITION;
float2 texcoord : TEXCOORD0;
};


float4 main(pixelInputType input) : SV_TARGET{
//return tex[0].Sample(samp, input.texcoord) * (tex[1].Sample(samp, input.texcoord) + 0.1f);

float4 alpha = tex[2].Sample(samp, input.texcoord);
return tex[3].Sample(samp, input.texcoord) * alpha + tex[4].Sample(samp, input.texcoord) * (1-alpha);
}

  效果如下:

6

  源代码:DX11Tutorial-TextureMaps

0%