<NME> Main.cpp
<BEF> # include <Siv3D.hpp> // OpenSiv3D v0.4.1

void Main()
{
	Window::Resize(960, 600);
	
	Scene::SetBackground(ColorF(0.8, 0.9, 1.0));
	const Texture emoji(Emoji::CreateSilhouetteImage(U"🍎"));
	const Texture windmill(U"example/windmill.png");
	const PixelShader ps(U"example/shader/multiple_texture.frag",
						 {{ U"PSConstants2D", 1 }});
	RenderTexture renderTexture(480, 320);

	while (System::Update())
	{
		renderTexture.clear(ColorF(1.0, 0.0));
		{
			BlendState blend;
			blend.srcAlpha = Blend::One;
			ScopedRenderStates2D states(blend);
			ScopedRenderTarget2D target(renderTexture);
			emoji.scaled(2).rotated(Scene::Time() * 60_deg).drawAt(renderTexture.size() / 2);
		}
		
		Rect(0, 140, 480, 320).draw(Palette::Black).movedBy(480, 0).draw(Palette::White);
		renderTexture.draw(0, 140);
		
		Graphics2D::SetTexture(1, renderTexture);
		{
			ScopedCustomShader2D shader(ps);
			windmill.draw(480, 140);
		}
	}
}
	}
}

//
// = アドバイス =
// アプリケーションをビルドして実行するたびにファイルアクセス許可のダイアログが表示されるのを避けたい場合、
// プロジェクトのフォルダを ユーザ/(ユーザ名)/アプリケーション/ などに移動させると良いです。
// Web カメラ、マイク使用時の許可ダイアログは消せません。
//
// チュートリアル
// https://siv3d.github.io/ja-jp/tutorial/tutorial/
//
// Tutorial
// https://siv3d.github.io/tutorial/tutorial/
//
// Siv3D コミュニティへの参加（Discord などで気軽に質問や交流, 最新情報の入手ができます）
// https://siv3d.github.io/ja-jp/community/community/
//
// Siv3D User Community
// https://siv3d.github.io/community/community/
//
// 新機能の提案やバグの報告 | Feedback
// https://siv3d.github.io/ja-jp/develop/report/
//
// Sponsoring Siv3D
// https://github.com/sponsors/Reputeless
//
<MSG> Merge pull request #349 from Siv3D/winmac_develop

Winmac develop
<DFF> @@ -1,34 +1,56 @@
 # include <Siv3D.hpp> // OpenSiv3D v0.4.1
 
+// 定数バッファ (PS_1)
+struct GameOfLife
+{
+	Float2 pixelSize;
+	Float2 _unused = {};
+};
+
 void Main()
 {
-	Window::Resize(960, 600);
+	// ウィンドウを 1280x720 にリサイズ
+	Window::Resize(1280, 720);
+	
+	// セルの数 (1280x720)
+	constexpr Size FieldSize(1280, 720);
+	
+	// ライフゲーム用のピクセルシェーダ
+	// シェーダファイルの拡張子は、Windows では hlsl, macOS/Linux では frag を選択
+	// {} 内は定数バッファの名前と、対応する定数インデックス
+	const PixelShader ps(U"example/shader/game_of_life" SIV3D_SELECT_SHADER(U".hlsl", U".frag"),
+						 { { U"PSConstants2D", 0 }, { U"GameOfLife", 1 } });
+	
+	// 定数バッファ
+	const ConstantBuffer<GameOfLife> cb({ Float2(1.0f, 1.0f) / FieldSize });
+	
+	// レンダーテクスチャ 1
+	RenderTexture rt0(Image(FieldSize, Arg::generator = [](){ return Color(RandomBool() * 255); }));
+	
+	// レンダーテクスチャ 2
+	RenderTexture rt1(FieldSize, ColorF(0.0));
 	
-	Scene::SetBackground(ColorF(0.8, 0.9, 1.0));
-	const Texture emoji(Emoji::CreateSilhouetteImage(U"🍎"));
-	const Texture windmill(U"example/windmill.png");
-	const PixelShader ps(U"example/shader/multiple_texture.frag",
-						 {{ U"PSConstants2D", 1 }});
-	RenderTexture renderTexture(480, 320);
-
 	while (System::Update())
 	{
-		renderTexture.clear(ColorF(1.0, 0.0));
 		{
-			BlendState blend;
-			blend.srcAlpha = Blend::One;
-			ScopedRenderStates2D states(blend);
-			ScopedRenderTarget2D target(renderTexture);
-			emoji.scaled(2).rotated(Scene::Time() * 60_deg).drawAt(renderTexture.size() / 2);
+			// テクスチャフィルタなし
+			ScopedRenderStates2D sampler(SamplerState::ClampNearest);
+			
+			// 現在の状態を画面に描く
+			rt0.draw(ColorF(0.0, 1.0, 0.0));
+			
+			{
+				// ライフゲーム用のシェーダ
+				Graphics2D::SetConstantBuffer(ShaderStage::Pixel, 1, cb);
+				ScopedCustomShader2D shader(ps);
+				
+				// 更新後の状態を描く rt1 に描く
+				ScopedRenderTarget2D target(rt1);
+				rt0.draw();
+			}
 		}
 		
-		Rect(0, 140, 480, 320).draw(Palette::Black).movedBy(480, 0).draw(Palette::White);
-		renderTexture.draw(0, 140);
-		
-		Graphics2D::SetTexture(1, renderTexture);
-		{
-			ScopedCustomShader2D shader(ps);
-			windmill.draw(480, 140);
-		}
+		// rt0 と rt1 を入れ替える
+		std::swap(rt0, rt1);
 	}
 }

{'addition_count': 44, 'commit_subject': 'Merge pull request #349 from Siv3D/winmac_develop', 'deletion_count': 22, 'file_extension': '.cpp', 'lang': 'cpp', 'license': 'mit', 'repo_name': 'Siv3D/OpenSiv3D'}