参考教程
Tutorial 17: Multitexturing and Texture Arrays
学习记录
这一篇相比之前的花了两天来写的视锥裁剪就显得简单的多了。我们在很久之前就学会了使用纹理,但每次都是单一的为一个模型贴上一张。而这篇文章中我们将对之前的代码修改以两张纹理贴图一个立方体。
首先我们创建我们的纹理文件名数组:
1 | const char * cubeTexs[] = { |
之后更改我们的 ID3D11ShaderResourceView
为数组:
1 | ID3D11ShaderResourceView *pCubeShaderResourceView[nNumCubeTex]; |
接下来更改 InitShader
方法,将其改为支持多重纹理(其实也就是改成循环创建):
1 | inline HRESULT InitShader( |
最后,修改 DrawModelIndex
方法:
1 | inline HRESULT DrawModelIndex( |
之前我们使用 (*pImmediateContext)->PSSetShaderResources(0, nNumTex, pShaderResourceView);
设置纹理资源,方法的第二个参数就是纹理个数,我们一直设置的 1 ,现在将其改为传进来的纹理个数参数就可以了。
最后来修改着色器,顶点着色器完全不用动,因为我们要用两张纹理贴图立方体模型,所以修改它的像素着色器就可以了。
1 | Texture2D tex[2]; |
在着色器里,我们更改 tex 为数组变量,然后采样两张纹理并简单的平均混合。
最后我们去从网上再下载一张照片:
加上我们之前的:
将他们分别改名为 texture2.jpg
和 texture1.jpg
。就可以渲染了,效果如下:
实际上,直接的进行平均后的混合并不是一个很好的办法,在后边我们会提到。也可以去网上了解一下 伽马校正(Gamma Correction)。