参考教程
学习记录
这一篇文章中,我们主要介绍在 dx11 中实现平面反射。与之前不同,这篇文章和之后的源代码我们将使用已有框架来进行实验(事实上是因为代码逐渐变多之后看的好乱),相信在之前基础知识完成学习后对于这个框架已经没有多少入手难度了。源码将在文末下载。
创建反射我们首先会将要渲染的物体的反射图案渲染到纹理上,然后用纹理与镜面混合,最终达到反射效果。将 cube 的反射图案渲染至纹理如下:
1 | bool GraphicsClass::RenderToTexture() |
与普通的渲染至纹理不同,这次我们采用了 reflectionViewMatrix = m_Camera->GetReflectionViewMatrix();
来代替普通的 view 矩阵,ReflectionViewMatrix
定义如下:
1 | void CameraClass::RenderReflection(float height) |
可以看到,我们使用一个高度作为参数来设置一个对于 x , z 平面的 Reflection 矩阵。在设置中也是简单的对 y 轴做以修改。
之后,我们使用类 ReflectionShaderClass
来渲染反射纹理:
1 | //////////////////////////////////////////////////////////////////////////////// |
这个和我们直接的 shader 类差不多,除了多出了一个新的矩阵变量,这个变量我们将传入着色器来为我们渲染正确的目标。
在我们的顶点着色器里,我们在它对于像素着色器的输出结构体里新增了一个属性,它用来保存纹理的输入的位置:
1 | struct PixelInputType |
同时,使用反射矩阵来设置新增的变量:
1 | // Create the reflection projection world matrix. |
像素着色器中,我们将反射位置映射到 0 - 1 之间作为纹理坐标使用,然后读取我们之前渲染的纹理,最后于平面纹理进行混合:
1 | //////////////////////////////////////////////////////////////////////////////// |
最终效果如下:
(这篇文章开始使用近似于框架的方式来组织代码,可能显得比较突兀,稍后会专门再介绍一下这个框架的构造)