OpenSiv3D icon indicating copy to clipboard operation
OpenSiv3D copied to clipboard

シーンへの描画のマルチサンプリングの設定

Open ghost opened this issue 2 years ago • 2 comments

ドット絵のゲームや、アプリケーションに特化するのに「シーンへの描画の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)) {}

ghost avatar May 01 '22 14:05 ghost

毎フレーム、シーンのサイズが変わるのでない限り、RenderTexture を使う方法が、Siv3D で想定されている方法です。 Main.cpp の SIV3D_SET によるエンジンオプション経由での MSAA 無効化は検討していますが、直近での対応予定はありません。

  • シーンリサイズの N 秒後に反映する
  • シーンより大きめの RenderTexture も許容する image

などの工夫で、RenderTexture 再生成の頻度は減らせると思います。

Reputeless avatar May 03 '22 05:05 Reputeless

ありがとうございます!

ghost avatar May 03 '22 08:05 ghost