OpenSiv3D
OpenSiv3D copied to clipboard
シーンへの描画のマルチサンプリングの設定
ドット絵のゲームや、アプリケーションに特化するのに「シーンへの描画のAAを無効にする」機能があったらいいなと思いましたので、Isuueさせて頂きました。
どっちにしても、「.paint()
などのAntialiased
」「MSRenderTexture
」など、一部被る機能があり、
描画周りに関する事なので、3Dが安定的に実装できてきてから一緒に出来るようにして頂けたらありがたいです。
現状のMSを無効にする方法
座標系、サイズなどを区切りの良い値にする
矩形なら(整数・XX.0
)に、線分なら(XX.5
)にすればきれいに描画出来るのですが、
円や微妙に斜めの線分などはマルチサンプリングされて描画されてしまいます。
RenderTextureを使用する
RenderTexture
なら上の項の事は解決できるのですが、すこし不便な点があります。
- RenderTextureのサイズをシーンのリサイズに合わせるとき、非効率になってしまう。
→
RenderTexture
は自身をresize
出来ない(テクスチャのリサイズは現実的ではない) - やりたいことにしては少し冗長になる。
RenderTexture rtex(256, 144);
while (System::Update())
{
{
const ScopedRenderTarget rtarg{ rtex.clear(Scene::GetBackground()) };
/// 描画
}
rtex.draw();
}
while (System::Update())
{
if (Scene::Size() != rtex.size()) // シーンのサイズが変わる可能性があって、それにRenderTextureのサイズをあわせたいとき
rtex = RenderTexture{ Scene::Size() };
...
}
理想
// #1 シーンへの描画のマルチサンプリングの有効/無効
Scene::SetMS(false);
// #2 ゲーム特化に向けて(OpenSiv3Dは3Dを実装中なので後回しでも)
Graphics2D::Internal::SetAntiAliasing(AntiAliasing::MSAA4x);
Graphics2D::Internal::SetAntiAliasing(AntiAliasing::SMAA | AntiAliasing::MSAA4x);
Graphics2D::Internal::SetAntiAliasing(AntiAliasing::Disabled);
ScopedAntiAliasing2D aa(AntiAliasing::MSAA4x);
const auto aas = Graphics::EnumrateAntiAliasing();
if (Graphics::IsUsableAntiAliasing(AntiAliasing::MSAA4x)) {}
毎フレーム、シーンのサイズが変わるのでない限り、RenderTexture
を使う方法が、Siv3D で想定されている方法です。
Main.cpp の SIV3D_SET
によるエンジンオプション経由での MSAA 無効化は検討していますが、直近での対応予定はありません。
- シーンリサイズの N 秒後に反映する
- シーンより大きめの
RenderTexture
も許容する
などの工夫で、RenderTexture
再生成の頻度は減らせると思います。
ありがとうございます!