Преглед изворни кода

Simplified shadowmaps-simple example.

Branimir Karadžić пре 12 година
родитељ
комит
70796a4f41
1 измењених фајлова са 87 додато и 88 уклоњено
  1. 87 88
      examples/15-shadowmaps-simple/shadowmaps_simple.cpp

+ 87 - 88
examples/15-shadowmaps-simple/shadowmaps_simple.cpp

@@ -16,7 +16,10 @@
 #include "fpumath.h"
 
 #define RENDER_SHADOW_PASS_ID 0
+#define RENDER_SHADOW_PASS_BIT (1<<RENDER_SHADOW_PASS_ID)
+
 #define RENDER_SCENE_PASS_ID  1
+#define RENDER_SCENE_PASS_BIT (1<<RENDER_SCENE_PASS_ID)
 
 uint32_t packUint32(uint8_t _x, uint8_t _y, uint8_t _z, uint8_t _w)
 {
@@ -382,6 +385,33 @@ struct Mesh
 		}
 	}
 
+	void submitShadow(uint8_t _view, float* _mtx, bgfx::ProgramHandle _program)
+	{
+		for (GroupArray::const_iterator it = m_groups.begin(), itEnd = m_groups.end(); it != itEnd; ++it)
+		{
+			const Group& group = *it;
+
+			// Set model matrix for rendering.
+			bgfx::setTransform(_mtx);
+			bgfx::setProgram(_program);
+			bgfx::setIndexBuffer(group.m_ibh);
+			bgfx::setVertexBuffer(group.m_vbh);
+
+			// Set render states.
+			bgfx::setState(0
+				|BGFX_STATE_RGB_WRITE
+				|BGFX_STATE_ALPHA_WRITE
+				|BGFX_STATE_DEPTH_WRITE
+				|BGFX_STATE_DEPTH_TEST_LESS
+				|BGFX_STATE_CULL_CCW
+				|BGFX_STATE_MSAA
+				);
+
+			// Submit primitive for rendering.
+			bgfx::submit(_view);
+		}
+	}
+
 	bgfx::VertexDecl m_decl;
 	typedef std::vector<Group> GroupArray;
 	GroupArray m_groups;
@@ -512,54 +542,30 @@ int _main_(int /*_argc*/, char** /*_argv*/)
 		// Setup instance matrices.
 		float mtxFloor[16];
 		mtxScaleRotateTranslate(mtxFloor
-			, 30.0f //scaleX
-			, 30.0f //scaleY
-			, 30.0f //scaleZ
-			, 0.0f  //rotX
-			, 0.0f  //rotY
-			, 0.0f  //rotZ
-			, 0.0f  //translateX
-			, 0.0f  //translateY
-			, 0.0f  //translateZ
+			, 30.0f, 30.0f, 30.0f
+			, 0.0f, 0.0f, 0.0f
+			, 0.0f, 0.0f, 0.0f
 			);
 
 		float mtxBunny[16];
 		mtxScaleRotateTranslate(mtxBunny
-			, 5.0f
-			, 5.0f
-			, 5.0f
-			, 0.0f
-			, float(M_PI) - timeAccumulatorScene
-			, 0.0f
-			, 15.0f
-			, 5.0f
-			, 0.0f
+			, 5.0f, 5.0f, 5.0f
+			, 0.0f, float(M_PI) - timeAccumulatorScene, 0.0f
+			, 15.0f, 5.0f, 0.0f
 			);
 
 		float mtxHollowcube[16];
 		mtxScaleRotateTranslate(mtxHollowcube
-			, 2.5f
-			, 2.5f
-			, 2.5f
-			, 0.0f
-			, 1.56f - timeAccumulatorScene
-			, 0.0f
-			, 0.0f
-			, 10.0f
-			, 0.0f
+			, 2.5f, 2.5f, 2.5f
+			, 0.0f, 1.56f - timeAccumulatorScene, 0.0f
+			, 0.0f, 10.0f, 0.0f
 			);
 
 		float mtxCube[16];
 		mtxScaleRotateTranslate(mtxCube
-			, 2.5f
-			, 2.5f
-			, 2.5f
-			, 0.0f
-			, 1.56f - timeAccumulatorScene
-			, 0.0f
-			, -15.0f
-			, 5.0f
-			, 0.0f
+			, 2.5f, 2.5f, 2.5f
+			, 0.0f, 1.56f - timeAccumulatorScene, 0.0f
+			, -15.0f, 5.0f, 0.0f
 			);
 
 		// Define matrices.
@@ -584,66 +590,59 @@ int _main_(int /*_argc*/, char** /*_argv*/)
 		mtxOrtho(lightProj, -area, area, -area, area, -100.0f, 100.0f);
 
 		bgfx::setViewRect(RENDER_SHADOW_PASS_ID, 0, 0, shadowMapSize, shadowMapSize);
-		bgfx::setViewRect(RENDER_SCENE_PASS_ID, 0, 0, width, height);
-
+		bgfx::setViewFrameBuffer(RENDER_SHADOW_PASS_ID, s_shadowMapFB);
 		bgfx::setViewTransform(RENDER_SHADOW_PASS_ID, lightView, lightProj);
-		bgfx::setViewTransform(RENDER_SCENE_PASS_ID, view, proj);
 
-		bgfx::setViewFrameBuffer(RENDER_SHADOW_PASS_ID, s_shadowMapFB);
+		bgfx::setViewRect(RENDER_SCENE_PASS_ID, 0, 0, width, height);
+		bgfx::setViewTransform(RENDER_SCENE_PASS_ID, view, proj);
 
 		// Clear backbuffer and shadowmap framebuffer at beginning.
