Kaynağa Gözat

Implement depth test modes for OpenGL/OpenGL|ES renderers

Daniele Bartolini 12 yıl önce
ebeveyn
işleme
61eecca54f

+ 11 - 0
engine/renderers/RenderContext.h

@@ -82,6 +82,17 @@ namespace crown
 #define STATE_BLEND_EQUATION_MASK				0x0000000003000000
 #define STATE_BLEND_EQUATION_SHIFT				24
 
+#define STATE_DEPTH_TEST_NEVER					0x0000000010000000
+#define STATE_DEPTH_TEST_LESS					0x0000000020000000
+#define STATE_DEPTH_TEST_EQUAL					0x0000000030000000
+#define STATE_DEPTH_TEST_LEQUAL					0x0000000040000000
+#define STATE_DEPTH_TEST_GREATER				0x0000000050000000
+#define STATE_DEPTH_TEST_NOTEQUAL				0x0000000060000000
+#define STATE_DEPTH_TEST_GEQUAL					0x0000000070000000
+#define STATE_DEPTH_TEST_ALWAYS					0x0000000080000000
+#define STATE_DEPTH_TEST_MASK					0x00000000F0000000
+#define STATE_DEPTH_TEST_SHIFT					28
+
 #define STATE_BLEND_FUNC(src, dst) (uint64_t(src << 4) | uint64_t(dst))
 
 #define CLEAR_COLOR					0x1

+ 25 - 0
engine/renderers/gl/GLRenderer.cpp

@@ -93,6 +93,20 @@ const GLTextureFormatInfo TEXTURE_FORMAT_TABLE[PixelFormat::COUNT] =
 	{ GL_RGBA, GL_RGBA}
 };
 
+//-----------------------------------------------------------------------------
+const GLenum DEPTH_FUNCTION_TABLE[] = 
+{
+	0, // Unused
+	GL_NEVER,
+	GL_LESS,
+	GL_EQUAL,
+	GL_LEQUAL,
+	GL_GREATER,
+	GL_NOTEQUAL,
+	GL_GEQUAL,
+	GL_ALWAYS
+};
+
 //-----------------------------------------------------------------------------
 const GLenum BLEND_FUNCTION_TABLE[] =
 {
@@ -281,8 +295,19 @@ public:
 					#endif
 					GL_CHECK(glClear(gl_clear));
 				}
+			}
+
+			// Depth test
+			if (flags & STATE_DEPTH_TEST_MASK)
+			{
+				uint32_t depthf = (flags & STATE_DEPTH_TEST_MASK) >> STATE_DEPTH_TEST_SHIFT;
 
 				GL_CHECK(glEnable(GL_DEPTH_TEST));
+				GL_CHECK(glDepthFunc(DEPTH_FUNCTION_TABLE[depthf]));
+			}
+			else
+			{
+				GL_CHECK(glDisable(GL_DEPTH_TEST));
 			}
 
 			// Scissor