上に伸びる光の柱っぽいエフェクト
https://gyazo.com/019bfb144d059b4e6808e8635eac38db
説明
光の柱がのぼるようなエフェクトです。
Textureには、デフォルトで入っているexample/particle.pngを使用しています。
コード
code:Main.cpp
# include <Siv3D.hpp> // Siv3D v0.6.11
class LightBloom {
public:
const RenderTexture gaussianA1, gaussianB1;
const RenderTexture gaussianA4, gaussianB4;
const RenderTexture gaussianA8, gaussianB8;
const Size area;
const ColorF colorA1, colorA4, colorA8;
LightBloom(const Size& size, const ColorF& colorA1 = ColorF(0.1), const ColorF& colorA4 = ColorF(0.4), const ColorF& colorA8 = ColorF(0.8))
:area{ size },
gaussianA1{ size }, gaussianB1{ size },
gaussianA4{ size / 4 }, gaussianB4{ size / 4 },
gaussianA8{ size / 8 }, gaussianB8{ size / 8 },
colorA1{ colorA1 },
colorA4{ colorA4 },
colorA8{ colorA8 } {}
void draw() const
{
Shader::GaussianBlur(gaussianA1, gaussianB1, gaussianA1);
Shader::Downsample(gaussianA1, gaussianA4);
Shader::GaussianBlur(gaussianA4, gaussianB4, gaussianA4);
Shader::Downsample(gaussianA4, gaussianA8);
Shader::GaussianBlur(gaussianA8, gaussianB8, gaussianA8);
const ScopedRenderStates2D blend{ BlendState::Additive };
gaussianA1.resized(area).draw(colorA1);
gaussianA4.resized(area).draw(colorA4);
gaussianA8.resized(area).draw(colorA8);
}
};
struct EXEffect : IEffect
{
// 軌跡用のテクスチャ
const Texture m_texture{ U"example/particle.png", TextureDesc::Mipped };
// 点の基本寿命(秒)
const double LifeTime = 0.25;
// 軌跡
Array<TrailMotion> trails;
// 軌跡の初期座標
Vec2 m_pos;
// ずらす
Array<Vec2> offset;
// ライトブルーム
LightBloom light{ Scene::Size(), ColorF(0.8) };
EXEffect(const Vec2& pos)
:m_pos{ pos }
{
for (auto i : step(20))
{
offset << RandomVec2(50);
trails << TrailMotion{}
.setPositionFunction(this, i(double t) { return m_pos + offseti - Vec2{ 0, Scene::Height() * 10 * Max(t - i * 0.015, 0.0) } + Vec2{ 0, 100 }; }) .setSizeFunction(i(double t) { return 40 * Sin(Max(t - i * 0.015, 0.0) * Math::Pi); }) .setColor(Palette::Gold);
}
}
bool update(double t) override
{
// 通常のTrail描画
{
for (auto& trail : trails)
{
trail.update();
trail.draw(m_texture);
}
}
// ライトブルーム描画
{
const ScopedRenderTarget2D target{ light.gaussianA1.clear(ColorF{ 0.0 }) };
const ScopedRenderStates2D blend{ BlendState::Additive };
for (auto& trail : trails)
{
trail.draw(m_texture);
}
}
light.draw();
return t < 1.0;
}
};
void Main()
{
Effect effect;
while (System::Update())
{
if (MouseL.down())
{
effect.add<EXEffect>(Cursor::Pos());
}
effect.update();
}
}
作者
たのれん