2
0
Эх сурвалжийг харах

Fixed DX11 texture filtering. Added anisotropic texture flag.

bkaradzic 13 жил өмнө
parent
commit
cae8789603

+ 4 - 2
include/bgfx.h

@@ -177,11 +177,13 @@
 #define BGFX_TEXTURE_W_SHIFT            8
 #define BGFX_TEXTURE_W_MASK             UINT32_C(0x00000300)
 #define BGFX_TEXTURE_MIN_POINT          UINT32_C(0x00001000)
+#define BGFX_TEXTURE_MIN_ANISOTROPIC    UINT32_C(0x00002000)
 #define BGFX_TEXTURE_MIN_SHIFT          12
-#define BGFX_TEXTURE_MIN_MASK           UINT32_C(0x00001000)
+#define BGFX_TEXTURE_MIN_MASK           UINT32_C(0x00003000)
 #define BGFX_TEXTURE_MAG_POINT          UINT32_C(0x00010000)
+#define BGFX_TEXTURE_MAG_ANISOTROPIC    UINT32_C(0x00020000)
 #define BGFX_TEXTURE_MAG_SHIFT          16
-#define BGFX_TEXTURE_MAG_MASK           UINT32_C(0x00010000)
+#define BGFX_TEXTURE_MAG_MASK           UINT32_C(0x00030000)
 #define BGFX_TEXTURE_MIP_POINT          UINT32_C(0x00100000)
 #define BGFX_TEXTURE_MIP_SHIFT          20
 #define BGFX_TEXTURE_MIP_MASK           UINT32_C(0x00100000)

+ 44 - 2
src/renderer_d3d11.cpp

@@ -98,6 +98,42 @@ namespace bgfx
 		D3D11_TEXTURE_ADDRESS_CLAMP,
 	};
 
+	/*
+	 * D3D11_FILTER_MIN_MAG_MIP_POINT               = 0x00,
+	 * D3D11_FILTER_MIN_MAG_POINT_MIP_LINEAR        = 0x01,
+	 * D3D11_FILTER_MIN_POINT_MAG_LINEAR_MIP_POINT  = 0x04,
+	 * D3D11_FILTER_MIN_POINT_MAG_MIP_LINEAR        = 0x05,
+	 * D3D11_FILTER_MIN_LINEAR_MAG_MIP_POINT        = 0x10,
+	 * D3D11_FILTER_MIN_LINEAR_MAG_POINT_MIP_LINEAR = 0x11,
+	 * D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT        = 0x14,
+	 * D3D11_FILTER_MIN_MAG_MIP_LINEAR              = 0x15,
+	 * D3D11_FILTER_ANISOTROPIC                     = 0x55,
+	 *
+	 * According to D3D11_FILTER enum bits for mip, mag and mip are:
+	 * 0x10 // MIN_LINEAR
+	 * 0x04 // MAG_LINEAR
+	 * 0x01 // MIP_LINEAR
+	 */
+
+	static const uint32_t s_textureFilter[3][3] =
+	{
+		{
+			0x10, // min linear
+			0x00, // min point
+			0x55, // anisotopic
+		},
+		{
+			0x04, // mag linear
+			0x00, // mag point
+			0x55, // anisotopic
+		},
+		{
+			0x01, // mip linear
+			0x00, // mip point
+			0x55, // anisotopic
+		},
+	};
+
 	struct TextureFormatInfo
 	{
 		DXGI_FORMAT m_fmt;
@@ -1265,13 +1301,19 @@ namespace bgfx
 
 	void Texture::create(const Memory* _mem, uint32_t _flags)
 	{
-		_flags &= BGFX_TEXTURE_U_MASK|BGFX_TEXTURE_V_MASK|BGFX_TEXTURE_W_MASK;
+		_flags &= BGFX_TEXTURE_MIN_MASK|BGFX_TEXTURE_MAG_MASK|BGFX_TEXTURE_MIP_MASK
+				| BGFX_TEXTURE_U_MASK|BGFX_TEXTURE_V_MASK|BGFX_TEXTURE_W_MASK
+				;
 
 		m_sampler = s_renderCtx.m_samplerStateCache.find(_flags);
 		if (NULL == m_sampler)
 		{
+			uint8_t minFilter = s_textureFilter[0][(_flags&BGFX_TEXTURE_MIN_MASK)>>BGFX_TEXTURE_MIN_SHIFT];
+			uint8_t magFilter = s_textureFilter[1][(_flags&BGFX_TEXTURE_MAG_MASK)>>BGFX_TEXTURE_MAG_SHIFT];
+			uint8_t mipFilter = s_textureFilter[2][(_flags&BGFX_TEXTURE_MIP_MASK)>>BGFX_TEXTURE_MIP_SHIFT];
+
 			D3D11_SAMPLER_DESC desc;
-			desc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
+			desc.Filter = (D3D11_FILTER)(minFilter|magFilter|mipFilter);
 			desc.AddressU = s_textureAddress[(_flags&BGFX_TEXTURE_U_MASK)>>BGFX_TEXTURE_U_SHIFT];
 			desc.AddressV = s_textureAddress[(_flags&BGFX_TEXTURE_V_MASK)>>BGFX_TEXTURE_V_SHIFT];
 			desc.AddressW = s_textureAddress[(_flags&BGFX_TEXTURE_W_MASK)>>BGFX_TEXTURE_W_SHIFT];

+ 1 - 0
src/renderer_gl.cpp

@@ -827,6 +827,7 @@ namespace bgfx
 	{
 		GL_LINEAR,
 		GL_NEAREST,
+		GL_LINEAR,
 	};
 
 	struct TextureFormatInfo