Sfoglia il codice sorgente

GL: Anisotropic texture.

bkaradzic 13 anni fa
parent
commit
d16b930a39
3 ha cambiato i file con 27 aggiunte e 1 eliminazioni
  1. 2 0
      src/glimports.h
  2. 15 1
      src/renderer_gl.cpp
  3. 10 0
      src/renderer_gl.h

+ 2 - 0
src/glimports.h

@@ -18,6 +18,7 @@ GL_IMPORT(false, PFNGLTEXIMAGE2DPROC,                     glTexImage2D);
 GL_IMPORT(false, PFNGLTEXSUBIMAGE2DPROC,                  glTexSubImage2D);
 GL_IMPORT(false, PFNGLTEXSUBIMAGE2DPROC,                  glTexSubImage2D);
 GL_IMPORT(false, PFNGLPIXELSTOREI,                        glPixelStorei);
 GL_IMPORT(false, PFNGLPIXELSTOREI,                        glPixelStorei);
 GL_IMPORT(false, PFNGLTEXPARAMETERIPROC,                  glTexParameteri);
 GL_IMPORT(false, PFNGLTEXPARAMETERIPROC,                  glTexParameteri);
+GL_IMPORT(false, PFNGLTEXPARAMETERFPROC,                  glTexParameterf);
 GL_IMPORT(false, PFNGLBINDTEXTUREPROC,                    glBindTexture);
 GL_IMPORT(false, PFNGLBINDTEXTUREPROC,                    glBindTexture);
 GL_IMPORT(false, PFNGLGENTEXTURESPROC,                    glGenTextures);
 GL_IMPORT(false, PFNGLGENTEXTURESPROC,                    glGenTextures);
 GL_IMPORT(false, PFNGLDELETETEXTURESPROC,                 glDeleteTextures);
 GL_IMPORT(false, PFNGLDELETETEXTURESPROC,                 glDeleteTextures);
@@ -27,6 +28,7 @@ GL_IMPORT(false, PFNGLDISABLEPROC,                        glDisable);
 GL_IMPORT(false, PFNGLVIEWPORTPROC,                       glViewport);
 GL_IMPORT(false, PFNGLVIEWPORTPROC,                       glViewport);
 GL_IMPORT(false, PFNGLDRAWELEMENTSPROC,                   glDrawElements);
 GL_IMPORT(false, PFNGLDRAWELEMENTSPROC,                   glDrawElements);
 GL_IMPORT(false, PFNGLGETINTEGERVPROC,                    glGetIntegerv);
 GL_IMPORT(false, PFNGLGETINTEGERVPROC,                    glGetIntegerv);
+GL_IMPORT(false, PFNGLGETFLOATVPROC,                      glGetFloatv);
 GL_IMPORT(false, PFNGLGETSTRINGPROC,                      glGetString);
 GL_IMPORT(false, PFNGLGETSTRINGPROC,                      glGetString);
 GL_IMPORT(false, PFNGLDRAWARRAYSPROC,                     glDrawArrays);
 GL_IMPORT(false, PFNGLDRAWARRAYSPROC,                     glDrawArrays);
 GL_IMPORT(false, PFNGLBLENDFUNCPROC,                      glBlendFunc);
 GL_IMPORT(false, PFNGLBLENDFUNCPROC,                      glBlendFunc);

+ 15 - 1
src/renderer_gl.cpp