-		bgfx::setViewClearMask(0x3, BGFX_CLEAR_COLOR_BIT | BGFX_CLEAR_DEPTH_BIT, 0x303030ff, 1.0f, 0);
-		bgfx::submitMask(0x3);
+		bgfx::setViewClearMask(RENDER_SHADOW_PASS_BIT|RENDER_SCENE_PASS_BIT
+			, BGFX_CLEAR_COLOR_BIT | BGFX_CLEAR_DEPTH_BIT
+			, 0x303030ff, 1.0f, 0
+			);
+		bgfx::submitMask(RENDER_SHADOW_PASS_BIT|RENDER_SCENE_PASS_BIT);
 
 		// Render.
+		float mtxShadow[16];
+		float lightMtx[16];
 
-		{ // Craft shadow map.
-
-			hplaneMesh.submit(RENDER_SHADOW_PASS_ID, mtxFloor, progPackDepth);
-			bunnyMesh.submit(RENDER_SHADOW_PASS_ID, mtxBunny, progPackDepth);
-			hollowcubeMesh.submit(RENDER_SHADOW_PASS_ID, mtxHollowcube, progPackDepth);
-			cubeMesh.submit(RENDER_SHADOW_PASS_ID, mtxCube, progPackDepth);
-		}
-
-		{ // Draw Scene.
-
-			float mtxShadow[16]; //lightviewProjCrop
-			float lightMtx[16];  //modelLightviewProjCrop
-
-			const float s = (s_flipV) ? 1.0f : -1.0f; //sign
+		const float sy = s_flipV ? 0.5f : -0.5f;
+		const float mtxCrop[16] =
+		{
+			0.5f, 0.0f, 0.0f, 0.0f,
+			0.0f,   sy, 0.0f, 0.0f,
+			0.0f, 0.0f, 0.5f, 0.0f,
+			0.5f, 0.5f, 0.5f, 1.0f,
+		};
 
-			const float mtxCrop[16] =
-			{
-				0.5f,   0.0f, 0.0f, 0.0f,
-				0.0f, s*0.5f, 0.0f, 0.0f,
-				0.0f,   0.0f, 0.5f, 0.0f,
-				0.5f,   0.5f, 0.5f, 1.0f,
-			};
-
-			float mtxTmp[16];
-			mtxMul(mtxTmp, lightProj, mtxCrop);
-			mtxMul(mtxShadow, lightView, mtxTmp);
-
-			// Floor.
-			mtxMul(lightMtx, mtxFloor, mtxShadow);
-			bgfx::setUniform(u_lightMtx, lightMtx);
-			hplaneMesh.submit(RENDER_SCENE_PASS_ID, mtxFloor, progDraw);
-
-			// Bunny.
-			mtxMul(lightMtx, mtxBunny, mtxShadow);
-			bgfx::setUniform(u_lightMtx, lightMtx);
-			bunnyMesh.submit(RENDER_SCENE_PASS_ID, mtxBunny, progDraw);
-
-			// Hollow cube.
-			mtxMul(lightMtx, mtxHollowcube, mtxShadow);
-			bgfx::setUniform(u_lightMtx, lightMtx);
-			hollowcubeMesh.submit(RENDER_SCENE_PASS_ID, mtxHollowcube, progDraw);
-
-			// Cube.
-			mtxMul(lightMtx, mtxCube, mtxShadow);
-			bgfx::setUniform(u_lightMtx, lightMtx);
-			cubeMesh.submit(RENDER_SCENE_PASS_ID, mtxCube, progDraw);
-		}
+		float mtxTmp[16];
+		mtxMul(mtxTmp, lightProj, mtxCrop);
+		mtxMul(mtxShadow, lightView, mtxTmp);
+
+		// Floor.
+		mtxMul(lightMtx, mtxFloor, mtxShadow);
+		bgfx::setUniform(u_lightMtx, lightMtx);
+		hplaneMesh.submit(RENDER_SCENE_PASS_ID, mtxFloor, progDraw);
+		hplaneMesh.submitShadow(RENDER_SHADOW_PASS_ID, mtxFloor, progPackDepth);
+
+		// Bunny.
+		mtxMul(lightMtx, mtxBunny, mtxShadow);
+		bgfx::setUniform(u_lightMtx, lightMtx);
+		bunnyMesh.submit(RENDER_SCENE_PASS_ID, mtxBunny, progDraw);
+		bunnyMesh.submitShadow(RENDER_SHADOW_PASS_ID, mtxBunny, progPackDepth);
+
+		// Hollow cube.
+		mtxMul(lightMtx, mtxHollowcube, mtxShadow);
+		bgfx::setUniform(u_lightMtx, lightMtx);
+		hollowcubeMesh.submit(RENDER_SCENE_PASS_ID, mtxHollowcube, progDraw);
+		hollowcubeMesh.submitShadow(RENDER_SHADOW_PASS_ID, mtxHollowcube, progPackDepth);
+
+		// Cube.
+		mtxMul(lightMtx, mtxCube, mtxShadow);
+		bgfx::setUniform(u_lightMtx, lightMtx);
+		cubeMesh.submit(RENDER_SCENE_PASS_ID, mtxCube, progDraw);
+		cubeMesh.submitShadow(RENDER_SHADOW_PASS_ID, mtxCube, progPackDepth);
 
 		// Advance to next frame. Rendering thread will be kicked to
 		// process submitted rendering primitives.