参考教程
学习记录
这一篇文章中我们将基于之前的代码内容来实现场景中创建淡入淡出的效果。框架应当如下:
新加的 BitmapClass
, FadeShaderClass
两个类我们将在下边详细介绍。
淡入淡出的代码说起来很简单,我们先将需要渲染的内容渲染至纹理,然后根据在短时间内增加或者减少颜色以达到淡入淡出效果。首先我们需要渲染一张至屏幕的纹理,那么就需要一张屏幕贴图,这个由我们的 bitmapclass
类来做。这个类可以创建两个三角形覆盖屏幕并且贴图,也可以只是创建两个三角形覆盖屏幕,使用此缓冲区和 RenderTextureClass
所生成的纹理来渲染。
BitmapClass
类的声明如下:
1 |
|
这个类将根据给定的 w 和 h 生成一张覆盖屏幕的位图,在声明中我们有读取纹理和释放纹理的操作,不过在这篇文章中并未使用。
FadeShaderClass
则是由 TextureShaderClass
修改而来,它多了一个 FadeAmount
属性来控制纹理显示颜色。它的声明如下:
1 | class FadeShaderClass |
可以看到我们的多了一个 FadeBufferType
类型,这个类型只有一个 float
变量(另外那个是用来对齐的)。实现也是比较简单,在 InitializeShader
方法里,我们初始化了 fadeBuffer
:
1 | ........ |
这两个类实现后我们就可以简单的来实现这个效果了。为了节省资源,我们在渲染的时候首先会判断当前淡入的动画是否完毕,如果没有完毕。我们会先将内容渲染至纹理,这个交以 FadeShaderClass
来处理。然后在将纹理贴图到屏幕位图中,如果已经完毕,则直接渲染至后台缓冲。
GraphicsClass
更新后的定义如下:
1 | //////////////////////////////////////////////////////////////////////////////// |
我们增加了几个成员变量,用来控制淡入淡出的动画效果。m_fadeDone
判断动画效果是否结束,m_fadeInTime
则是动画效果的总时间,m_accumulatedTime
则是已累积时间,m_fadePercentage
代表我们将会渲染的颜色亮度的百分比。当累积时间超过总时间的时候,动画结束。
在初始化方法里初始化这几个值:
1 | m_fadeInTime = 3000.0f; |
Frame
方法里,我们每帧更新累积值以及淡入百分比,直到动画结束。
1 | bool GraphicsClass::Frame(float frameTime) |
最后,在 Render
方法里,我们根据当前是否在动画状态选择不一样的渲染方式:
1 | bool GraphicsClass::Render() |
RenderToTexture
与 RenderFadingScene
方法定义如下:
1 | bool GraphicsClass::RenderToTexture(float rotation) |
RenderNormalScene
则是直接渲染至后台缓冲。
我们的着色器代码也是比较简单,顶点着色器和普通一样,而像素着色器则是新增了一个缓冲:
1 | cbuffer FadeBuffer |
我们将纹理采样的值与 fadeAmount
相乘则是最终的颜色了。
1 | float4 FadePixelShader(PixelInputType input) : SV_TARGET |
最终效果则是一个淡淡变量的立方体。我随便截了一张淡入过程中的图,如下: