シーンマネージャーにフォグ
ヴート 2023/04/07(Fri) 21:27
シーンマネージャーにフォグのサンプルプログラムを入れてみた所、起動時にフォグが遅れて描画されました。
原因に検討がつきません。知見のある方はご教授よろしくお願いします。
class Title : public App::Scene
{
public:
struct PSFog
{
Float3 fogColor;
float fogCoefficient;
};
const PixelShader ps = HLSL{ U"example/shader/hlsl/forward_fog.hlsl", U"PS" }
| GLSL{ U"example/shader/glsl/forward_fog.frag", {{ U"PSPerFrame", 0 }, { U"PSPerView", 1 }, { U"PSPerMaterial", 3 }, { U"PSFog", 4 }} };
Vec3 ep{0,10,-100};
Vec3 fp{0,0,0};
Size sz{Scene::Size()};
double rad{60};
BasicCamera3D C{sz,toRadians(rad),ep,fp};
const MSRenderTexture renderTexture{ sz, TextureFormat::R8G8B8A8_Unorm_SRGB, HasDepth::Yes };
ColorF bgc{Palette::Black.removeSRGBCurve()};
double fogParam = 0.6;
ConstantBuffer<PSFog> cb{ { bgc.rgb(), 0.0f } };
Plane pln{Vec3(0,0,0),Size(100,100)};
Title(const InitData& init): IScene{ init }
{
}
void update() override
{
if (! ps)return;
C.setProjection(sz,toRadians(rad));
C.setView(ep,fp);
const double fogCoefficient = Math::Eerp(0.001, 0.25, fogParam);
cb->fogCoefficient = static_cast<float>(fogCoefficient);
}
void draw() const override
{
Graphics3D::SetCameraTransform(C);
Graphics3D::SetPSConstantBuffer(4, cb);
const ScopedCustomShader3D shader{ ps };
const ScopedRenderTarget3D target{ renderTexture.clear(bgc) };
pln.draw(Palette::White.removeSRGBCurve());
Graphics3D::Flush();
renderTexture.resolve();
Shader::LinearToScreen(renderTexture);
}
};
Reputeless 2023/04/09(Sun) 16:44
シーンの切り替え時、update() はフェードインが完全に完了してから呼ばれ始めます。
フェードイン中は update() は実行されていません。
したがってフォグのための定数バッファが設定されていない状態でフォグシェーダを使っています。
updateFadeIn() や updateFadeOut(), あるいはコンストラクタでの定数バッファの設定を検討してください。
https://zenn.dev/reputeless/books/siv3d-documentation/viewer/tutorial-scene-manager#31.6-%E3%83%95%E3%82%A7%E3%83%BC%E3%83%89%E3%82%A4%E3%83%B3%E3%83%BB%E3%83%95%E3%82%A7%E3%83%BC%E3%83%89%E3%82%A2%E3%82%A6%E3%83%88%E3%82%92%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA%E3%81%99%E3%82%8B