@@ -77,7 +77,8 @@ namespace bgfx
 	struct RendererContext
 	struct RendererContext
 	{
 	{
 		RendererContext()
 		RendererContext()
-			: m_dxtSupport(false)
+			: m_maxAnisotropy(0.0f)
+			, m_dxtSupport(false)
 			, m_programBinarySupport(false)
 			, m_programBinarySupport(false)
 			, m_flip(false)
 			, m_flip(false)
 			, m_postSwapBuffers(NULL)
 			, m_postSwapBuffers(NULL)
@@ -530,6 +531,7 @@ namespace bgfx
 		TextVideoMem m_textVideoMem;
 		TextVideoMem m_textVideoMem;
 
 
 		Resolution m_resolution;
 		Resolution m_resolution;
+		float m_maxAnisotropy;
 		bool m_dxtSupport;
 		bool m_dxtSupport;
 		bool m_programBinarySupport;
 		bool m_programBinarySupport;
 		bool m_flip;
 		bool m_flip;
@@ -615,6 +617,7 @@ namespace bgfx
 	{
 	{
 		enum Enum
 		enum Enum
 		{
 		{
+			EXT_texture_filter_anisotropic,
 			EXT_texture_format_BGRA8888,
 			EXT_texture_format_BGRA8888,
 			EXT_texture_compression_s3tc,
 			EXT_texture_compression_s3tc,
 			EXT_texture_compression_dxt1,
 			EXT_texture_compression_dxt1,
@@ -659,6 +662,7 @@ namespace bgfx
 
 
 	static Extension s_extension[Extension::Count] =
 	static Extension s_extension[Extension::Count] =
 	{
 	{
+		{ "GL_EXT_texture_filter_anisotropic",    false, true },
 		// Nvidia BGRA on Linux bug:
 		// Nvidia BGRA on Linux bug:
 		// https://groups.google.com/a/chromium.org/forum/?fromgroups#!topic/chromium-reviews/yFfbUdyeUCQ
 		// https://groups.google.com/a/chromium.org/forum/?fromgroups#!topic/chromium-reviews/yFfbUdyeUCQ
 		{ "GL_EXT_texture_format_BGRA8888",       false, !BX_PLATFORM_LINUX },
 		{ "GL_EXT_texture_format_BGRA8888",       false, !BX_PLATFORM_LINUX },
@@ -1567,6 +1571,11 @@ namespace bgfx
 		GL_CHECK(glTexParameteri(m_target, GL_TEXTURE_MIN_FILTER, s_textureFilter[(_flags&BGFX_TEXTURE_MIN_MASK)>>BGFX_TEXTURE_MIN_SHIFT]) );
 		GL_CHECK(glTexParameteri(m_target, GL_TEXTURE_MIN_FILTER, s_textureFilter[(_flags&BGFX_TEXTURE_MIN_MASK)>>BGFX_TEXTURE_MIN_SHIFT]) );
 		GL_CHECK(glTexParameteri(m_target, GL_TEXTURE_MAG_FILTER, s_textureFilter[(_flags&BGFX_TEXTURE_MAG_MASK)>>BGFX_TEXTURE_MAG_SHIFT]) );
 		GL_CHECK(glTexParameteri(m_target, GL_TEXTURE_MAG_FILTER, s_textureFilter[(_flags&BGFX_TEXTURE_MAG_MASK)>>BGFX_TEXTURE_MAG_SHIFT]) );
 		GL_CHECK(glTexParameteri(m_target, GL_TEXTURE_MIN_FILTER, 1 < numMips ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR) );
 		GL_CHECK(glTexParameteri(m_target, GL_TEXTURE_MIN_FILTER, 1 < numMips ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR) );
+		if (0 != (_flags & (BGFX_TEXTURE_MIN_ANISOTROPIC|BGFX_TEXTURE_MAG_ANISOTROPIC) ) 
+		&&  0.0f < s_renderCtx.m_maxAnisotropy)
+		{
+			glTexParameterf(m_target, GL_TEXTURE_MAX_ANISOTROPY_EXT, s_renderCtx.m_maxAnisotropy);
+		}
 
 
 		GL_CHECK(glBindTexture(m_target, 0) );
 		GL_CHECK(glBindTexture(m_target, 0) );
 	}
 	}
@@ -2086,6 +2095,11 @@ namespace bgfx
 				|| s_extension[Extension::ARB_get_program_binary].m_supported
 				|| s_extension[Extension::ARB_get_program_binary].m_supported
 				|| s_extension[Extension::OES_get_program_binary].m_supported
 				|| s_extension[Extension::OES_get_program_binary].m_supported
 				;
 				;
+
+			if (s_extension[Extension::EXT_texture_filter_anisotropic].m_supported)
+			{
+				glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &s_renderCtx.m_maxAnisotropy);
+			}
 		}
 		}
 	}
 	}
 
 

+ 10 - 0
src/renderer_gl.h

@@ -119,6 +119,14 @@
 #		define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0
 #		define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0
 #	endif // GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE
 #	endif // GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE
 
 
+#	ifndef GL_TEXTURE_MAX_ANISOTROPY_EXT
+#		define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE
+#	endif // GL_TEXTURE_MAX_ANISOTROPY_EXT
+
+#	ifndef GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT
+#		define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF
+#	endif // GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT
+
 typedef void (*PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
 typedef void (*PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
 
 
 #endif // BGFX_CONFIG_RENDERER_OPENGL
 #endif // BGFX_CONFIG_RENDERER_OPENGL
@@ -150,6 +158,7 @@ typedef void (APIENTRYP PFNGLREADPIXELSPROC) (GLint x, GLint y, GLsizei width, G
 typedef void (APIENTRYP PFNGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
 typedef void (APIENTRYP PFNGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
 typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
 typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
 typedef void (APIENTRYP PFNGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param);
 typedef void (APIENTRYP PFNGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param);
+typedef void (APIENTRYP PFNGLTEXPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat param);
 typedef void (APIENTRYP PFNGLPIXELSTOREI) (GLenum pname, GLint param);
 typedef void (APIENTRYP PFNGLPIXELSTOREI) (GLenum pname, GLint param);
 typedef void (APIENTRYP PFNGLBINDTEXTUREPROC) (GLenum target, GLuint texture);
 typedef void (APIENTRYP PFNGLBINDTEXTUREPROC) (GLenum target, GLuint texture);
 typedef void (APIENTRYP PFNGLGENTEXTURESPROC) (GLsizei n, GLuint *textures);
 typedef void (APIENTRYP PFNGLGENTEXTURESPROC) (GLsizei n, GLuint *textures);
@@ -160,6 +169,7 @@ typedef void (APIENTRYP PFNGLDISABLEPROC) (GLenum cap);
 typedef void (APIENTRYP PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
 typedef void (APIENTRYP PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
 typedef void (APIENTRYP PFNGLDRAWELEMENTSPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
 typedef void (APIENTRYP PFNGLDRAWELEMENTSPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
 typedef void (APIENTRYP PFNGLGETINTEGERVPROC) (GLenum pname, GLint *params);
 typedef void (APIENTRYP PFNGLGETINTEGERVPROC) (GLenum pname, GLint *params);
+typedef void (APIENTRYP PFNGLGETFLOATVPROC) (GLenum pname, GLfloat *params);
 typedef const GLubyte * (APIENTRYP PFNGLGETSTRINGPROC) (GLenum name);
 typedef const GLubyte * (APIENTRYP PFNGLGETSTRINGPROC) (GLenum name);
 typedef void (APIENTRYP PFNGLDRAWARRAYSPROC) (GLenum mode, GLint first, GLsizei count);
 typedef void (APIENTRYP PFNGLDRAWARRAYSPROC) (GLenum mode, GLint first, GLsizei count);
 typedef void (APIENTRYP PFNGLBLENDFUNCPROC) (GLenum sfactor, GLenum dfactor);
 typedef void (APIENTRYP PFNGLBLENDFUNCPROC) (GLenum sfactor, GLenum dfactor);